C++音视频开发从放弃到入门(基于FFmpeg+OpenCV)
前言
音视频开发一定要学C++吗?答案是肯定的。虽然其它语言也能搞音视频开发,甚至使用起来更简单,但“语言越高级,离真相就越远”,当你的功能需求日益增多,程序的性能需求越来越迫切,你想进一步了解程序实现的细节时,使用其它语言往往会面临“无法解决”的困境,最后不得不使用C++来解决问题,我们何不从一开始就使用C++呢?
FFmpeg及OpenCV是开源、跨平台的音视频开发SDK,搞音视频开发基本都需要用到它。因为C及C++都是跨平台的开发语言,因此,基于C和C++开发的FFmpeg+OpenCV应用代码只需做少量修改就可以从一个平台移植到另一个平台而无需担心性能有所下降,如从PC移植到Android就是如此。下面的应用都是基于这个思想开发的,开发的原则就是用最少的代码实现最核心的功能,方便使用者二次开发,方便跨平台移植。
FFmpeg做音视频开发主要涉及的业务需求有:推流、播流、推播混合等,推流从简单的推摄像头和麦克风到比较复杂的推桌面和混音,播流从简单的播mp4到比较复杂的播rtmp流或rtsp流等,推播混合从一对一音视频通讯到多对多音视频通讯等。由于C及C++的跨平台特性,基本可以实现"Write once to anywhere"的理想。有了FFmpeg为什么还要拉上OpenCV呢?因为OpenCV有图像处理上的优势,而且现在很多人工智能应用都与OpenCV息息相关,将两者结合起来能生发出很多有实际意义的应用。
当然,要搞好这些开发也需要开发者付出艰辛的努力,C和C++的学习成本比其它语言高许多,FFmpeg的移植和高效稳定使用也需要开发者细心调试。笔者在学习过程中,由于C++和FFmpeg实在太难以理解曾无数次放弃又无数次重新拾起来,最后才慢慢入门,因此,本教程名字就叫做《C++音视频开发从放弃到入门》吧。
目录
第一章 播放端的实现
1.配置FFmpeg+OpenCV开发环境
2.用FFmpeg连接rtmp服务器
3.获取并显示视频流
4.获取并播放音频流
第二章 推流端的实现
1.打开摄像头获取图像数据并实现预览功能
2.把图像数据推送到rtmp服务器
3.捕获麦克风数据并推送到rtmp服务器
第三章 一对一视频聊天功能的实现
1.实现一对一音视频聊天功能
2.回声抑制(3A)的实现
第四章 桌面共享功能的实现
1.捕获桌面图像数据并实现预览功能
2.捕获扬声器数据并推送到rtmp服务器
3.实现麦克风与扬声器混音功能
4.实现桌面与摄像头叠加
5.实现桌面与rtsp摄像头叠加
第五章 将工程移植到Android端
1.配置安卓端FFmpeg+OpenCV开发环境
2.实现安卓端rtmp播放器
3.实现安卓端屏幕共享
4.推送手机麦克风及扬声器数据
第七章 PC端与WEB端实现通讯
部分实例
PC端软件:
1.
2.
3.
安卓手机端软件:
1.
2.
3.
