Nginx-http-flv-module

谷越
2023-12-01

简介

实现无插件、低延迟播放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-FLV方式

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方式

rtmp://example.com[:port]/appname/streamname

HLS方式

http://example.com[:port]/dir/streamname.m3u8

DASH方式

http://example.com[:port]/dir/streamname.mpd
 类似资料: