转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos
nginx-rtmp-module的局限性
原生nginx-rtmp-module模块只提供了rtmp、hls、dash服务,国内直播大部分采用http-flv协议,使用原生的nginx-rtmp-module是无法满足的。
http-flv、http-ts实现原理
除了http-flv协议之外个别场景下也许还需要http-ts格式的直播协议,使用原生模块依旧无法实现,我在github上fork的nginx-rtmp-module利用nginx的高效http接口实现了http-flv(alex实现)和http-ts协议。至于原理是将rtmp收来的流按照不同格式分别缓存,当有http客户端请求直播内容时则将相应格式的数据下发。
性能优势
http-flv与rtmp使用相同的gop cache,所以不会发生多余的内存copy,另外h复用nginx原生接口,丝毫不会对nginx的http性能和稳定性产生影响。
http-ts与rtmp使用不同的封装格式,从rtmp(flv)到ts文件不可避免地要进行一次转封装,为了尽量减少内存copy我将ts格式的数据视为与rtmp(flv)数据同级别的数据,然后将其独立缓存。每个播放链接共享同一份ts或flv数据缓存,如此不论有多少播放端连接都不会发生帧数据的内存copy。
http-flv/ts相关配置
http-flv
开启http-flv配置的方式如下面的配置方法:
当location与application的名字不同时,需要其后跟 app=xxx 来把location与application绑定起来。如果location与application的名字相同,则无需app=xxx参数绑定。
rtmp推流地址:rtmp://ip/live0/stream-name
对应的http-flv播放地址:http://ip/live0/stream-name 和 http://ip/flv0/stream-name
rtmp推流地址:rtmp://ip/live1/stream-name
对应的http-flv播放地址:http://ip/live1/stream-name 和 http://ip/flv1/stream-name
通过这个配置你可以实现自定义的location名字,无需跟application名保持一致。
rtmp {
server {
listen 1935;
application live0 {
live on;
}
application live1 {
live on;
}
}
}
http {
server {
listen 80;
location flv0 {
flv_live 1935 app=live0;
}
location flv1 {
flv_live 1935 app=live1;
}
location live0 {
flv_live 1935;
}
location live1 {
flv_live 1935;
}
}
}
http-ts
http-ts的配置方式和http-flv的配置原理完全相同。
rtmp推流地址:rtmp://ip/live0/stream-name
对应的http-ts播放地址:http://ip/live0/stream-name 和 http://ip/ts0/stream-name
rtmp推流地址:rtmp://ip/live1/stream-name
对应的http-ts播放地址:http://ip/live1/stream-name 和 http://ip/ts1/stream-name
rtmp {
server {
listen 1935;
application live0 {
live on;
}
application live1 {
live on;
}
}
}
http {
server {
listen 80;
location ts0 {
ts_live 1935 app=live0;
}
location ts1 {
ts_live 1935 app=live1;
}
location live0 {
ts_live 1935;
}
location live1 {
ts_live 1935;
}
}
}