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

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

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

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

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

相關文章

2008-2021年商業銀行數據(農商行、城商行、國有行、股份制銀行)

2008-2021年商業銀行數據(農商行、城商行、國有行、股份制銀行) 1、時間:2008-2021年 2、范圍:1700銀行 3 、指標:證券簡稱、year、證券代碼、資產總計、負債合計、所有者權益合計、利潤總額、凈利潤、貸款總額、存…

EPSON 任務同步 改寫

有時需要在多個任務執行之前來使它們同步。如果預先知道執行每項任務所需要的時間,它們就可以通過簡單地等待由最慢的任務產生的信號來實現同步。然而,如果不知道那個任務是最慢的,就需要使用一個更復雜的同步化機制,如下所示VAL …

線程池的簡單使用

創建指定線程數量的線程池 private static ExecutorService scheduledTaskFactoryExecutor null;private boolean isCancled false;private static class ThreadFactoryTest implements ThreadFactory { Overridepublic Thread newThread(Runnable r) { Thread threa…

異常--自定義異常類

為什么要調用父類構造器? http://blog.csdn.net/rockpk008/article/details/52951856 轉載于:https://www.cnblogs.com/dwj-ngu/p/6576382.html

利用ffmpeg來進行視頻解碼的完整示例代碼

(轉)利用ffmpeg來進行視頻解碼的完整示例代碼(H.264) Decode() { FILE * inpf; int nWrite; int i,p; int nalLen; unsigned char * Buf; int got_picture, consumed_bytes; unsigned char *DisplayBuf; Displ…

安卓觀看免費視頻

http://www.imooc.com/search/course?wordsAndroid%E6%94%BB%E5%9F%8E%E7%8B%AE%E7%AC%AC%E4%B8%80%E8%AF%BE&page3 http://www.imooc.com/course/list?candroid&src360onebox http://www.bilibili.com/video/av2788563/index_4.html http://www.imooc.com/course/pr…

EtherCAT 網站鏈接

http://www.ethercat.org.cn/cn.htm EtherCAT技術介紹 EtherCAT系統組成和工作原理 EtherCAT采用主從式結構,主站PC機采用標準的100Base-TX以太網卡,從站采用專用芯片。系統控制周期由主站發起,主站發出下行電報,電報的最大有效數…

IEC 6-1131/3的5種標準編程語言

用于開發控制系統和商業管理系統的TRACE MODE6編程工具面向不同領域的軟件工程師. TRACE MODE6包含的五種編程語言為:Techno SFC、Techno LD、Techno FBD、Techno ST和Techno IL. 這些語言是下列IEC 6-1131/3標準語言的擴展: SFC(順序功能圖…

ngRx 官方示例分析 - 4.pages

Page 中通過構造函數注入 Store,基于 Store 進行數據操作。 注意 Component 使用了 changeDetection: ChangeDetectionStrategy.OnPush. OnPush means that the change detectors mode will be set to CheckOnce during hydration. /app/containers/collection-page…

用ffmpeg把yuv格式轉化為mpeg格式

http://blog.sina.com.cn/s/blog_5f5ad6a90100cs5k.html

方法:查詢MongoDB數據庫中最新一條數據(JAVA)

使用JAVA語言查詢MongoDB中某個數據庫某個集合的最新一條數據&#xff1a; MongoCollection<Document> cpu MongoClient.getDatabase("sysmgr").getCollection("cpu"); //獲取所需集合 Document dbo cpu.find().sort(descending("time"…

NoPause/NoEmgAbort的任務 與后臺任務的區別

NoPause/NoEmgAbort的任務示例 下面的例子顯示了一個程序&#xff0c;可以監視控制器的錯誤并根據錯誤編號在發生錯誤時切換I/O On/Off。 Function main Xqt ErrorMonitor, NoEmgAbort : FendFunction ErrorMonitor Wait ErrorOnIf 4000 < SysErr And Syserr < 5999 T…

30分鐘搞定后臺登錄界面(103個后臺PSD源文件、素材網站)(轉)

出處&#xff1a;http://www.cnblogs.com/best/p/6582294.html 目錄 一、界面預覽二、PSD源文件預覽三、工具分享四、資源說明五、素材下載網站六、下載去年八月時要做一個OA系統為了后臺界面而煩惱&#xff0c;后來寫了一篇博客&#xff08;《后臺管理UI的選擇》&#xff09;介…

Linux 查看服務器開放的端口號

在討論這個問題前&#xff0c;我們先來了解一下物理端口、邏輯端口、端口號等計算機概念。 端口相關的概念&#xff1a; 在網絡技術中&#xff0c;端口&#xff08;Port&#xff09;包括邏輯端口和物理端口兩種類型。物理端口指的是物理存在的端口&#xff0c;如ADSL Modem、集…

VC的文件路徑為什么要用雙斜杠

在編程時&#xff0c;打開文件的路徑在用單斜杠時&#xff0c;會出現問題&#xff0c;例如&#xff1a; image cvLoadImage("C:\Users\lyb\Documents\Visual Studio 2013\Projects\smooth\Debug\pic.png", 0);這樣的寫法在編譯時&#xff0c;不會出現編譯錯誤&#…

FFMpeg中apiexample.c例子分析——解碼分析

FFMpeg中apiexample.c例子分析——解碼分析 收藏 我們直接從 video_decode_example() 函數開始講&#xff0c;該函數實現了如何去解碼一個視頻文件&#xff0c;以 .mpeg 文 件為例。 &#xff08; 1 &#xff09;將緩存的末尾清 0 &#xff0c;從而確保讀操作不會越界導致破…

[轉]整理一些好的開源項目

首先說明&#xff0c;要想找開源項目&#xff0c;當然是Github&#xff01; 另外oschina上面也可能有你要的&#xff0c;這個是分類的鏈接&#xff1a;http://www.oschina.net/project/tags&#xff0c;比如這個是一個Python的相關開源資源&#xff1a;http://www.oschina.net/…

android是32-bit系統還是64-bit系統

轉自&#xff1a;http://www.cnblogs.com/pengwang/archive/2013/03/11/2954496.html 電腦CPU分32位和64位&#xff0c;這個我們都知道。用了這么長時間的android手機&#xff0c;突然有個疑問&#xff1a;android OS運行在多少位的CPU上呢&#xff1f; android應用程序是基于D…

海爾系列報道之一:海爾“小微”怎么玩

海爾去年裁了1.6萬人&#xff0c;今年上半年裁了5000人&#xff0c;這2.1萬人去了哪&#xff1f;除了被淘汰的部分&#xff0c;他們中的大多數去了169家小微公司. 從今年年初開始&#xff0c;海爾集團品牌總監范建斌就帶著海爾品牌部的兩個姑娘開始籌劃做一個文化小微公司&…