当前位置:网站首页>webrtc代码解读一:音频数据的接收解码播放过程
webrtc代码解读一:音频数据的接收解码播放过程
2022-08-04 05:32:00 【睏哥RTC】
RTP connection创建过程(从下往上调用):
Channel::Channel调用RtpRtcp::CreateRtpRtcp
Channel::Channel 调用RtpReceiver::CreateAudioReceiver (RtpReceiver,这里注册Channel类为RTP包回调处理类)
ChannelProxy::ChannelProxy里调用new voe::Channel
CreateChannelAndProxy里调用new voe::ChannelProxy
AudioReceiveStream::AudioReceiveStream调用CreateChannelAndProxy
call::CreateAudioReceiveStream里new internal::AudioReceiveStream (成员列表里也保存了new出的对象,注意:internal::AudioReceiveStream 继承自webrtc::AudioReceiveStream )
WebRtcVoiceMediaChannel::RecreateAudioReceiveStream里调用: call::CreateAudioReceiveStream; (保存到成员变量:webrtc::AudioReceiveStream* stream_)
WebRtcVoiceMediaChannel构造函数等里调用RecreateAudioReceiveStream
WebRtcVoiceEngine::CreateChannel 里new出WebRtcVoiceMediaChannel对象
ChannelManager::CreateVoiceChannel里调用WebRtcVoiceEngine::CreateChannel
PeerConnection::CreateVoiceChannel里调用ChannelManager::CreateVoiceChannel
PeerConnection::CreateChannels里调用PeerConnection::CreateVoiceChannel
PeerConnection::ApplyLocalDescription里调用PeerConnection::CreateChannels
PeerConnection::SetLocalDescription里调用PeerConnection::ApplyLocalDescription
RTP回调函数注册:
注册SignalReadPacket的回调:
PeerConnection::SetLocalDescription->PeerConnection::ApplyLocalDescription->PeerConnection::PushdownTransportDescription -> JsepTransportController::SetLocalDescription->JsepTransportController::ApplyDescription_n -> JsepTransportController::MaybeCreateJsepTransport->JsepTransportController::CreateDtlsSrtpTransport-> DtlsSrtpTransport::SetDtlsTransports->RtpTransport::SetRtpPacketTransport -> new_packet_transport->SignalReadPacket.connect(this,&RtpTransport::OnReadPacket);
JsepTransportController::MaybeCreateJsepTransport -> JsepTransportController::CreateDtlsTransport -> new cricket::P2PTransportChannel
AllocationSequence::CreateUDPPorts调用UDPPort::Create
AllocationSequence::Init调用rtc::AsyncPacketSocket::connect(this, &AllocationSequence::OnReadPacket)
AllocationSequence::OnReadPacket调用UDPPort::OnReadPacket调用(Connection::OnReadPacket或Port::OnReadPacket)
Connection::OnReadPacket转发到P2PTransportChannel::OnReadPacket
注册SignalPacketReceived的回调:
PeerConnection::CreateVoiceChannel 调用 voice_channel->SetRtpTransport(rtp_transport); 调用BaseChannel::ConnectToRtpTransport 调用 rtp_transport_->SignalPacketReceived.connect(this,
&BaseChannel::OnPacketReceived);
RTP包投递过程:
AsyncUDPSocket::OnReadEvent发出SignalReadPacket事件, RtpTransport::OnReadPacket 处理事件,转发 BaseChannel::OnPacketReceived->BaseChannel::ProcessPacket->WebRtcVoiceMediaChannel::OnPacketReceived -> Call::DeliverPacket->Call::DeliverRtp -> audio_receiver_controller_.OnRtpPacket -> demuxer_.OnRtpPacket -> (sink->OnRtpPacket(packet) 此处sink为addsink添加的ChannelProxy指针) -> ChannelProxy::OnRtpPacket -> Channel::OnRtpPacket->Channel::ReceivePacket-> (rtp_receiver_->IncomingRtpPacket) -> RTPReceiverVideo::ParseRtpPacket ->Channel::OnReceivedPayloadData(rtp模块回调未解码原始帧) -> audio_coding_->IncomingPacket ->receiver_.InsertPacket -> NetEqImpl::InsertPacket -> NetEqImpl::InsertPacketInternal
音频解码:
AudioDeviceWindowsCore::DoRenderThread()->AudioDeviceBuffer::RequestPlayoutData->AudioTransportImpl::NeedMorePlayData->AudioTransportImpl::PullRenderData->AudioMixerImpl::Mix->AudioMixerImpl::GetAudioFromSources->AudioReceiveStream::GetAudioFrameWithInfo(AudioReceiveStream实现了AudioMixer::Source) ->ChannelProxy::GetAudioFrameWithInfo->Channel::GetAudioFrameWithInfo->AudioCodingModuleImpl::PlayoutData10Ms->AcmReceiver::GetAudio->NetEqImpl::GetAudio->NetEqImpl::GetAudioInternal -> NetEqImpl::Decode -> NetEqImpl::DecodeLoop
边栏推荐
猜你喜欢
makefile基础学习
[Copy Siege Lion Log] Flying Pulp Academy Intensive Learning 7-Day Punch Camp-Study Notes
MNIST Handwritten Digit Recognition - Lenet-5's First Commercial Grade Convolutional Neural Network
安装Apache服务时出现的几个问题, AH00369,AH00526,AH00072....
arm-2-基础阶段
arm-3-中断体系结构
No matching function for call to 'RCTBridgeModuleNameForClass'
【c语言】整数的二进制表现形式是什么?
使用JS在浏览器中打印菱形
Tencent and NetEase have taken action one after another. What is the metaverse that is so popular that it is out of the circle?
随机推荐
第三章 标准单元库(下)
Chapter One Introduction
MNIST Handwritten Digit Recognition - From Perceptrons to Convolutional Neural Networks
[开发杂项][调试]debug into kernel
LeetCode_Nov_5th_Week
位段-C语言
file permission management ugo
IDEA创建Servlet步骤
"A minute" Copy siege lion log 】 【 run MindSpore LeNet model
常见的一些排序
CSDN spree -- college round table spree
Question 1000: Input two integers a and b, calculate the sum of a+b, this question is multiple sets of test data
LeetCode_Dec_1st_Week
网络通信与Socket编程概述
Amazon Cloud Technology Build On-Amazon Neptune's Knowledge Graph-Based Recommendation Model Building Experience
Pipe redirection
target has libraries with conflicting names: libcrypto.a and libssl.a.
EL表达式
多线程顺序输出
安装Apache服务时出现的几个问题, AH00369,AH00526,AH00072....