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 的视角,基于抽象的模块及接口,搭建数据处理流水线是这个组件的机制设计,各个模块及接口的具体实现是机制下的