详解流媒体直播配置范例(包括实现加密文件)
0.引言
本文是在前一篇文章基础上,去讲解更多功能的配置。为了能够理解本文,一定要阅读前面几篇文章,下面会给出地址。
(1)手把手搭建FFmpeg的Windows环境
(2)超详细手把手搭建在ubuntu系统的FFmpeg环境
(3)手把手搭建流媒体服务器详细步骤
(4)手把手配置HLS流媒体服务器
(5)超详细搭建多码率测试环境(成为流媒体高手必经之路)
(6)最快系统搭建:Vmware、及常用软件安装
⽬前直播技术以RTMP⽅式已经⾮常成熟,前面一篇文章,也就是第(5)步已经详细讲过了。这篇文章主要就讲解RTMP模块和HTTP模块的一些命令参数和配置方法。关于更多官方文档的配置,我这里给出一个连接,如果以后工作有更多需求,可以参考。地址如下:
SetupNginxonUbuntutoStreamLiveHLSVideo地址:
更多参数说明,详细举例:
学好怎样利用配置文件,可以实现很多流媒体功能,比如录制,回放,切换自适应,加密等,能够帮助我们快速实现一个直播或点播框架。所以这篇文章也是非常重要。
官网主界面如下:
1.配置加密文件
(1)在配置文件的RTMP模块中加入如下配置参数。
在/tmp目录下,先创建目录,执行命令:
mkdirhlskeys
在配置文件中,加入如下配置。
hls_key_path/tmp/hlskeys;
如果配置后,再次启动Nginx,如果出现如下错误,如下提示信息:
nginx:[emerg]thesamepathname"/data/hlskeys"usedin/usr/local/nginx/conf/:178andin/usr/local/nginx/conf/:178
我这里给出解决方案,需要做如下改动:
在官方源码ngx_rtmp_hls_中,路径为nginx-rtmp-module/hls/ngx_rtmp_hls_。如下界面:
源码中的2346和2421,调用了2次,应该删除或注释掉2346的一个,可以解决错误信息,上面错误信息的意思就是使用了相同的路径。作如下改动:
再重新编译Nginx-rtmp-module。再次重启nginx,就不会有这个错误了。这样再把推流,拉流流程跑起来,就可以看到HLS的密钥文件会生成。如下图所示:
2.RTMP模块配置参数说明
rtmpserver:NGINX中的服务模块。
listen:监听端⼝号。
application:在NGINX配置⽂件中创建同⼀个程序块。
timeout:连接超时时间。
ping:测试数据包。
ping_timeout:测试数据包超时时间。
max_streams:最⼤流数量。
ack_window:滑动窗口大小。
chunk_size:分片大小。
max_queue:最大队列个数。
max_message:最大消息数。
buflen:buf消息长度
out_queue
out_cork
3.直播配置
关于直播,有以下一些常见的配置项,如下所示:
(1)live
切换直播模式,即一对多广播。设置参数举例,liveon。
(2)meta
切换发送元数据到客户端。默认为on。设置参数举例,metaoff。
(3)interleave
(4)wait_key
(5)wait_video
(6)publish_notify
发送和给用户。默认为off。设置参数举例,publish_notifyon。
(7)drop_idle_publisher
(8)sync
设置参数举例,sync10ms。
(9)play_restart
使nginx-rtmp能够在发布启动或停止时发送和到每个用户。默认为on。如果关闭的话,那么每个用户就只能在回放的开始和结束时收到这些通知了。设置参数举例,play_restartoff。
idle_streams
4.HLS协议进⾏m3u8实时直播
hls:表示协议。
hls_path:hls路径。
hls_fragment:hls_fragment片段时间,比如设置5s。
hls_playlist_length:HLS播放列表长度,比如设置30s。
hls_sync:设置HLS时间戳同步阈值。默认值为2ms。此功能可防止在从低分辨率RTMP(1KHz)到高分辨率MPEG-TS(90KHz)转换后出现裂纹噪声。
hls_continuous:打开HLS连续模式。在这种模式下,HLS序列号从上次停止的地方开始。老片段被保存(类似于保存历史记录)。默认为关闭。
hls_nested:切换HLS嵌套模式。在此模式下,hls_path为每个流创建一个子目录。播放列表和片段在该子目录中创建。默认为关闭。设置为开启后的测试案例:例如我们当前推流的名称为123456,则会在hls指定目录下面新创建一个以流名称为名字的目录名称,同时在这里我设置了:hls_fragment_namingsystem。如下图所示:
那播放地址:http://xxx/live/123456/
hls_base_url:设置HLS播放列表项目的基本URL。当为空时,这些项目没有前缀,并假定与父播放列表位于相同的位置,或者在使用hls_nested时降低一个级别。此功能适用于主(变式)和从HLS播放列表。它可以让您下载播放列表并在本地播放,因为它包含对子播放列表或片段的完整引用。默认为空。如,http://xxx/hls/
hls_fragment_naming:设置片段命名模式。有以下一些命名模式。如下图所示:
顺序模式:使用递增的整数。
timestamp模式:使用流时间戳。
系统时间模式:使用系统时间。
默认是顺序的。
hls_fragment_naming_granularity:设置hls片段ID的粒度。如果大于零,更改ids以划分所提供的值。默认值为零。
#使用系统时间舍入到500ms作为片段名称
hls_fragment_namingsystem;
hls_fragment_naming_granularity500;
hls_fragment_slicing:
hls_variant
hls_type:设置在X-PLAYLIST-TYPE播放列表指令中指定的HLS播放列表类型。通常由以下2种类型。
live:LiveHLS流通常从当前活动位置播放,该活动位置是几个片段到播放列表的结尾。默认是live。
event:事件HLS流始终从播放列表的开始播放。在事件模式下,确保播放列表长度足以用于整个事件。
hls_keys:启用HLS加密。AES-128方法用于加密整个HLS片段。默认关闭。
hls_key_path:设置保存自动生成的HLS密钥的目录。密钥文件具有使用OpenSSLRAND_bytes()例程创建的.key扩展和伪随机16字节内容。如果目录不存在,它将在运行时创建。默认情况下,hls_path目录用于密钥文件。但是记住,你通常应该限制对密钥文件的访问,这些文件与播放列表和片段分开存储时更容易。
hls_key_url:设置HLS密钥文件条目的URL。当为空时,那些项目没有前缀,并且假设键位于与播放列表相同的位置。默认为空。
hls_fragments_per_key:设置用同一个密钥加密的HLS分片数(这个功能,可以支持点播或直播试看)。零意味着在发布开始时仅创建一个密钥,并且使用此密钥对会话中的所有片段进行加密。默认值为零。
5.录制回放
(1)record
切换录制模式。流可以被记录到flv文件。有如下参数:
off:什么也不录制。
audio:录制音频。
manual:用不自动启动录制,使用控制接口来启动/停止,在单个记录指令中可以有任何兼容的组合键。
(2)record_path
指定录制的flv文件存放目录。如路径为record_path/tmp/rec。
(3)record_suffix
设置录制文件后缀名。默认为'.flv'。如这样设置,record_suffix_。录制后缀可以匹配strftime格式。如下设置:
record_suffix-%d-%b-%y-%
生成如mystream-24-Apr-13-18:23:38.flv的文件。所有支持strftime格式的选项可以在strftimemanpage里进行查找。
(4)record_unique
否添加时间戳到录制文件。否则的话同样的文件在每一次新的录制发生时将被重写。默认为off。如这样设置record_uniqueon;
(5)record_app
切换文件附加模式。当这一指令为开启是,录制时将把新数据附加到老文件,如果老文件丢失的话将重新创建一个。文件中的老数据和新数据没有时间差。默认为off。
如这样设置record_appon。
(6)record_lock
当这一指令开启时,当前录制文件将被fcntl调用锁定。那样可以在其他地方来核实哪个文件正在进行录制。默认为off。如这样设置,record_lockon。
(7)record_max_size
设置录制文件的最大值。如这样设置,record_max_size128K。
(8)record_max_frames
(9)record_interval
在这个指令指定数量的(毫秒)秒之后重启录制。默认为off。设置为0的话意味着录制中无延迟。如果record_unique为off的话所有记录片段会被写到同一个文件。否则(文件名)将附以时间戳以区分不同文件(给定的record_interval要大于1秒)。如这样设置,record_interval1s。record_interval15m。
(10)recorder
创建录制块。可以在单个application中创建多个记录。上文提到的所有录制相关的指令都可以在recorder{}块中进行定义。继承高层次中的所有设置。
(11)record_notify
切换当定义录制启动或停止文件时,发送和状态信息(onStatus)到发布者。状态描述字段保存录制的名字(默认录制的话为空)。默认为off。
6.HTTP动态⾃适应不同带宽的视频
dash
dash_path
dash_fragment
dash_playlist_length
dash_nested
dash_cleanup
MPEG-DASH
(1)play
(2)play_temp_path
在播放之前设置远程存储的VOD文件路径。默认为/tmp。如这样设置,play_temp_path/www。
(3)play_local_path
设置远程VOD文件完全下载之后复制于play_temp_path之后的路径。空值的话禁用此功能。默认为控制。这个功能可以用于缓存远程文件在本地。这一路径应该和play_temp_path处于同一设备。如可以这样设置:
play_local_path/tmp/videos;
play/tmp/videos;
8.拉流转播到其它平台
(1)pull
创建pull中继。流将从远程服务器上拉下来,成为本地可用的。仅当至少有一个播放器正在播放本地流时发生。Url语法:[rtmp://]host[:port][/app[/playpath]]。如果application找不着那么将会使用本地application名。如果找不着playpath那么就是用当前流的名字。支持以下参数:
app:明确application名。
name:捆绑到relay的本地流名字。如果为空或者没有定义,那么将会使用application中的所有本地流。
tcUrl:如果为空的话自动构建。
pageUrl:模拟页面url。
swfUrl:模拟swfurl。
flashVer:模拟flash版本,默认为',1,102,55'。
playPath:远程播放地址。
live:切换直播特殊行为,值:0,1。
start:开始时间。
stop:结束时间。
static:创建静态pull,这样的pull在nginx启动时创建。
如果某参数的值包含空格,那么你应该在整个key=value对周围使用引号,比如:'pageUrl=FAKEPAGEURL'。如这样的常用设置。
pullrtmp:///main/ch?id=12563name=channel_a;
pullrtmp:///another/a?b=1c=dpageUrl=;
pullrtmp:///main/ch?id=12563name=channel_astatic;
(3)push
push的语法和pull一样。不同于pull指令的是push推送发布流到远程服务器。有这样的语法,pushurl[key=value]*。
(4)push_reconnect
在断开连接后,在push重新连接前等待的时间。默认为3秒。如可以这样设置,push_reconnect1s;
(5)session_relay
切换会话relay模式。在这种模式下连接关闭时relay销毁。当设置为off时,流关闭,relay销毁,这样子以后另一个relay可以被创建。默认为off。如可以这样设置,session_relayon。
9.直播状态的消息和状态
(1)on_connect
设置HTTP连接回调。当客户分发连接命令时,一个HTTP请求异步发送,命令处理将被暂停,直到它返回结果代码。当HTTP2XX码(成功状态码)返回时,RTMP会话继续。返回码3XX(重定向状态码)会使RTMP重定向到另一个从HTTP返回头里获取到的application。否则(其他状态码)连接丢弃。
注意:这一指令在application域是不允许的,因为application在连接阶段还是未知。
HTTP请求接收到一些参数。在application/x-www-form-urlencodedMIME类型下使用POST方法。以下参数将被传给调用者:
call=connect。
addr:客户端IP地址。
app:application名。
flashVer:客户端flash版本。
swfUrl:客户端swfurl。
tcUrl:tcUrl。
pageUrl:客户端页面url。
除了上述参数以外,所有显式传递给连接命令的参数也由回调发送。你应该将连接参数和play/publish参数区分开。播放器常常有独特的方式设置连接字符串不同于play/publish流名字。这里是JWPayer是如何设置这些参数的一个示例:
设置如下:
on_connect;
重定向例子:
location/on_connect{if($arg_flashver!="my_secret_flashver"){rewrite^.*$fallback?permanent;}return200;}(2)on_play
设置HTTP播放回调。每次一个客户分发播放命令时,一个HTTP请求异步发送,命令处理会挂起-直到它返回结果码。之后再解析HTTP结果码。结果吗如下:
HTTP2XX返回码的话继续RTMP会话。
HTTP3XX返回码的话重定向RTMP到另一个流,这个流的名字在HTTP返回头的Location获取。如果新流的名字起始于rtmp://然后远程relay会被创建。relay要求IP地址是指定的而不是域名,并且只工作在1.3.10版本以上的nginx。另请参考notify_relay_redirect。
*其他返回码的话RTMP连接丢弃。
重定向例子:
http{location/local_redirect{rewrite^.*$newname?permanent;}location/remote_redirect{streamwillberedirectedto'newname'on_playhttp://localhost:8080/local_redirect;}applicationmyapp2{liveon;requiresnginx=1.3.10on_playhttp://localhost:8080/remote_redirect;}}HTTP请求接收到一些个参数。在application/x-www-form-urlencodedMIME类型下使用POST方法。以下参数会被传送给调用者:
call=play。
addr:客户端IP地址。
app:application名。
flashVer:客户端flash版本。
swfUrl:客户端swfurl。
tcUrl:tcUrl。
pageUrl:客户端页面url。
name:流名。
(3)on_publish
同上面提到的on_play一样,唯一的不同点在于这个指令在发布命令设置回调。不同于远程pull,push在这里是可以。设置语法为,on_publishurl。
(4)on_done
设置播放/发布禁止回调。上述所有适用于此。但这个回调并不检查HTTP状态码。设置语法为,on_doneurl。
(5)on_play_done
等同于on_done的表现,但只适用于播放结束事件。
(6)on_publish_done
等同于on_done的表现,但只适用于发布结束事件。设置语法为on_publish_doneurl。
(7)on_record_done
设置record_done回调。除了普通HTTP回调参数,它接受录制文件路径。设置语法为on_record_doneurl。
(8)on_update
设置update回调。这个回调会在notify_update_timeout期间调用。如果一个请求返回结果不是2XX,连接禁止。这可以用来同步过期的会话。追加time参数,即播放/发布调用后的秒数会被发送给处理程序。设置语法为on_updateurl。
(9)notify_update_timeout
在on_update回调之间的超时设置,默认为30秒。设置参数举例,notify_update_timeout10s。
(10)notify_update_strict
切换on_update回调strict模式,默认为off。当设置为on时,所有连接错误,超时以及HTTP解析错误和空返回会被视为更新失败,并导致连接终止。当设置为off时,只有HTTP返回码不同于2XX时,导致失败。
(11)notify_relay_redirect
使本地流可以重定向为on_play和on_publish远程重定向。新的流名字是RTMPURL,用于远程重定向。默认为off。设置参数举例,notify_relay_redirecton。
(12)notify_method
设置HTTP方法通知。默认是带有application/x-www-form-urlencoded的POST内容类型。在一些情况下GET更好,例如如果你打算在nginx的http{}部分处理调用。在这种情况下你可以使用arg_*变量去访问参数。设置语法为,notify_methodget|post。
10.直播的访问权限控制
(1)allow
允许来自指定地址或者所有地址发布/播放。allow和deny指令的先后顺序可选。设置语法为allow[play|publish]address|subnet|all。设置参数举例,如下:
。。
(2)deny
拒绝来自指定地址或者所有地址发布/播放。设置语法为deny[play|publish]address|subnet|all。设置参数举例,如下:
denypublishall。denyplayall。
(3)exec⼀簇函数(进程往往要调⽤⼀种exec函数以执⾏另⼀个程序)
定义每个流发布时要执行的带有参数的外部命令。发布结束时进程终止。第一个参数应该是二进制可执行文件的完整路径。关于这个进程将会做些什么事没有任何假定。但这一特点在使用ffmpeg进行转码是很有用的。FFmpeg被假定作为客户端连接到nginx-rtmp然后作为发布者输出转换流到nginx-rtmp。类似于$var/${var}形式的替换可以在命令行使用。设置参数如下:
$name:流的名字。
$addr:客户端地址。
$flashver:客户端flash版本。
$swfurl:客户端swfurl。
$tcurl:客户端tcurl。
$pageurl:客户端页面url。
可以在exec指令中定义Shell格式的转向符用于写输出和接收输入。支持如下:
截断输出file。
附加输出file。
重定向描述符类似于12。
输入file。
以下ffmpeg调用将输入流转码为HLS-ready流(H264/AAC)。运行这个示例,FFmpeg须编译为支持libx264libfaac。设置举例如下:
applicationsrc{liveon;execffmpeg-irtmp://localhost/src/$name-vcodeclibx264-vprofilebaseline-g10-s300x200-acodeclibfaac-ar44100-ac1-fflvrtmp://localhost/hls/$name2/var/log/ffmpeg-$;}applicationhls{liveon;hlson;hls_path/tmp/hls;hls_fragment15s;}(4)exec_push
(5)exec_pull
(6)exec_options
(7)exec_static
类似于exec指令,但在nginx启动时将运行定义的命令。因为(启动时)尚无会话上下文,不支持替换。设置举例如下,exec_staticffmpeg-i。
(8)exec_kill_signal
设置进程终止信号。默认为kill(SIGKILL)。你可以定义为数字或者符号名(信号)。设置参数如下:
exec_kill_signalterm。exec_kill_signalusr1。exec_kill_signal3。
(8)respawn
如果打开respawn子进程,进程终止时发布会仍然继续。默认为打开。设置语法为respawnon|off。
(9)respawn_timeout
启动新的子实例之前,设置respawn超时时间。默认为五秒。设置举例为respawn_timeout10s。
(10)exec_publish
指定发布事件触发的带有参数的外部命令。返回码是未解析的。这里可以用exec替换。另外,args变量支持持有查询字符串参数。设置语法为,exec_publishcommandarg*。
(11)exec_play
指定播放事件触发的带有参数的外部命令。返回码是未解析的。替换列表同exec_publish。设置语法为,exec_playcommandarg*。
(12)exec_play_done
指定播放结束事件触发的带有参数的外部命令。返回码是未解析的。替换列表同exec_publish。设置语法格式为exec_play_donecommandarg*。
(13)exec_publish_done
指定发布结束事件触发的带有参数的外部命令。返回码是未解析的。替换列表同exec_publish。设置语法为exec_publish_donecommandarg*。
(14)exec_record_done
指定录制结束时触发的带有参数的外部命令。这里支持exec_publish的替代以及额外的变量path和recorder。设置语法为exec_record_donecommandarg*。
11.其它配置
关于其它配置,也可以参考这篇博客:
(1)access_log
设置访问日志参数。日志默认是开启的。关闭日志可以使用access_logoff指令。默认情况下访问日志和HTTP访问日志logs/放到同一文件。你也可以使用access_log指令将其定义到其他日志文件。第二个参数是可选的。可以根据名字来定义日志格式。请参考log_format指令来获取更多关于格式的详细信息。设置语法为access_logoff|path[format_name]。设置举例如下:
log_formatnew'$remote_addr';access_loglogs/rtmp_;access_loglogs/rtmp_;access_logoff;
(2)log_format
创建指定的日志格式。日志格式看起来很像nginxHTTP日志格式。设置语法为log_formatformat_nameformat。日志格式里支持的几个变量,如下:
connection:连接数。
remote_addr:客户端地址。
app-application:名。
name:上一个流名。
args:上一个流播放/发布参数。
flashver:客户端flash版本。
swfurl:客户端swfurl。
tcurl:客户端tcUrl。
pageurl:客户端页面url。
command:客户端发送的播放/发布命令:NONE、PLAY、PUBLISH、PLAY+PUBLISH。
bytes_sent:发送到客户端的字节数。
bytes_received:从客户端接收到的字节数。
time_local:客户端连接结束的本地时间。
session_time:持续连接的秒数。
session_readable_time:在可读格式下的持续时间。
默认的日志格式叫做combined。这里是这一格式的定义:
$remote_addr[$time_local]$command"$app""$name""$args"-
$bytes_received$bytes_sent"$pageurl""$flashver"($session_readable_time)
Limits
(3)max_connections
rtmp引擎设置最大连接数。默认为off。设置举例如下:max_connections100。
(4)rtmp_stat数据统计
为当前HTTPlocation设置RTMPstatistics处理程序。RTMPstatistics是一个静态的XML文档。可以使用rtmp_stat_stylesheet指令在浏览器中作为XHTML页面查看这个文档。设置举例如下:
http{server{location/stat{rtmp_statall;rtmp_stat_;}location/{root/path/to/stat/xsl/file;}}}(5)rtmp_stat_stylesheet
添加XML样式表,引用到statisticsXML使其可以在浏览器中可视。更多信息请参考rtmp_stat描述和例子。设置语法举例,rtmp_stat_stylesheetpath。
(6)Multi-workerlivestreaming
多线程直播流,多worker直播流是通过推送流到剩余的nginxworker实现。
(7)rtmp_auto_push
切换自动推送(多worker直播流)模式。默认为off。设置语法如下,rtmp_auto_pushon|off。设置参数举例,rtmp_auto_pushon。
(10)rtmp_auto_push_reconnect
当worker被干掉时设置自动推送连接超时时间。默认为100毫秒。设置语法为,rtmp_auto_push_reconnecttimeout。设置参数举例,rtmp_auto_push_reconnect1s。
(11)rtmp_socket_dir
设置用于流推送的UNIX域套接字目录。默认为/tmp。设置参数举例,rtmp_socket_dir/var/sock。
(12)rtmp_control直播Control控制模块
为当前HTTPlocation设置RTMP控制程序。control模块是NGINXHTTP模块,应该放在http{}块之内。设置参数语法为,rtmp_controlall。设置参数举例,如下:
http{server{location/control{rtmp_controlall;}}}重点参考:
12.Nginx-RTMP直播范例
以下列举的是别人博客上推荐的配置文件,贴在这里,一起学习。这些配置参数的含义,上面都有解释。
rtmp{server{listen1935;chunk_size4096;applicationhls{liveon;hlson;hls_path/byDATA/NginxRtmpNRJS/webroot/tt/hls;hls_fragment5s;}⽤来测试applicationANuid901{liveon;保护TS切⽚wait_keyon;每个ts⽂件为5shls_fragment5s;保存m3u8列表⻓度时间,默认是30秒,可考虑三⼩时10800秒hls_playlist_length10800s;连续模式hls_continuouson;access_loglogs/;sfileon;keepalive_timeout0;keepalive_timeout65;gzipon;server{listen80;server_namelocalhost;access_loglogs/;location/{root/byDATA/NginxRtmp/webroot/tt;roothtml;;}redirectservererrorpagestothestaticpage/50_page500502503504/50;location=/50{roothtml;}location~\.php${}location~\.php${fastcgi_:9000;fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name}concurswithnginx'sonelocation~/\.ht{}}13.总结
通过这篇文章的认真学习,再结合前面的文章,然后去实践,相信大家可以搭建出更多常用的功能。本篇文章就分享到这里,希望能帮到大家。
本文地址:https://zufa.porsven.com/427283615173.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
友情链接
评论区