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

本文以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

}

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

image

解碼
如果您只要求解成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 – 用來返回視頻的長度和寬度

下面列出完整的代碼:

image

釋放解碼器

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

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455570.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于Python3.7和Python3.6中元組類型數據內存存儲問題

關于Python3.7和Python3.6中元組類型數據內存存儲問題 小編最近發現了一個瑕疵 當定義一個元組類型的變量后,若在程序后面再定義一個元組變量,這兩個元組的內容相同,那么在不同的版本中會出現不同的結果 在Python3.6版本中,解釋器將在內存中開辟兩個內存空間分別存儲兩個元組的…

shell 刪除了hdfs 文件_從零開始學大數據(三) Shell操作HDFS文件系統-中

1、格式化[rootmaster sbin]# hdfs namenode -format2、命令hdfs dfsadmin查看(hdfs dfsadmin -report)[rootmaster ~]# hdfs dfsadmin -report安全模式#獲取安全模式狀態[rootmaster ~]# hdfs dfsadmin -safemode get#進入安全狀態[rootmaster ~]# hdfs dfsadmin -safemode en…

計算機硬件

計算機硬件 一、為什么要學習計算機基礎 程序員編程的本質就是讓計算機去工作,而編程語言就是程序員與計算機溝通的介質。程序員要想讓計算機工作,就要知道計算機能干什么、是怎么樣的一個完成過程,這也是我們必須學習計算機基礎的原因。 …

當編程作為一種愛好

一、當編程作為一種愛好,時刻關心一段代碼如何實現。 二、當把工具操作得足夠熟悉,閉眼即能達到代碼述寫的規范。 三、程序呀,如果愛上你是我的錯,我打算一錯到底。轉載于:https://www.cnblogs.com/spiriter88/p/6913539.html

Python中的函數概述

1.python中函數概述 概念 模塊化編程的思想 有組織,可共享(重復使用,實現特定的功能的代碼塊) 提高程序的可維護性,提高開發效率,提高代碼的重用性定義一個函數 1.語法:def 函數名稱(形參列表):函數體/代碼塊return 返回值 2.定義參數介紹 def :關鍵字 用于函數的定義,函數的…

鐵路售票系統_鐵路資訊:復興號動車、智能京張高鐵…中國最高端鐵路裝備看這里...

今天上午,兩年一度的中國國際現代化鐵路技術裝備展在京開展,會期3天,將集中展示路網建設、客貨運輸、經營管理、工程建造、技術裝備、旅客服務等鐵路行業各領域的先進產品及技術。展會現場智能京張:將首次實現時速350公里自動駕駛…

H.264的NALU,RTP封包說明(轉自牛人)

H.264 RTP payload 格式 H.264 視頻 RTP 負載格式 1. 網絡抽象層單元類型 (NALU) NALU 頭由一個字節組成, 它的語法如下: --------------- |0|1|2|3|4|5|6|7| -------- |F|NRI| Type | --------------- F: 1 個比特.forbidden_zero_bit. 在 H.264 規…

CentOS下安裝MySQL報安裝文件conflicts錯誤:

2019獨角獸企業重金招聘Python工程師標準>>> 第一:報這個錯誤,說明已經安裝或相關文件已經存在,把已經存在的文件卸載了就可以了: rpm -e --nodeps mysql-libs-5.1.* 轉載于:https://my.oschina.net/u/3197158/blog/1…

inc指令是什么意思_西門子PLC一些指令

指令(英文全稱意思)∶指令含義1、LD ( Load裝載):動合觸點2、LDN (Load Not不裝載):動斷觸點3、A(And與動合):用于動合觸點串聯4、AN (And Not與動斷):用于動斷觸點串聯5、o(Or 或動合):用于動合觸點并聯6、ON(Or Not 或動斷):用于動斷觸點并聯7、(Out輸出):用于線圈輸出8、OLD…

python核心,內建函數,高階函數

晨測 global和nonlocal區別 寫一個遞歸的階乘回顧 1.global和nonlocal 關鍵字 2.函數的遞歸 1.查找規律 2.設置退出條件 3.性能 3.閉包 外函數中定義一個內函數 外函數的返回值是內函數的引用 內函數引用外函數的變量,未來外函數執行完畢,不會釋放被內函數引用變量 4.總結 1.…

對h.264壓縮視頻碼流中i幀的提取(firstime)

這個問題要說清楚還是有點復雜:首先判斷 NALU 類型是否是 5,如果是,那么以后連續出現的 NALU 類型為 5 的 NALU 就屬于 IDR 幀(一種特殊的 I 幀);如果 NALU 不是 5,則要進一步判斷 slice_type 是…

hadoop fs 運維常用的幾個命令

FS Shell調用文件系統(FS)Shell命令應使用 bin/hadoop fs <args>的形式。 所有的的FS shell命令使用URI路徑作為參數。URI格式是scheme://authority/path。對HDFS文件系統&#xff0c;scheme是hdfs&#xff0c;對本地文件系統&#xff0c;scheme是file。其中scheme和auth…

touchesEnded不響應

為什么80%的碼農都做不了架構師&#xff1f;>>> http://blog.csdn.net/assholeu/article/details/16363241 touchesEnded不響應主要存在以下幾種情況 case 1 : userInteractionEnabled 部分控件如UIImageView&#xff0c;userInteractionEnabled默認為NO&#xff0…

python request對四類參數的處理_如何處理Djang中同一參數具有多個變量的request.GET...

在Django視圖中&#xff0c;您可以訪問request.GET[variablename]&#xff0c;因此在您的視圖中&#xff0c;您可以執行如下操作&#xff1a;myvar request.GET[myvar] 實際的request.GET[myvar]對象類型是&#xff1a; 現在&#xff0c;如果要傳遞具有相同參數名的多個變量&a…

nonlocal和global關鍵字

回顧: 1. Python的函數的概述函數定義函數調用2. Python函數中參數的類型和返回值形參和實參形參類型:普通參數: 實參的傳遞的順序和個數和形參一直關鍵字參數: 指定傳遞的實參被特定形參接收默認參數: 形參中設定當前參數的默認值可以不傳遞設定了默認參數的實參不定長參數:一…

小波在圖像視頻壓縮領域中的應用分析【轉貼】

到目前為止&#xff0c;小波的最多應用一直是數字圖像壓縮。它們是新JPEG2000數字圖像標準的核心。使用小波變換的優勢主要有如下幾個方面。 1、基于小波變換的方法能有效地保留原始圖像的細節和邊緣&#xff0c;重建圖像時不會造成“振鈴”效應。 2、基于小波變換的方法采用…

iOS開發人員不容錯過的10大工具

內容簡介 1、iOS簡介 2、iOS開發十大實用工具之開發環境 3、iOS開發十大實用工具之圖標設計 4、iOS開發十大實用工具之原型設計 5、iOS開發十大實用工具之演示工具 6、iOS開發十大實用工具之視頻制作 7、iOS開發十大實用工具之分析工具 iOS簡介 說起iOS&#xff0c;自然不必多介…

博弈論之Nim游戲

OI里&#xff0c;博弈論就是兩個聰明絕頂的人玩不公平的游戲。 Nim游戲是組合游戲(Combinatorial Games)的一種&#xff0c;屬于“Impartial Combinatorial Games”&#xff08;以下簡稱ICG&#xff09;。 通常的Nim游戲的定義是這樣的&#xff1a;有若干堆石子&#xff0c;每堆…

python標準庫sys_Python標準庫之Sys模塊使用詳解

sys 模塊提供了許多函數和變量來處理 Python 運行時環境的不同部分. 處理命令行參數 在解釋器啟動后, argv 列表包含了傳遞給腳本的所有參數, 列表的第一個元素為腳本自身的名稱. 使用sys模塊獲得腳本的參數 復制代碼代碼如下: print "script name is", sys.argv[0] …

python3.7知識點匯總

Python3.7從零開始學 —|進入Python3.7的精彩世界 —|---|Python起源 —|---|—|Python作者簡介 —|---|—|---|Guido von Rossum&#xff0c;荷蘭人。1982年&#xff0c;Guido從阿姆斯特丹大學獲得了數學和計算機碩士學位。1989年&#xff0c;他創立了Python語言。 —|---|—|…