视频播放器开发过程
最近在linux上开发一个播放器,主要是为熟悉视频编解码的过程。
由于疫情影响,被关闭在家里,所以要找点事情干,本人花了20天时间基本完成了一个通用音视频解码播放器。基于ffmpeg、sdl2、qt等开源代码开发,可以播放视频文件,可以播放网络直播内容。仅以此文,记录这段时间的收获。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dcc085a2710673314285a607780b5ff2.png#pic_center)
学习过程
1. 看别人的代码、看帮助;
先下载安装FFMPEG、SDL、QT、VSC等主要工具,每个工具安装都有很多多坑,可能是linux不好用的地方。下载、编译、安装、各种依赖文件、路径、插件、安装源更改,问题数不胜数,要一个一个克服。
另外,开源代码帮助文件有限,所以要不断看其他人克服的坑。
2. 有没有现成做好的?
有,比如ffmpeg的代码,ffplay就是很好的例子,要单独编译也却是麻烦,反正我还没有搞好,因为编译选项、依赖、代码量十分恐怖。ffplay就几千行,makefile也几千行,看看就头皮发麻。
其他简单的100行播放器也有,但是只能入门,没有缓冲、多线程、或版本特别低不在适用。在gitee、github上基本找不到比较好的开源代码。所以学习路难难难!!
开发过程解决的问题
1、理解FFMPEG的播放原理
数据结构、处理流程、主要函数作用、同步方式、与SDL接口、QT使用。
每一个学习下面又会派生很多学习内容:
数据结构:各类context、AVPACKET、AVFRAME、链表、数据格式等
SDL分SDL视频处理和音频处理。曾经为了SDL一个不起眼的samples参数,解决了几天,个人以为sample就是一个缓冲大小,鬼知道他的大小决定了播放输出。
qt学习的时候:又会出现信号槽、qml描述语言、线程、队列。。。。
函数使用:很多指针,指针的指针,data里面数据使用,多种情况复用
2、FFMPEG版本问题
ffmpeg版本变动,以前代码需要改动,有些被废弃,有些函数需要更换,更换的时候,要对数据结构了解,这花了不少时间学。特别是重要数据结构变化,处理流程要跟着变化。
3、关于基本编程方面
主要是多线程,生产消费模型的互斥、信号量使用,使用不好基本上就没有办法开发出高效率的编解码程序,播放过程会断断续续不流畅。我采用了读packet线程,生成audio_packet队列和video_packet队列,采用了读文件线程、解码视频、解码音频三个线程,最后效果还是不错。
最后、是多线程、多个队列缓存导致,程序的关闭控制还是比较麻烦。
4、关于中间问题解决的一些经验
对于不理解的,把程序单独拿出来,单独测试调试。
对于复杂的数据和流程,可以通过增加过程输出、开发小的工具辅助验证。
比如对于线程互锁、队列使用,我就开发例子帮助自己理解。在音频解码遇到问题,后来下载了一个PMC播放工具,反复测试输出数据为什么断断续续。
总之、努力还算得到回报,自己可以用自己开发的视频播放器看视频、监控自己家的摄像头并且记录视频数据。