Contents

点播或直播系统搭建

前言

由于机缘巧合需要搭建一个点播或直播系统进行HLS流下载测试,说干就干,网上查了一圈,有个大概的框架,就是通过NGINX、RTMP以及FFmpeg这个三个东西实现。

搭建环境

机器的系统为ubuntu18.0。如果只需要HLS点播的话,RTMP是非必须的。

安装NGINX

安装命令如下

1
2
apt-get update    #更新一下软件列表
apt-get install nginx     #安装nginx

安装完成后,nginx不会默认启动的,需要手动启动一下,命令如下:

1
service nginx start

启动后可以通过浏览器访问80或者8080端口来确定nginx是否正常安装。

实现HLS点播

要实现HLS点播则需要将MP4或者其他格式的视频通过ffmpeg切片成若干ts文件和一个m3u8播放列表文件

1
apt-get install ffmpeg      #安装ffmpeg

mp4->m3u8切片

1
ffmpeg -i input.mp4 -c:v libx264 -c:a copy -f hls -hls_list_size 0 output.m3u8

注: FFmpeg转化HLS时附带的指令: -hls_time n : 设置每片的长度,默认值为2,单位秒 -hls_list_size n : 设置播放列表保存的最多条目,设置为0会保存所有分片信息,默认值为5 -hls_wrap n: 设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0 -hls_start_number n : 设置播放列表中sequence number的值,默认值为0 -hls_key_info_file file: 设置加密所用到的加密信息文件路径

加密 基本的切片不安全,为了防盗链那就需要使用AES-128对每一个分片进行加密,最后生成带有加密信息的播放列表m3u8文件

  1. 生成密钥
1
openssl rand 16 hls.key
  1. 生成初始向量
1
openssl rand -hex 16 > hls.iv
  1. 创建keyinfo文件 格式如下:

key URI # 密钥文件的网络访问路径 Key file # 密钥文件的本地路径,最好使用绝对路径,不然会发生错误 IV # 初始向量的值

举个例子:

http://ip:port/demofour/hls.key /home/xxxx/Documents/hls.key 7504092c985e9afc919bde11b0878273

  1. 使用密钥信息文件加密切片
1
2
3
ffmpeg -i input.mp4 -c:v libx264 -c:a copy \
-f hls -hls_list_size 0 -hls_key_info_file hls.keyinfo output.m3u8

把切片后的ts文件和播放列表文件一起放入NGINX的解析目录下(/var/www/html/)

/images/hlsvod_1.png

最后使用PotPlay或者VLC play试试能不能播放,视频播放链接如下:

http://ip:80/demo/demo.m3u8

实现HLS直播

NGINX配合FFmpeg做流媒体服务器的原理是: NGINX通过RTMP模块提供RTMP服务, FFmpeg推送一个RTMP流到NGINX,然后客户端通过访问NGINX来收看实时视频流. HLS也是差不多的原理,只是最终客户端是通过HTTP协议来访问的,但是FFmpeg推送流仍然是RTMP的,具体可以参考链接1。

1.安装NGINX的RTMP插件

1
2
#ubuntu16或以下版本的软件仓库里软件版本不太对,参考链接4进行安装
sudo apt-get install libnginx-mod-rtmp

2.修改nginx.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#在HTTP节点中增加如下子节点
server {
    listen 8080;
    location /hls {
        types {
            application/vnd.apple.mpegurl	m3u8;
            video/mp2t	ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }
}

#新增rtmp节点
rtmp {
	server {
		listen 1945;
		application rtmplive {
			live on;
		}
		
		#HLS stream
		application hls {
			live on;
			hls on;
			hls_path /tmp/hls;
			hls_fragment 5s;
		}
	}
}

3.重启NGINX使以上配置生效

1
service nginx restart

4.推流 可以将本地的视频或者摄像头的视频流推送到RTMP中,也可以在其他的机器上将视频流推送到RTMP中。推送的地址为rtmp://ip:1935/hls/stream

ip可以根据RTMP服务所在的IP设定,端口不指定的话默认就是1935,stream可以是自定义的视频流名字。

尝试使用FFmpeg推送MP4视频流到RTMP服务中

1
2
ffmpeg -re -i xxxx.mp4 -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv \
    rtmp://ip:1935/hls/stream

5.播放测试 使用PotPlay播出测试,确认此时的直播视频流能够正常的观看,播放的地址为 http://ip:8080/hls/stream.m3u8

如果不特别指定端口的话即为8080

参考文档 链接1 链接2 链接3 链接4