【FFmpeg解码实战】(5)实现FFmpeg4.3 + SDL2视频播放器(添加独立线程和队列)(C++)

时间:2024-06-01 08:02:38



在前文《【FFmpeg解码实战】(4)实现FFmpeg4.3 + SDL2视频播放器(音频+视频播放)(C++)》 中,
我们实现了音视频播放的demo。

在前文的基础上,本文算是音视频同步从㳀入深道路上的第一站。

先来说下前面demo 的缺点,
从代码可以看出,音视频播放是根据音视频帧打包时的存放顺序来播放的。
即,当源视频是一帧video,一帧Audio 这样间隔存放时,播放是正常的。
但当源视频是同时连续好几帧video 或 连续好几帧audio 一起存放时就出问题了。

如下图这种视频,连续12帧Video,连续17帧Audio,使用前面我们实现的播放器,就会出现,音视频不同步的问题了。
根据解码顺序,它会一会儿播视频,一会儿播音频,就不对了。
【FFmpeg解码实战】(5)实现FFmpeg4.3 + SDL2视频播放器(添加独立线程和队列)(C++)

本文我们先来实现一个队列,主要实现步骤为:

  1. 创建4个队列,分别为:视频解码队列,音频解码队列,视频播放队列,音频播放队列。(各队列大小先默认50 帧)
  2. 创建四个线程,分别为:音频解码线程,视频解码线程,读取源数据paket 线程,音视频播放线程
  3. 在读取源数据paket 线程中,当读取到 一个packet 数据包时,分别送入音频解码队列,或视频解码队列。
  4. 在音频解码线程中,当音频解码队列有数据时,就开始解码。队列没数据则等待。
  5. 在视频解码线程中,当视频解码队列有数据时,就开始解码。队列没数据则等待。
  6. 在音视频播放线程中,先不管pts/dts/timestamp,先实现播放一帧音频,接着播放一帧视频,即保持音/视频音隔播放。
  7. 在主函数中,检测鼠标、按键等动作。

本文链接: 《【FFmpeg解码实战】(5)实现FFmpeg4.3 + SDL2视频播放器(添加独立线程和队列)(C++)
本文VS2019 项目工程文件打包:《》

好,思路确定了,我们根据思路来实现吧。^_^


一、队列 & 线程 - 代码实现


二、读取源数据paket 线程 - 代码实现


三、音频解码线程 - 代码实现


四、视频解码线程 - 代码实现


五、音视频播放线程 - 代码实现


六、主函数监测鼠标按键 - 代码实现


七、完整代码