webrtc学习(一)之------关键帧请求

1、由上层设置关键帧请求方式

Conductor::VideoSetStream

 ->ViERTP_RTCPImpl::SetKeyFrameRequestMethod

->ViEChannel::SetKeyFrameRequestMethod

->ModuleRtpRtcpImpl::SetKeyFrameRequestMethod

方式共四种:

kKeyFrameReqNone  = 0,

       kKeyFrameReqFirRtp    = 1,

       kKeyFrameReqPliRtcp   = 2,

  kKeyFrameReqFirRtcp   = 3

 

2、请求关键帧

VideoReceiver::Decode

->VideoReceiver::RequestKeyFrame

->ViEChannel::RequestKeyFrame

其中,在decode里

  if (frame == NULL)

  {

    if (_receiver.NeedkeyFrame())

{

   RequestKeyFrame();

     }

    return VCM_FRAME_NOT_READY;

  }

NeedkeyFrame()定义:

int32_t VCMJitterBuffer::NeedkeyFrame()

{

if (need_key)

{

need_key = 0;

return 1;

}

return 0;

}

need_key=1的情况有如下3种:

if (packet.seqNum > latest_received_sequence_number_ + 1)

if (start_time_ms - latest_recived_time > 500)

if (!frame->Complete())

 

3、RTCP接收及处理关键帧请求

ViENetworkImpl::ReceivedRTCPPacket

->ViEChannel::ReceivedRTCPPacket

->ViEReceiver::ReceivedRTCPPacket

->ViEReceiver::InsertRTCPPacket

->ModuleRtpRtcpImpl::IncomingRtcpPacket

->RTCPReceiver::TriggerCallbacksFromRTCPPacket

->OnReceivedIntraFrameRequest

->EncoderStateFeedback::OnReceivedIntraFrameRequest

->ViEEncoder::OnReceivedIntraFrameRequest

->IntraFrameRequest

->VideoSender::IntraFrameRequest

VideoSender::IntraFrameRequest中,通过维持nextFrameTypes数组

_nextFrameTypes[stream_index] = kVideoFrameKey;

来在编码时,确定下一帧是I帧还是P帧。


------流程中还有一些细节没明白,尤其是关于STL模板库的内容,webrtc中有很多相关代码,后面再看看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值