Nginx安装nginx-http-flv-module模块开启HTTP-FLV直播
使用ffmpeg推流的rtmp协议视频无法在浏览器中播放,因此本文使用Nginx作为一个服务器,将rtmp协议的媒体流转换为http+flv格式
安装Nginx与nginx-http-flv-module
下载nginx-http-flv-module源码
1 | git clone https://github.com/winshining/nginx-http-flv-module.git |
下载nginx源码
1 | wget https://nginx.org/download/nginx-1.24.0.tar.gz |
也可以在Nginx官网查看需要的版本。
安装pcre、zlib、openssl
1 | sudo apt install libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev |
开始编译,需要把/path/to/nginx-http-flv-module
替换为nginx-http-flv-module源码的下载目录,我这里是/home/sun/nginx-http-flv-module
1 | cd nginx-1.24.0/ |
Nginx配置
打开/usr/local/nginx/conf
目录,修改nginx.conf
配置文件。
我这里把http服务器设置为8080,rtmp服务器设为1935,这里需要注意的是,如果要访问http://localhost:8080/stat
来查看Nginx服务器运行情况,需要把nginx-http-flv-module源码目录下的stat.xsl
文件拷贝至/var/www/rtmp/
文件夹。
1 | worker_processes 1; #worker进程的数量 |
推流地址为rtmp://example.com[:port]/appname/streamname
,根据以上配置,本机的地址为:
1 | rtmp://127.0.0.1:1935/myapp/mystream |
拉流地址为http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname
,根据以上配置,本机的地址为:
1 | http://127.0.0.1:8080/live?port=1935&app=myapp&stream=mystream |
推流至Nginx服务器
nginx的使用命令如下:
1 | sudo /usr/local/nginx/sbin/nginx -t #检查配置文件是否正确 |
使用ffmpeg读取摄像头的内容并编码成h264格式并使用rtmp协议推流至nginx服务器中
1 | ~/bin/ffmpeg -input_format mjpeg -video_size 640x480 -f v4l2 -i /dev/video0 -c:v libx264 -tune zerolatency -preset ultrafast -g 1 -f flv rtmp://127.0.0.1:1935/myapp/mystream |
-g 1
表示关键帧间隔为1, -tune zerolatency
表示编码器的参数配置为低延迟做优化,-preset ultrafast
表示降低输出画质以降低cpu利用率、提高编码速度。
这里也可以使用OBS来进行推流,需要注意,此时推流地址为rtmp://127.0.0.1:1935/myapp
,推流码为mystream
。
使用ffplay查看http+flv格式的直播
1 | ~/bin/ffplay "http://127.0.0.1:8080/live?port=1935&app=myapp&stream=mystream" |
经过测试,这样会有2~3秒的延迟,在ffplay命令中添加-fflags nobuffer
选项可以实现1秒左右的延迟
1 | ~/bin/ffplay "http://127.0.0.1:8080/live?port=1935&app=myapp&stream=mystream" -fflags nobuffer |