日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

使用FFMPEG SDK解碼流數(shù)據(jù)獲得YUV數(shù)據(jù)及其大小

系統(tǒng) 2822 0

本文以H264視頻流為例,講解解碼流數(shù)據(jù)的步驟。

為突出重點(diǎn),本文只專注于討論解碼視頻流數(shù)據(jù),不涉及其它(如開(kāi)發(fā)環(huán)境的配置等)。如果您需要這方面的信息,請(qǐng)和我聯(lián)系。

準(zhǔn)備變量
定義AVCodecContext。如果您使用類,可以定義成類成員。我這里定義成全局變量。

static AVCodecContext * g_pCodecCtx = NULL;

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

static AVFrame * g_pavfFrame = NULL;

初始化解碼器
現(xiàn)在開(kāi)始初始化您的解碼器。我把整個(gè)初始化過(guò)程包在了一個(gè)函數(shù)里,除非您有更好的主意,我建議您也這么做。函數(shù)長(zhǎng)得象這樣:

BOOL H264_Init()

{

}

初始化libavcodec,MMPEG要求,這個(gè)函數(shù)一定要第一個(gè)被調(diào)用:

avcodec_init();

掛上所有的codec。也許只掛一個(gè)H264的codec就行,我沒(méi)試過(guò):

av_register_all();

得到H264的解碼器:

AVCodec * pCodec = avcodec_find_decoder(CODEC_ID_H264);

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

g_pCodecCtx = avcodec_alloc_context();

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

g_pCodecCtx->time_base.num = 1; //這兩行:一秒鐘25幀

g_pCodecCtx->time_base.den = 25;

g_pCodecCtx->bit_rate = 0; //初始化為0

g_pCodecCtx->frame_number = 1; //每包一個(gè)視頻幀

g_pCodecCtx->codec_type = CODEC_TYPE_VIDEO;

g_pCodecCtx->width = 704; //這兩行:視頻的寬度和高度

g_pCodecCtx->height = 576;

打開(kāi)codec。如果打開(kāi)成功的話,分配AVFrame:

if(avcodec_open(g_pCodecCtx, pCodec) >= 0)

{

g_pavfFrame = avcodec_alloc_frame();// Allocate video frame

}

列出完整的初始化解碼庫(kù)的代碼:

解碼
如果您只要求解成YUV 420I數(shù)據(jù),只需一次調(diào)用就可以了:

avcodec_decode_video(g_pCodecCtx, g_pavfFrame, (int *)&nGot, (unsigned __int8 *)pSrcData, dwDataLen);

這里,nGot用來(lái)返回解碼成功與否,avcodec_decode_video調(diào)用完成后,如果nGot不等于0,則表示解碼成功,否則未解出視頻幀。

pSrcData是待解的H264編碼的一段數(shù)據(jù)流,dwDataLen表示該段數(shù)據(jù)流的長(zhǎng)度,單位是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。為簡(jiǎn)單起見(jiàn),我這里假設(shè)pSrcData只包含一個(gè)視頻幀。

同樣,出于模塊化的要求和代碼維護(hù)的方便,我把解碼動(dòng)作也包在了一個(gè)函數(shù)里:

BOOL H264_Decode(const PBYTE pSrcData, const DWORD dwDataLen, PBYTE pDeData, int * pnWidth, int * pnHeight)

pSrcData – 待解碼數(shù)據(jù)

dwDataLen – 待解碼數(shù)據(jù)字節(jié)數(shù)

pDeData – 用來(lái)返回解碼后的YUV數(shù)據(jù)

pnWidth, pnHeight – 用來(lái)返回視頻的長(zhǎng)度和寬度

下面列出完整的代碼:

釋放解碼器


以上其實(shí)已經(jīng)完成了本文的任務(wù),但從負(fù)責(zé)任的角度,要善始善終嘛。

釋放的過(guò)程沒(méi)什么好說(shuō)的,一看就明白。同樣,我也把它們包在了一個(gè)函數(shù)里:

本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處: http://blog.csdn.net/gwinner/archive/2010/04/08/5462855.aspx

使用FFMPEG SDK解碼流數(shù)據(jù)獲得YUV數(shù)據(jù)及其大小


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 通榆县| 五台县| 泾阳县| 乌什县| 河南省| 无锡市| 湖州市| 盖州市| 长丰县| 华阴市| 绍兴市| 喀喇| 禹州市| 清新县| 呼和浩特市| 新津县| 上饶市| 堆龙德庆县| 渝中区| 江陵县| 利辛县| 迁安市| 射洪县| 新源县| 大邑县| 贵德县| 南华县| 乳源| 新巴尔虎左旗| 阳朔县| 湖南省| 綦江县| 资中县| 绥宁县| 衡阳市| 芜湖市| 龙陵县| 西充县| 兴城市| 宣威市| 望城县|