六、FFmpeg-优化音频解码播放流程

一、音频解码播放概述

前面我们用SDL处理了音频流,SDL会启动一个线程监听音频回调函数。本章中,我们仿照音频的处理方式来处理视频的显示。这样会使得代码更加模块化,易于开发维护。到我们对音视频进行同步时,这种模块化会使得同步的实现会非常方便。那我们从哪开始呢? 现在主函数处理的事情太多了:事件循环、读数据包、解码视频等。所以我们首先要做的是把这些处理抽离出来:创建一个专门用于解码数据包的线程,然后根据数据包的类型,把它们写入音频或视频队列中,再由相应的音频和视频线程读取。

音频处理线程我们已经实现过了。还剩视频处理线程,这个线程会比较复杂,因为我们要自己显示视频。我们将会把视频的显示放到主循环中,而且要把视频显示和事件循环关联起来,而不是每次循环时显示视频。整个思路大致这样:解码视频,把得到的视频帧存放到另一个队列里,然后创建自定义事件(FF_REFRESH_EVENT),并把这个事件添加到事件系统里。在事件循环里收到这个事件的时候,就显示队列中的下一帧视频。

大致流程图如下

详细完整流程如下

把视频循环放到事件里处理,是因为我们想利用SDL_Delay线程,这样就可以控制在屏幕上显示下一帧的确切时间。在下一章中同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章