前言
视频接收端流程比较复杂分六章进行介绍
第一是 RTPTransport创建
第二是 VideoChannel与VideoReceiveStream 关联
第三是 视频接收端组包流程 发现有效的帧。
第四是 jitterbuffer 与 PacketBuffer,RtpFrameReferenceFinder,FrameBuffe
第五是 视频接收端解码过程
第六是 视频接受端渲染过程
目录
一 基本概念 Channel,Stream,Track
Channel
Channel 是传输层面的概念,也就是音视频数据最终要交由 channel 传送出去。而 channel 最终会交由socket将数据发送出来。了为解耦 stream与socket,所以增加了channel 的概念
Stream
在 WebRTC中分为媒流(MediaStream)和数据流(DataStream)。对于 MediaStream是一个多条轨的集合,在它里面包括了一个终端的音频转和视频轨
Track
Track(轨), 轨是 WebRTC 中借鉴了其它多媒体相关的概念。轨的特性大家都非常清楚,两条轨是永远不会相交的。轨用在多媒体中,表式的是每条 "轨" 数据都是独立存在的,不会与其它 "轨" 相交。如音频轨,视频轨。
二 AddTransceiver
addTrack()将新的媒体轨道添加到轨道集,该轨道将被传输到另一对等方
AddTransceiver 每个收发器都代表一个双向流,并带有RTCRtpSender和RTCRtpReceiver
一个 track 对应一个 RtpTransceiver
一个 track对应多个Sink,Track就是底层对应上层的轨道
RtpTransceiver 对象列表,负责 Rtp 的收发,音频是视频的是分开的 ,参考下面代码
RtpTransceiver 包含 RtpSenderInternal ( 包含 VideoRtpSender ) 和 RtpReceiverInternal ( 包含 VideoRtpReceiver )
senders_ ---> RtpSenderInternal ( 包含 VideoRtpSender )
receivers_ ---> RtpReceiverInternal ( 包含 VideoRtpReceiver )
channel_ ---> VideoChannel or VoiceChannel ( ./pc/channel.h )
channel_manager_ ---> ChannelManager ( ./pc/channel_manager.h )
三 创建Channel
PeerConnection:: ApplyRemoteDescription 创建远端Channel
PeerConnection::UpdateTransceiversAndDataChannels
PeerConnection::UpdateTransceiverChannel
RtpTransceiver 关联 Channel 对象
RtpTransceiver::SetChannel
SetChannel 的过程就是绑定 MediaChannel 到 sender RtpSenderInternal
和 receiver RtpReceiverInternal 的过程
Transceiver中 VideoRtpSender。通过channel获取Transport的packete
三 创建Transport
1RTPTransportInternal定义
1RTPTransportInternal 为网络rtp以及rtcp传输层的接口
rtp和rtcp数据经该RtpTransportInternal将数据传递到PacketTransportInternal
PacketTransportInternal 为底层网络通信层接口底层调用socket
2创建时机
收到SetLoaclDescription信息号创建jsep_transport
PacketTransportInternal的创建时机是在当通过调用PeerConnection的SetLocalDescription或者SetRemoteDescription的时候创建,也就是握手完成后创建
ApplyDescription_n调用 JsepTransportController::MaybeCreateJsepTransport
jsep_transport
JsepTransportController控制JsepTransport
四 CreteVideoChannel
设置会话协议后,创建VideoChannel与Transport绑定
cricket::VideoChannel* PeerConnection::CreateVideoChannel
Mid获取到RtpTransportInternal实例
video_channel->SetRtpTransport(rtp_transport);
创建baseChannel与rtpTransport的绑定关系,这样受到流或者信息通过baseChannel进行回调通过 BaseChannel::OnRtpPacket下发 recvRtp,recvRtcp的包
当创建AudioChannel的时候也会如VideoChannel建RtpTransportInternal对象并且会将该对象保存到BaseChannel对象当中供后续使用