C++/Qt音视频通话开发MetaRTC源码解读,音频推流和拉流

本章内容解读MetaRTC开源代码,无任何二次开发,用于学习交流。

MetaRTC是国人开发的开源项目,适用各种场景音视频二次开发,可以去git阅读README,我们使用相对成熟的版本测试: Release v5.0-b4


上一篇介绍了 视频推拉流,音频推拉流类似,需要注意音频的采集和播放是在同一个线程。
音频推流步骤:音频数据采集、编码、发送,分别在三个线程内完成;
音频拉流步骤:音频数据接收、解码、播放,分别在三个线程内完成;
注意,音频和视频数据的接收和发送都在同一个udp线程内完成。

音频推流1,音频数据采集

本例是ubuntu操作系统,音频采集和播放使用ALSA框架实现,分别定义采集snd_pcm_t和播放snd_pcm_t,使用snd_pcm_link做同步,采集和播放是在同一个线程内完成,定义在主类YangAlsaDeviceHandle下;
下图getRenderAudioData拉取接收和解码后的音频数据,alsa_device_write播放,putEchoPlay做3A回音消除
alsa_device_read读取麦克风数据,putEchoBuffer推到音频编码。
在这里插入图片描述

音频推流2,音频数据编码

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

音频推流3,音频数据udp发送

编码后的视频数据传递给YangP2pRtc发送线程,通过udp发送给对方。
在这里插入图片描述

音频拉流1,udp接收音频数据

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

音频拉流2,音频数据解码

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

音频拉流3,音频数据播放

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

猜你喜欢

转载自blog.csdn.net/weixin_40355471/article/details/126879472