ffplay是用ffmpeg代码实现的一个播放器,可以播放本地文件,也可以播放网络资源,与vlc播放器功能类似。把ffmpeg环境配好后,在资源所在的目录,打开控制台输入ffplay [资源名字]
即可播放该媒体资源,ffplay源码只有3800多行,C工程,音视频显示渲染是用的SDL库。下载ffmpeg源码后,找到ffplay.c,这既是ffplay播放器的全部代码。我用的是ffmpeg版本 4.2.1的源码。
在视频文件的播过中,一般要涉及到文件读取、解封装、解码、音视频输出、音视频同步等技术。比较完整的流程如下图:
在这个流程中,主要有几个线程:
(1)读线程。读取文件、解封装
(2)音频解码线程。解码音频压缩数据为PCM数据。
(3)视频解码线程。解码视频压缩数据为图像数据。
(4)音频输出线程。基于SDL播放,该线程实际上是SDL的内部线程。
(5)视频输出线程。基于SDL播放,该线程为程序主线程。
由于存在多个线程,所以线程间的数据传递用到了多线程安全的队列,有FrameQueue和Pac