六、FFmpeg-優化音頻解碼播放流程

一、音頻解碼播放概述

前面我們用SDL處理了音頻流,SDL會啓動一個線程監聽音頻回調函數。本章中,我們仿照音頻的處理方式來處理視頻的顯示。這樣會使得代碼更加模塊化,易於開發維護。到我們對音視頻進行同步時,這種模塊化會使得同步的實現會非常方便。那我們從哪開始呢? 現在主函數處理的事情太多了:事件循環、讀數據包、解碼視頻等。所以我們首先要做的是把這些處理抽離出來:創建一個專門用於解碼數據包的線程,然後根據數據包的類型,把它們寫入音頻或視頻隊列中,再由相應的音頻和視頻線程讀取。

音頻處理線程我們已經實現過了。還剩視頻處理線程,這個線程會比較複雜,因爲我們要自己顯示視頻。我們將會把視頻的顯示放到主循環中,而且要把視頻顯示和事件循環關聯起來,而不是每次循環時顯示視頻。整個思路大致這樣:解碼視頻,把得到的視頻幀存放到另一個隊列裏,然後創建自定義事件(FF_REFRESH_EVENT),並把這個事件添加到事件系統裏。在事件循環裏收到這個事件的時候,就顯示隊列中的下一幀視頻。

大致流程圖如下

詳細完整流程如下

把視頻循環放到事件裏處理,是因爲我們想利用SDL_Delay線程,這樣就可以控制在屏幕上顯示下一幀的確切時間。在下一章中同

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