前言

音视频开发一定要学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息息相关,将两者结合起来能生发出很多有实际意义的应用。

开发工具用的VS2013,因为它在老机器上也能跑的很好。界面用的MFC,选择MFC的原因就是因为它快,比其它任何一种UI框架都快,而且我们的学习重点并不是在UI上。为了美化UI,笔者试了很多UI框架,总之该试的都试过了,包括QT,但就慢那么一点点就成为放弃的理由,MFC自绘反而更容易上手。利用MFC的自绘功能,做个类似QQ的UI也不是什么难事儿,这也是微软多年不更新MFC的原因吧,当然QT设计UI更方便,我们这里基本只关注核心功能的实现,从VS移植到QT甚至Android的时候核心代码基本没太大改变。

当然,要搞好这些开发也需要开发者付出艰辛的努力,C和C++的学习成本比其它语言高许多,FFmpeg的移植和高效稳定使用也需要开发者细心调试。