C++/Qt音视频通话开发MetaRTC源码解读,音频推流和拉流
本章内容解读MetaRTC开源代码,无任何二次开发,用于学习交流。
MetaRTC是国人开发的开源项目,适用各种场景音视频二次开发,可以去git阅读README,我们使用相对成熟的版本测试: Release v5.0-b4。
目录
- 音频推流1,音频数据采集
- 音频推流2,音频数据编码
- 音频推流3,音频数据udp发送
- 音频拉流1,udp接收音频数据
- 音频拉流2,音频数据解码
- 音频拉流3,音频数据播放
上一篇介绍了 视频推拉流,音频推拉流类似,需要注意音频的采集和播放是在同一个线程。
音频推流步骤:音频数据采集、编码、发送,分别在三个线程内完成;
音频拉流步骤:音频数据接收、解码、播放,分别在三个线程内完成;
注意,音频和视频数据的接收和发送都在同一个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拉取播放,和音频采集在同一个线程内处理。
一个小脑袋: 博主很专业,文章写的很不错,学习下
今天努力工作了吗: 请问需要配置环境吗
Tinsanglalala: 下载的那个编译好的库是不是不能直接用啊,我会报错:error: undefined reference to `x264_encoder_close'(类似这样的),问一下大佬怎么解决呀
去往火星: 博主,如果地图放大或者缩小呢,这个时候这种方法对吗
Heronsbill91: 没有api说明阿