引言
本文是自己学习利用ffmpeg实现音视频同步播放的总结文档,参考了网上一些博客,同时调试ffplay源码进行理解,站在巨人的肩膀上学习,感谢开源和分享精神。文中粘贴的代码每行都有注释,确保读者能理解所涉函数的每一行代码的意义。
章节
因为ffplay源码阅读起来比较复杂,因此在下面的内容中,我们尽量抓主要矛盾,忽略不太重要的内容。但还是因为音视频同步机制本身就比较复杂,所以最好还是拆成不同的部分讲述,这样看起来也比较清晰。
一、 整体框架和线程模型
ffplay3.4之后运行的线程模型有了一些变化,在3.4之前是依赖SDL_Timer实现视频帧渲染的触发和循环。在3.4版本便不再依赖SDL_Timer,而是使用while循环+改变sleep时间实现视频帧的渲染循环。在2.4之前是在SDL的audio_callback中进行音频解码。在(包含)2.4之后是单独的音频解码线程。不过这些改动区别不大不影响理解音视频同步机制。
本文分析使用的是SDL_Timer来协助触发视频渲染循环,在SDL的audio_callback回调线程中进行音频解码。
下图便是本文代码的运行模型。
关注公众号:QTShared,免费文章,免费获取源码。
二、SDL音频播放机制
SDL播放声音主要是3个API,下面分别讲一下这几个API:
1. SDL_Init(SDL_INIT_AUDIO)</