zoukankan      html  css  js  c++  java
  • webrtc 视频参数配置

    1、视频编码格式初始配置

         mediaengineinternaldecoderfactory.cc

     

    2、FEC

    Branch65版本  srcmodules tp_rtcpsourceforward_error_correction.cc

    对抗网络丢包:前向纠错(FEC)

    FEC头部为10字节,包含内容如下:
    E flag:扩展位,供将来使用,当前设置为0。
    L flag:指示长偏移掩码是否使用,0表示偏移掩码为16位,1表示为48位。
    P/X/CC/M/PT recovery field:由本FEC包所保护的所有媒体数据包的RTP头部的P/X/CC/M/PT flag位经XOR操作后得到。
    SN base:本FEC包所保护的媒体数据包的RTP报文的序列号最小值。
    TS recovery field: 由本FEC包所保护的所有媒体数据包的RTP头部中的Timestamp字段经XOR操作后得到。
    Length recovery field: 由本FEC包所保护的所有媒体数据包的负载长度(包括CSRC、RTP头部扩展、负载和padding的长度之和,以16位无符号网络序表示)经XOR操作后得到。

     原理:

    3、视频分辨率初始配置

    pcvideocapturertracksource.cc、

     选取的原则是,在kVideoFormats里面找参数与kDefaultFormat默认值最接近的一组参数,作为本端的编码能力。

     4、视频码率

    mediaenginewebrtcmediaengine.cc

    调用  EncoderStreamFactory::CreateEncoderStreams

    BPP指数:每像素位数(BPP)是应用于视频文件中每个像素的平均数据量。通过将数据速率(kbps)除以视频的每秒像素数(像素宽度乘以高度像素乘以每秒帧数)来计算:

    BPP = 数据速率/(分辨率*每秒帧数)

    BPP通常在0.05到0.150之间,具体取决于场景中的运动量。运动越多,BPP应该越高。

    BPP也与分辨率成反比:分辨率越低,在不产生巨大比特率的情况下BPP越高。这是因为与高分辨率视频相比,低分辨率视频中要复制或参考的总像素更少。

    要基于BPP计算比特率的大小,

    比特率 =(分辨率*每秒帧* BPP)/ 1000

    一般bpp=0.11适合大部分编码器和编码标准,可达到比较好的视频效果

    5、帧率最大值 

    理论上编码器的输入帧率小于等于视频采集的帧率。编码器编码的性能+视频采集帧率决定编码器的输入帧率。

    若摄像头的640*480的采集帧率是30fps,若编码器的640*480的编码性能是60fps,那么编码器的输入帧率为640*480 30fps。

    若编码器性能比较差,640*480的编码性能是25fps,那么编码器的输入帧率为640*480 25fps。

    实现这个最低帧率选择的算法是FrameDropper漏斗算法。算法大概原理是,漏斗进口定时将视频采集的帧率送到漏斗队列里面,当编码器性能调度过来,找算法要数据的时候,将漏斗的最新一帧视频送给编码器。

    详细实现参见:VideoStreamEncoder::EncodeTask->Run->OnIncomingFrame

    代码:

    Branch 65:

    webrtcmediaenginewebrtcvideoengine.h

    static constexpr int kDefaultQpMax = 56;
     
    WebRTC在视频编码过程中会进行QP检测,目的是让视频质量维持在可接受范围的前提下,调节整体视频表现,如分辨率、帧率。这里要注意的是,QP检测机制只是利用QP分析结果对分辨率、帧率进行调节,并不对编码QP做直接调整。
     
    srcmediaasemediaconstants.cc
    const int kDefaultVideoMaxFramerate = 60;
     

    6、SRTP

    webrtcsrcwebrtcapipeerconnectioninterface.h

    disable_encryption = true 取消SRTP

    disable_encryption = false 开启SRTP

    配置秘钥 就是 控制dtls的接口

    7、上述帧率码率流程

    在webrtc里面函数实现如下:
    ->VideoStreamEncoder::EncodeVideoFrame
    ->VideoSender::AddVideoFrame----在这个函数中读取全局变量encoder_params_,判断是否需要调整视频参数。
    ->VideoSender::SetEncoderParameters

    ->VCMGenericEncoder::SetEncoderParameters

    8、mtu最大包长

     用RTP/RTCP实现是实时视频数据的传输,要控制数据包的大小,使之不被路由器分片,webrtc默认设置 

    Branch65 代码位置 srcmediaengineconstants.cc

    9、BWE降码率

    BWE模块决定视频通讯中可以发送多大码率视频不会使网络拥塞,防止视频通讯质量下降。

    最新版本webrtc使用trendline算法实现网络拥塞预估,早期版本使用KalmanFilter算法。两种算法都是基于接收端的网络延迟进行码率估计。早期的KalmanFilter算法是在接收端根据网络延时,计算出合适的带宽,通过REMB RTCP报文反馈给发送端,让发送端按照该码率发送视频数据。trendline算法对此进行了优化,在发送端根据网络延时,计算合适的带宽。

    基本思想是:丢包率反映网络拥塞状况。如果丢包率很小或者为0,说明网络状况良好,在不超过预设最大码率的情况下,可以增大发送端码率;反之如果丢包率变大,说明网络状况变差,此时应减少发送端码率。在其它情况下,发送端码率保持不变。

    基于延迟的拥塞控制是通过每组包的到达时间的延迟差(delta delay)的增长趋势来判断网络是否过载,如果过载进行码率下调,如果处于平衡范围维持当前码率,如果是网络承载不饱满进行码率上调。这里有几个关键技术:包组延迟评估(InterArrival)、滤波器趋势判断(TrendlineEstimator)、过载检测(OveruseDetector)和码率调节(AimdRateControl)。

    webrtc具体实现:

    丢包拥塞控制(trendline)

    BaseChannel::ProcessPacket
    ->WebRtcVideoChannel::OnRtcpReceived
    ->Call::DeliverPacket
    ->Call::DeliverRtcp
    ->VideoSendStream::DeliverRtcp
    ->VideoSendStreamImpl::DeliverRtcp
    ->ModuleRtpRtcpImpl::IncomingRtcpPacket
    ->RTCPReceiver::IncomingPacket
    ->RTCPReceiver::TriggerCallbacksFromRtcpPacket
    ->SendSideCongestionController::OnTransportFeedback

    基于延时拥塞控制
    BaseChannel::ProcessPacket
    ->WebRtcVideoChannel::OnRtcpReceived
    ->Call::DeliverPacket
    ->Call::DeliverRtcp
    ->VideoSendStream::DeliverRtcp     
    ->VideoSendStreamImpl::DeliverRtcp
    ->ModuleRtpRtcpImpl::IncomingRtcpPacket
    ->RTCPReceiver::IncomingPacket
    ->RTCPReceiver::TriggerCallbacksFromRtcpPacket
    ->BitrateControllerImpl::RtcpBandwidthObserverImpl::OnReceivedRtcpReceiverReport
    ->BitrateControllerImpl::OnReceivedRtcpReceiverReport
    ->SendSideBandwidthEstimation::UpdateReceiverBlock
    ->SendSideBandwidthEstimation::UpdateEstimate

    10、nack

    webrtc支持RTPFB和PLI FB两种重传方式。

    srcmediaenginewebrtcvideoengine.cc

    视频重传:VideoSendStreamImpl::ConfigureProtection

    音频重传:VCMLossProtectionLogic::SetMethod

    11、视频PT

       也就是RTP包头的PT值 有效荷载类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流的,这样便于客户端进行解析

      srcmediaenginewebrtcvideoengine.cc

      

     12、音频PT

      srcmediaenginewebrtcvoiceengine.cc

      

    13、ICE的参数配置

      全局搜索RTCConfiguration类的实现

       Branch65 在apipeerconnectioninterface.h

      

    something from : 

    https://blog.csdn.net/CrystalShaw/article/details/83413772

    https://blog.csdn.net/CrystalShaw/article/details/80372015

    https://blog.csdn.net/qq_37051858/article/details/111353756

    丢包检测算法:https://blog.csdn.net/tanningzhong/article/details/87278810

  • 相关阅读:
    keepalived高可用+nginx证书代理
    dfs缩略图
    FastDFS分布式图片服务器搭建
    red5视频播放服务器
    压力测试操作流程
    mysql主从库配置读写分离以及备份
    jdk环境
    mysql主从库配置读写分离以及备份
    mysql5.7.26安装
    数据库异地备份(脚本)
  • 原文地址:https://www.cnblogs.com/132818Creator/p/14898627.html
Copyright © 2011-2022 走看看