WebRTC 的音频数据编码及发送控制管线

WebRTC的音频数据处理发送的概念抽象层面的完整流程如下:

AudioDeviceModule 用于控制各个操作系统平台的音频设备,主要用来做音频的采集和播放。webrtc::AudioTransport 是一个适配和胶水模块,它把 AudioDeviceModule 的音频数据采集和 webrtc::AudioProcessing 的音频数据处理及 webrtc::AudioSender/webrtc::AudioSendStream 的音频数据编码和发送控制粘起来,webrtc::AudioTransport 把采集的音频数据送给 webrtc::AudioProcessing 处理,之后再把处理后的数据给到 webrtc::AudioSender/webrtc::AudioSendStream 编码发送出去。webrtc::AudioProcessing 用于做音频数据处理,如降噪、自动增益控制和回声消除等。webrtc::AudioSender/webrtc::AudioSendStream 用于对音频数据做编码,比如 OPUS、AAC 等,RTP 打包和发送控制。webrtc::Transport 也是一个适配和胶水模块,它把 webrtc::AudioSender/webrtc::AudioSendStream 得到的 RTP 和 RTCP 包发送给后面的网络接口模块。cricket::MediaChannel::NetworkInterface 用于实现真正地把 RTP 和 RTCP 包通过底层的网络接口和协议发送,如 UDP 等,ICE 的作用即为创建一个工作良好的网络接口模块实例。

webrtc::AudioTransport 的实现位于 webrtc/audio/audio_transport_impl.h/webrtc/audio/audio_transport_impl.cc。webrtc::Transport 的实现为 cricket::WebRtcVoiceMediaChannel(位于 webrtc/media/engine/webrtc_voice_engine.h)。如果将音频数据处理发送流水线上的适配和胶水模块省掉,音频数据处理发送流水线将可简化为类似下面这样:

----------------------------- --------------------------- --------------------------- -------------------------------------------

| | | | | webrtc::AudioSender/ | | |

| webrtc::AudioDeviceModule | ==> | webrtc::AudioProcessing | ==> | webrtc::AudioSendStream | ==> | cricket::MediaChannel::NetworkInterface |

| | | | | | | |

----------------------------- --------------------------- --------------------------- -------------------------------------------

这里来看下 webrtc::AudioSender/webrtc::AudioSendStream 中音频数据编码,RTP 包打包及发送控制的设计和实现。webrtc::AudioSender/webrtc::AudioSendStream 的实现位于 webrtc/audio/audio_send_stream.h / webrtc/audio/audio_send_stream.cc,相关的类层次结构如下图:

在 RTC 中,音频数据的编码发送不同于 RTMP 之类的推流方案的地方在于,在 RTC 中,音频编码码率需要根据探测到的网络条件,和接收端发回来的 RTCP 包,动态地调整变换;同时,由于没有 TCP 这样的传输质量保障机制,需要根据探测的网络状态,和 RTCP 反馈包,基于 RTP 对传输过程做控制,如 NACK,FEC 等。因而在 RTC 中,音频数据编码发送是一个相当复杂的过程。

webrtc::AudioSendStream 的设计与实现主要可以从两个角度来看,一是配置和控制,二是数据流

对于配置和控制,可以对 webrtc::AudioSendStream 执行的配置和控制主要有如下这些:

配置音频编码的编码器及编码参数,如最大码率、最小码率、payload type、FEC 等;

配置用于把 RTP 发送到网络的 webrtc::Transport 、加密参数及静音控制等;

webrtc::AudioSendStream 的生命周期控制,如启动停止;

设置网络传输上的额外开销大小,及动态更新的分配码率。

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

对于数据流,一是采集处理的音频数据被送进 webrtc::AudioSendStream 以做编码和发送处理;二是网络传回的 RTCP 包,以对编码发送过程产生影响。

传回的 RTCP 包和 webrtc::AudioSendStream 的控制接口,共同构成音频数据编码及发送控制过程的信息来源。

webrtc::AudioSendStream 的实现中,最主要的数据处理流程 —— 音频数据编码、发送过程,及相关模块如下图:

这个图中的箭头表示数据流动的方向,数据在各个模块中处理的先后顺序为自左向右。

webrtc::AudioSendStream 的实现的数据处理流程中,输入数据为 PCM,来自于 webrtc::AudioTransport,输出则为 RTP 包,被送给 webrtc::Transport 发出去。

webrtc::AudioSendStream 的实现内部,数据首先会经过 ACM 模块 来做编码,随后经过编码的音频帧送进 rtp_rtcp 模块 打成 RTP 包,然后 RTP 包被送进 pacing 模块 做平滑发送控制,最后再在 rtp_rtcp 模块 中被给到webrtc::Transport 发出去。

站在 webrtc::AudioSendStream 的视角,基于抽象的模块及接口,搭建数据处理流水线是这个组件的机制设计,各个模块及接口的具体实现是机制下的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值