FFMPEG4和SDL的视频播放器开发过程


最近在linux上开发一个播放器,主要是为熟悉视频编解码的过程。
由于疫情影响,被关闭在家里,所以要找点事情干,本人花了20天时间基本完成了一个通用音视频解码播放器。基于ffmpeg、sdl2、qt等开源代码开发,可以播放视频文件,可以播放网络直播内容。仅以此文,记录这段时间的收获。
在这里插入图片描述

学习过程

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播放工具,反复测试输出数据为什么断断续续。

总之、努力还算得到回报,自己可以用自己开发的视频播放器看视频、监控自己家的摄像头并且记录视频数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值