亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用FFMPEG SDK解碼流數據獲得YUV數據及其大小

系統 2666 0

本文以H264視頻流為例,講解解碼流數據的步驟。

為突出重點,本文只專注于討論解碼視頻流數據,不涉及其它(如開發環境的配置等)。如果您需要這方面的信息,請和我聯系。

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

static AVCodecContext * g_pCodecCtx = NULL;

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

static AVFrame * g_pavfFrame = NULL;

初始化解碼器
現在開始初始化您的解碼器。我把整個初始化過程包在了一個函數里,除非您有更好的主意,我建議您也這么做。函數長得象這樣:

BOOL H264_Init()

{

}

初始化libavcodec,MMPEG要求,這個函數一定要第一個被調用:

avcodec_init();

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

av_register_all();

得到H264的解碼器:

AVCodec * pCodec = avcodec_find_decoder(CODEC_ID_H264);

創建一個AVCodecContext,并用默認值初始化:

g_pCodecCtx = avcodec_alloc_context();

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

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_pCodecCtx->codec_type = CODEC_TYPE_VIDEO;

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

g_pCodecCtx->height = 576;

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

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

{

g_pavfFrame = avcodec_alloc_frame();// Allocate video frame

}

列出完整的初始化解碼庫的代碼:

解碼
如果您只要求解成YUV 420I數據,只需一次調用就可以了:

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

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

pSrcData是待解的H264編碼的一段數據流,dwDataLen表示該段數據流的長度,單位是byte。

解碼后的視頻幀(YUV數據)被存入g_pavfFrame,g_pavfFrame->data[0]、g_pavfFrame->data[1]、g_pavfFrame->data[2]即是YUV數據。下面的示例代碼把YUV數據壓在了一塊內存里,排列方式為:

YY

YY

U

V

該函數有返回值:如果解碼成功,則返回本次解碼使用的碼流字節數,否則返回0。為簡單起見,我這里假設pSrcData只包含一個視頻幀。

同樣,出于模塊化的要求和代碼維護的方便,我把解碼動作也包在了一個函數里:

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

pSrcData – 待解碼數據

dwDataLen – 待解碼數據字節數

pDeData – 用來返回解碼后的YUV數據

pnWidth, pnHeight – 用來返回視頻的長度和寬度

下面列出完整的代碼:

釋放解碼器


以上其實已經完成了本文的任務,但從負責任的角度,要善始善終嘛。

釋放的過程沒什么好說的,一看就明白。同樣,我也把它們包在了一個函數里:

本文來自CSDN博客,轉載請標明出處: http://blog.csdn.net/gwinner/archive/2010/04/08/5462855.aspx

使用FFMPEG SDK解碼流數據獲得YUV數據及其大小


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美一级别 | 欧美亚洲日本国产综合网 | 国产精品第4页 | 国产精品久久久久影院嫩草 | 曰本女人性配视频 | 亚洲精品视频在线观看免费 | 激情五月婷婷网 | 91久久老司机福利精品网 | 亚洲精品国产suv一区88 | 久操久热 | 亚洲国产精品免费视频 | 日韩一级欧美一级毛片在线 | 久草精品在线观看 | 日韩美一区二区三区 | 精品久久成人 | 国产成人久久精品二区三区牛 | 大学生不戴套毛片视频 | 成人免费淫片免费观看 | 亚洲在线久久 | 99久久免费精品 | 亚洲一二三区在线观看 | 一级毛片免费视频网站 | 日韩成人免费在线视频 | 欧美色xxx | 久久精品免费 | 免费99精品国产自在现线观看 | 免费鲁丝片一级在线观看 | 久久在线观看免费视频 | 亚洲国产爱久久全部精品 | 免费观看一区二区 | 久青草国产在线视频_久青草免 | 91精品国产91久久综合 | 成人小视频在线观看 | 9i9精品国产免费久久 | 日本欧美一区二区三区在线观看 | 亚洲免费一级片 | 欧美一区二区三区国产精品 | 国产五月婷婷 | 国产精品亚洲综合一区在线观看 | 精品久久伊人 | 素人巨乳被调教 |