使用FFMPEG SDK解碼流數(shù)據(jù)
轉(zhuǎn)載自:http://blog.csdn.net/gwinner/article/details/5462855本文以H264視頻流為例,講解解碼流數(shù)據(jù)的步驟。
為突出重點,本文只專注于討論解碼視頻流數(shù)據(jù),不涉及其它(如開發(fā)環(huán)境的配置等)。如果您需要這方面的信息,請和我聯(lián)系。
- 準備變量
定義AVCodecContext。如果您使用類,可以定義成類成員。我這里定義成全局變量。

定義一個AVFrame,AVFrame描述一個多媒體幀。解碼后的數(shù)據(jù)將被放在其中。

- 初始化解碼器
現(xiàn)在開始初始化您的解碼器。我把整個初始化過程包在了一個函數(shù)里,除非您有更好的主意,我建議您也這么做。函數(shù)長得象這樣:
BOOL H264_Init()
{
…
}
初始化libavcodec,MMPEG要求,這個函數(shù)一定要第一個被調(diào)用:

掛上所有的codec。也許只掛一個H264的codec就行,我沒試過:

得到H264的解碼器:

創(chuàng)建一個AVCodecContext,并用默認值初始化:

更改g_pCodecCtx的一些成員變量的值,您應該從解碼方得到這些變量值:













打開codec。如果打開成功的話,分配AVFrame:







列出完整的初始化解碼庫的代碼:
- 解碼
如果您只要求解成YUV 420I數(shù)據(jù),只需一次調(diào)用就可以了:

這里,nGot用來返回解碼成功與否,avcodec_decode_video調(diào)用完成后,如果nGot不等于0,則表示解碼成功,否則未解出視頻幀。
pSrcData是待解的H264編碼的一段數(shù)據(jù)流,dwDataLen表示該段數(shù)據(jù)流的長度,單位是byte。
解碼后的視頻幀(YUV數(shù)據(jù))被存入g_pavfFrame,g_pavfFrame->data[0]、g_pavfFrame->data[1]、g_pavfFrame->data[2]即是YUV數(shù)據(jù)。下面的示例代碼把YUV數(shù)據(jù)壓在了一塊內(nèi)存里,排列方式為:
YY
YY
U
V
該函數(shù)有返回值:如果解碼成功,則返回本次解碼使用的碼流字節(jié)數(shù),否則返回0。為簡單起見,我這里假設pSrcData只包含一個視頻幀。
同樣,出于模塊化的要求和代碼維護的方便,我把解碼動作也包在了一個函數(shù)里:









下面列出完整的代碼:
- 釋放解碼器
以上其實已經(jīng)完成了本文的任務,但從負責任的角度,要善始善終嘛。
釋放的過程沒什么好說的,一看就明白。同樣,我也把它們包在了一個函數(shù)里:
(抱歉的很,文章本來是用Word寫的,代碼塊是一個個文本框,但貼到這里卻變成了圖片。)