实现无插件、低延迟播放http-flv直播流
支持的播放器:VLC (RTMP & HTTP-FLV)/OBS (RTMP & HTTP-FLV)/JW Player(RTMP)/flv.js(HTTP-FLV).
注意:flv.js只能运行在支持Media Source Extensions的浏览器上。
下载nginx和nginx-http-flv-module,将它们解压到某一路径。nginx的版本应该大于或者等于1.2.6
打开NGINX的源代码路径并执行如下命令,将模块编译进nginx
./configure --add-module=/path/to/nginx-http-flv-module
make
make install
将模块编译为动态模块
如果将模块编译为动态模块,那么nginx的版本号必须大于或者等于1.9.11。
./configure --add-dynamic-module=/path/to/nginx-http-flv-module
make
make install
注意:nginx-http-flv-module包含了nginx-rtmp-module所有的功能,所以不要将nginx-http-flv-module和nginx-rtmp-module一起编译。
更多详情请见:https://github.com/winshining/nginx-http-flv-module/blob/master/README.CN.md
发布指令如下:
ffmpeg -re -i MEDIA_FILE_NAME -c copy -f flv rtmp://example.com[:port]/appname/streamname
参数说明
一些旧版本的FFmpeg不支持选项-c copy
,可以使用选项-vcodec copy -acodec copy
替代。
appname
用于匹配rtmp配置块中的application块。
streamname
可以随意指定,但是不能省略。
RTMP默认端口为1935,如果要使用其他端口,必须指定:port
。
http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname
参数说明
如果使用ffplay命令行方式播放流,那么必须为上述的url加上引号,否则url中的参数会被丢弃(有些不太智能的shell会把"&“解释为"后台运行”)。
如果使用flv.js播放流,那么请保证发布的流被正确编码,因为flv.js只支持H.264编码的视频和AAC/MP3编码的音频。
参数dir
用于匹配http配置块中的location块(更多详情见下文)。
HTTP默认端口为80, 如果使用了其他端口,必须指定:port
。
RTMP默认端口为1935,如果使用了其他端口,必须指定port=xxx
。
参数app
的值(appname)用来匹配application块,但是如果请求的app
出现在多个server块中,并且这些server块有相同的地址和端口配置,那么还需要用匹配主机名的server_name
配置项来区分请求的是哪个application块,否则,将匹配第一个application块。
参数stream
的值(streamname)用来匹配发布的流的名称。
示例
发布的流的名称是mystream
,那么基于HTTP的播放url是:
http://example.com:8080/live?port=1985&app=myapp&stream=mystream
注意
由于一些播放器不支持HTTP块传输, 这种情况下最好在指定了flv_live on;
的location中指定chunked_transfer_encoding off
,否则播放会失败。
rtmp://example.com[:port]/appname/streamname
http://example.com[:port]/dir/streamname.m3u8
http://example.com[:port]/dir/streamname.mpd