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拉取播放,和音频采集在同一个线程内处理。
在这里插入图片描述

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程摘要1 Qt音视频开发实战 是陈超老师用10年以上音视频一线实战开发经验,四年音视频开发教学经验打造的Qt音视频开发课程。2 Qt音视频开发实战以Qt c++开发为中心。所有课程全部围绕Qt音视频开发展开。3 非常适合那些只做Qt开发的工程师来学习,学习更容易一些。学习目标,培养高级Qt音视频开发工程师.4 Qt音视频开发实战适合那些掌握Qt基础开发,初级开发工程师,月薪在20k以下,通过学习,达到更高薪水的Qt高级开发工程师。 课程优势1 老师过去15年+ 音视频,网络通讯,数字图像处理一线实战经验。过去四年积累了丰富的音视频开发教学经验,学员从年薪30w~50w,就职于腾讯,阿里等各大互联网公司。2 老师10多年Qt开发经验,长期大量使用Qt开发项目,国内最早一批使用Qt的程序员。3 QQ 一对一教学指导,阶段性作业案例小项目指导,就业面试指导。 课程内容1 Qt 核心基础加强。对于那些学了很多年Qt开发而不得要领的学员非常友好。2 音视频开发基础。音视频原理,RGB YUV, 音频原理。图像压缩编码,音频压缩编码,H.264压缩,H.264编码原理 I P B SPS PPS解析,   视频存储容器,mp4 , AAC.  Qt音频视频采集,FFmpeg编码,解码,x264编码,AAC编码。mp3编码。格式转换。视频播放器内核。图像渲染。3 OpenGL数字图像处理基础。OpenGL基础,渲染管线,shader编程。滤镜,美颜,后期处理。编写渲染引擎。4 网络socket通讯编程,自定义私有协议。TCP/UDP音视频传输。 学员要求1 熟悉c/c++,掌握Qt基本控件,类基础。2 每天学习两小时,学习周期3~5个月,做完练习,小项目。
Qt/C++是一种开发桌面应用程序的跨平台开发框架,它提供了丰富的工具和类库,能够方便快捷地编写自定义控件源码。 首先,我们需要创建一个继承自QWidget或QFrame的类来实现自定义控件。在这个类中,我们可以重载一些事件处理函数来实现控件的特定功能,比如绘制事件函数paintEvent()、鼠标事件函数mousePressEvent()等等。通过这些函数,我们可以控制控件的外观、响应用户输入等。 在实现自定义控件的外观时,可以利用Qt提供的各种绘图工具和API。例如,可以使用QPainter类来绘制各种形状、图像、文字等,还可以使用QPen和QBrush类来设置绘制的样式和颜色。通过这些工具,我们可以实现各种个性化的外观效果,如圆角、渐变、阴影等。 对于自定义控件的功能实现,可以根据需求使用Qt提供的各种功能模块。比如,使用QTimer类实现定时器功能,使用QMediaPlayer类实现音视频播放功能等等。此外,Qt还提供了一系列的信号和槽机制,可以方便地实现控件之间的交互和通信。 在自定义控件的使用方面,可以通过在其他QWidget中使用该控件的对象的方式来使用它。将自定义控件放入项目中,然后在界面中添加该控件的实例对象,即可展示该控件,并与其交互。也可以通过在UI界面设计软件中将该控件拖拽到需要的位置上,然后使用信号槽机制来实现与其他控件的交互。 总之,Qt/C++编写自定义控件源码需要熟悉Qt的基本概念和API,并结合自身的需求来设计和实现控件的外观和功能。通过合理的设计和编码,可以创建出各种各样的自定义控件,丰富应用程序的界面和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值