基于libopenh264 codec的svc分层流实现方案

OpenH264 http://www.openh264.org/ 是标准的H.264 encoder/decoder. ffmpeg已经集成libopenh264,但不支持svc特性。
openh264 encoder支持svc特性:
1. 时域4层:Temporal scalability up to 4 layers in a dyadic hierarchy
2. 空域4层:Spatial simulcast up to 4 resolutions from a single input
Temporal scalability指的是FPS,定义为:{30,24,16,10};
Spatial simulcast指的是分辨率,定义为:
    int arrHorW[]={1920, 1280, 800, 640 };
    int arrHorH[]={1080, 720, 450, 360 };
通过组合,最多可以组合成16种码流。由软件出16个encoding pipeline来实现。
对于传输,用RTP协议。参考RFC6190: https://datatracker.ietf.org/doc/html/rfc6190#section-1.1.3
不同流用虚连接区分,NALU type上区分layers: dependency_id(DID) + temporal_id(TID) + quality_id(QID).
            +---------------+---------------+---------------+
            |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |R|I|   PRID    |N| DID |  QID  | TID |U|D|O| RR|
            +---------------+---------------+---------------+
svcRtpSvr解析NALU packet。按dependency_id + temporal_id构建16个queue分别进行buffering。audio单独一个buffer。
为了缩短首帧加载时间,需要按dependency_id缓冲一个I-frame。
参考w3c标准(scalabilityMode表),对layers进行编码,共16个layer。
"S0T0", "S0T1", "S0T2", "S0T3" "S1T0", "S1T1", "S1T2", "S1T3"  
"S2T0", "S2T1", "S2T2", "S2T3" "S3T0", "S3T1", "S3T2", "S3T3"
各个不同client的svcPlayer根据网络质量/buffering长度,自行决定要拉哪些layer,主动向svcMediaSvr发出请求。
比如,刚开始播放时,尝试获取3s标清base layer S0T2进行播放,播放流畅的话,就尝试获取S1T2进行叠加图像效果。3s播放仍然流畅,继续获取S2T2和S3T2进行高画质叠加。
player需要不断测试网络带宽,根据网络带宽的80%来计算应该在哪个layer上进行播放为佳。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草根大哥

进军大神程序员路上,谢谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值