本章内容解读MetaRTC开源代码,无任何二次开发,用于学习交流。
MetaRTC是国人开发的开源项目,适用各种场景音视频二次开发,可以去git阅读README,我们使用相对成熟的版本测试: Release v5.0-b4。
本例是ubuntu操作系统,音频采集和播放使用ALSA框架实现,分别定义采集snd_pcm_t和播放snd_pcm_t,使用snd_pcm_link做同步,采集和播放是在同一个线程内完成,定义在主类YangAlsaDeviceHandle下;
下图getRenderAudioData拉取接收和解码后的音频数据,alsa_device_write播放,putEchoPlay做3A回音消除;
alsa_device_read读取麦克风数据,putEchoBuffer推到音频编码。

音频数据buffer经过指针传递(认真读代码即可),传给音频编码线程YangAudioEncoderHandle,支持的编码方式包括opus、speex等,默认使用opus编解码。

编码后的视频数据传递给YangP2pRtc发送线程,通过udp发送给对方。

使用和音频发送同一个udp接收,while循环接收音频数据,通过回调函数g_session_receive处理数据,把接收到的音频数据传递给YangP2pRtc(和上面音频数据发送在同一个类)。

音频数据buffer经过指针传递(认真读代码即可),传给音频编码线程YangAudioDecoderHandles,解码后音频数据推送到m_context->streams.m_playBuffers。

解码后的音频数据buffer传递给YangAudioRenderData::getRenderAudioData,由YangAlsaDeviceHandle::startLoop拉取播放,和音频采集在同一个线程内处理。
