当前位置:网站首页>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
边栏推荐
- C语言结构体(必须掌握版)
- MNIST Handwritten Digit Recognition - Lenet-5's First Commercial Grade Convolutional Neural Network
- Socket编程详解
- Machine Learning - Processing of Text Labels for Classification Problems (Feature Engineering)
- C语言无符号整型运算
- sbl_init.asm-适合在编辑模式下看
- 第三章 标准单元库(上)
- LeetCode_Nov_4th_Week
- Deep learning, "grain and grass" first--On the way to obtain data sets
- Tencent and NetEase have taken action one after another. What is the metaverse that is so popular that it is out of the circle?
猜你喜欢
安装MySQL的详细步骤
Tencent and NetEase have taken action one after another. What is the metaverse that is so popular that it is out of the circle?
实现高并发服务器(二)
file permission management ugo
动态内存管理-C语言
淘宝分布式文件系统存储(二)
tmux concept and usage
The second official example analysis of the MOOSE platform - about creating a Kernel and solving the convection-diffusion equation
C语言数组的深度分析
LeetCode_Nov_4th_Week
随机推荐
【五一专属】阿里云ECS大测评#五一专属|向所有热爱分享的“技术劳动者”致敬#
理想的生活
[Copy Siege Lion Log] Flying Pulp Academy Intensive Learning 7-Day Punch Camp-Study Notes
arm learning-1-development board
The Unity of ML - agents interpret parameter Settings
Rules.make - suitable for viewing in edit mode
Object.requireNonNull 方法说明
Completely remove MySQL tutorial
arm学习-1-开发板
Miscellaneous [development] [VS Code] remote - SSD retry failed
多线程顺序输出
Cut the hit pro subtitles export of essays
strlen 转义字符
Amazon Cloud Technology Build On-Amazon Neptune's Knowledge Graph-Based Recommendation Model Building Experience
Deep learning, "grain and grass" first--On the way to obtain data sets
动态内存管理-C语言
[English learning][sentence] good sentence
库函数的模拟实现-C语言
基于asp.net的法律援助平台的设计与实现(附项目链接)
2020-03-27