• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            使用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。如果您使用類,可以定義成類成員。我這里定義成全局變量。

             

            static AVCodecContext * g_pCodecCtx = NULL;

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

            static AVFrame * g_pavfFrame = NULL;


             

            • 初始化解碼器

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

            BOOL H264_Init()

            {

            }

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

            avcodec_init();

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

            av_register_all();

            得到H264的解碼器:

            AVCodec * pCodec = avcodec_find_decoder(CODEC_ID_H264);

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

            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_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

            }

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

            image

            • 解碼

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

             

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

            這里,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。為簡單起見,我這里假設(shè)pSrcData只包含一個視頻幀。

            同樣,出于模塊化的要求和代碼維護的方便,我把解碼動作也包在了一個函數(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 – 用來返回解碼后的YUV數(shù)據(jù)

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

            下面列出完整的代碼:

            image

            • 釋放解碼器

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

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

            image

            (抱歉的很,文章本來是用Word寫的,代碼塊是一個個文本框,但貼到這里卻變成了圖片。) 

            posted on 2013-01-11 00:44 楊粼波 閱讀(1814) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久久久人妻精品一区三寸蜜桃| 久久久久久无码Av成人影院| 色婷婷狠狠久久综合五月| 久久国产精品无| A狠狠久久蜜臀婷色中文网| 国产午夜电影久久| 亚洲国产精品久久久天堂| 999久久久免费国产精品播放| 久久久SS麻豆欧美国产日韩| 久久久久人妻一区精品色| 日韩欧美亚洲综合久久影院Ds| 亚洲中文久久精品无码ww16 | 天天综合久久久网| 久久只有这精品99| 99久久婷婷国产综合精品草原| 99久久精品免费看国产一区二区三区 | 性做久久久久久久久浪潮| 久久精品国产秦先生| 久久亚洲AV无码精品色午夜麻豆| 99久久国产热无码精品免费久久久久| 精品综合久久久久久97| 99热热久久这里只有精品68| 久久国产高潮流白浆免费观看| 久久综合亚洲色HEZYO社区| 久久精品国产72国产精福利| 国产精品毛片久久久久久久| 成人免费网站久久久| 久久九九久精品国产免费直播| 综合久久一区二区三区 | 久久婷婷激情综合色综合俺也去| 天天综合久久一二三区| 久久香蕉国产线看观看猫咪?v| 99久久免费只有精品国产| 91精品观看91久久久久久| 久久精品视频网| 亚洲一区中文字幕久久| 国产精品久久久久久| 久久国产精品99久久久久久老狼| 91精品国产91久久综合| 国产精品久久久久影院色 | 国产精品中文久久久久久久|