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