分布式直播系统(六)【基于nginx-rtmp-module实现的最简洁高效http-flv服务】

转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos

目录

  • nginx-rtmp-module的局限性
  • http-flv、http-ts实现原理
    • 性能优势
  • http-flv/ts相关配置
    • http-flv
    • http-ts
  • QQ交流群:697773082

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客户端请求直播内容时则将相应格式的数据下发。

传递
传递
生成帧副本
生成帧副本
传递
传递
rtmp接收器
flv-filter
ts-filter
flv/rtmp gop cache
ts gop cache
各客户端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;
        }
    }
}

QQ交流群:697773082

你可能感兴趣的:(流媒体直播)