【FFmpeg解码实战】(5)实现FFmpeg4.3 + SDL2视频播放器(添加独立线程和队列)(C++)
在前文《【FFmpeg解码实战】(4)实现FFmpeg4.3 + SDL2视频播放器(音频+视频播放)(C++)》 中,
我们实现了音视频播放的demo。
在前文的基础上,本文算是音视频同步从㳀入深道路上的第一站。
先来说下前面demo 的缺点,
从代码可以看出,音视频播放是根据音视频帧打包时的存放顺序来播放的。
即,当源视频是一帧video,一帧Audio 这样间隔存放时,播放是正常的。
但当源视频是同时连续好几帧video 或 连续好几帧audio 一起存放时就出问题了。
如下图这种视频,连续12帧Video,连续17帧Audio,使用前面我们实现的播放器,就会出现,音视频不同步的问题了。
根据解码顺序,它会一会儿播视频,一会儿播音频,就不对了。
本文我们先来实现一个队列,主要实现步骤为:
- 创建4个队列,分别为:视频解码队列,音频解码队列,视频播放队列,音频播放队列。(各队列大小先默认50 帧)
- 创建四个线程,分别为:音频解码线程,视频解码线程,读取源数据paket 线程,音视频播放线程
- 在读取源数据paket 线程中,当读取到 一个packet 数据包时,分别送入音频解码队列,或视频解码队列。
- 在音频解码线程中,当音频解码队列有数据时,就开始解码。队列没数据则等待。
- 在视频解码线程中,当视频解码队列有数据时,就开始解码。队列没数据则等待。
- 在音视频播放线程中,先不管pts/dts/timestamp,先实现播放一帧音频,接着播放一帧视频,即保持音/视频音隔播放。
- 在主函数中,检测鼠标、按键等动作。
本文链接: 《【FFmpeg解码实战】(5)实现FFmpeg4.3 + SDL2视频播放器(添加独立线程和队列)(C++)》
本文VS2019 项目工程文件打包:《》
好,思路确定了,我们根据思路来实现吧。^_^