ffmpeg學(xué)習(xí)(4)——播放器實例
原帖地址: ? ? ??點擊打開鏈接
該播放器解碼的流程用圖的方式可以表示稱如下形式:
SDL顯示YUV圖像的流程圖:
簡單解釋幾句:
SDL_Surface就是使用SDL的時候彈出的那個窗口。在SDL1.x版本中,只可以創(chuàng)建一個SDL_Surface。
SDL_Overlay用于顯示YUV數(shù)據(jù)。一個SDL_Overlay對應(yīng)一幀YUV數(shù)據(jù)。
SDL_Rect用于確定SDL_Overlay顯示的位置。注意:一個SDL_Overlay可以指定多個不同的SDL_Rect,這樣就可以在SDL_Surface不同位置顯示相同的內(nèi)容。
它們的關(guān)系如下圖所示:
下圖舉了個例子,指定了4個SDL_Rect,可以實現(xiàn)4分屏的顯示。
代碼部分已經(jīng)保存到網(wǎng)盤里:
補充問題
補充1:舊版程序有一個小BUG,就是sws_getContext()之后,需要調(diào)用sws_freeContext()。否則長時間運行的話,會出現(xiàn)內(nèi)存泄露的狀況。更新版已經(jīng)修復(fù)。
補充2:有人會疑惑,為什么解碼后的pFrame不直接用于顯示,而是調(diào)用swscale()轉(zhuǎn)換之后進行顯示?
如果不進行轉(zhuǎn)換,而是直接調(diào)用SDL進行顯示的話,會發(fā)現(xiàn)顯示出來的圖像是混亂的。關(guān)鍵問題在于解碼后的pFrame的linesize里存儲的不是圖像的寬度,而是比寬度大一些的一個值。其原因目前還沒有仔細(xì)調(diào)查(大概是出于性能的考慮)。例如分辨率為480x272的圖像,解碼后的視頻的linesize[0]為512,而不是480。以第1行亮度像素(pFrame->data[0])為例,從0-480存儲的是亮度數(shù)據(jù),而從480-512則存儲的是無效的數(shù)據(jù)。因此需要使用swscale()進行轉(zhuǎn)換。轉(zhuǎn)換后去除了無效數(shù)據(jù),linesize[0]變?yōu)?80。就可以正常顯示了。