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

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

我們直接從 video_decode_example() 函數開始講,該函數實現了如何去解碼一個視頻文件,以 .mpeg 文 件為例。

  ( 1 )將緩存的末尾清 0 ,從而確保讀操作不會越界導致破壞 mpeg 流。

     uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];

     memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);

    可見,我們所分配的緩存,除了存放數據外,最后部分還預留了一小段空間。

  ( 2 avcodec_find_decoder() 函數用于查找與 codec ID 相匹配的已注冊的解碼器。

  ( 3 avcodec_alloc_context() 函數用于分配一個 AVCodecContext 并設置默認值, 如果失敗返回 NULL ,并可用 av_free() 進行釋放。

  ( 4 avcodec_alloc_frame() 函數用于分配一個 AVFrame 并設置默認值,如果失敗返回 NULL , 并可用 av_free() 進行釋放。

  ( 5 avcodec_open() 函數用給定的 AVCodec 來初始化 AVCodecContext

    對于一些編解碼器,像 msmpeg4 mpeg4 ,其寬度和高度必須要初始化,因為這些信息在碼流( bitstream )中是沒有的。 avcodec_open() 會幫我們把寬度和高度設置好。

  ( 6 )打開文件 fopen

  ( 7 )循環解碼。

來源:(http://blog.sina.com.cn/s/blog_4e87ac6e0100a60g.html ) - FFMpeg中apiexample.c例子分析——解碼分析_eNsEmpire_新浪博客

  ( 7.1 )讀取文件 fread(inbuf, 1, INBUF_SIZE, f );

    注意 1 :一些編解碼器是基于流的(像 mpegvideo mpegaudio ),這是使用它們的唯一一種方法,因為在解析它之前,你不知道壓縮數據的大小。

    但是,一些其他編解碼器(像 msmpeg4 mpeg4 )是基于幀的,所以對于某一幀,你必須調用這些編解碼器來處理所有數據。你也必須在初始化這些編解 碼器前,先把寬度和高度設置了。

    注意 2 :一些編解碼器允許原始參數(像幀大小,采樣率)在任何一幀被改變。我們雖然已對此做了處理,但你也 要重視起來。

    這兒,我們用一個基于流的解碼器( mpeg1video ),所以我們把數據輸到解碼器,看它是否可以解碼一幀。

  ( 7.2 avcodec_decode_video() 函數用于解碼一個視頻幀 , inbuf_ptr picture, 所采用的編解碼器是 c

  ( 7.3 )寫入文件。

  ( 8 )解碼延時的幀,再寫入文件。

    一些解碼器,像 MPEG ,傳輸 I 幀和 P 幀時,都會有一幀的延時。所以我們必須要獲取視頻的最后一幀數據。

  ( 9 )釋放資源。

     fclose(f);

     avcodec_close(c);

     av_free(c);

     av_free(picture);

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

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

相關文章

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

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

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

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

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

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

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

FFMpeg中apiexample.c例子分析——編碼分析apiexample.c例子教我們如何去利用ffmpeg庫中的api函數來自己編寫編解碼程序。 (1)首先,main函數中一開始會去調用avcodec_init()函數,該函數的作用是初始化libavcodec,而我們…

.net 常見異常及其翻譯

System.Exception//所有異常的基類型System.ApplicationException//發生非致命應用程序錯誤時引發的異常System.SystemException//為System命名空間中的預定義異常定義基類System.SystemException//異常根類System.AccessViolationException//在試圖讀寫受保護內存時引發的異常…

Access2010打開系統表MSysObjects的控制權限

一、顯示系統表 第一步:單擊左上角【文件】頁簽,點擊【選項】打開選項對話框,如圖所示 第二步:在【Access選項】對話框中,選擇【當前數據庫】,在【導航】欄下,點擊【導航選項】打開【導航選項】…

抓屏的各種方法(http://www.codeproject.com/KB/dialog/screencap.aspx)

文章翻譯自 P.GopalaKrishna 的 Various methods for capturing the screen 一文,原版地址見下面。本文章版權歸原作者所有。 如果轉載該譯文 , 請保證文章的完整性,并注明來自 www.farproc.com 袁曉輝 2005/6/12 原版地址&…

與 OpenCV 1 同時使用

與 OpenCV 1 同時使用 目的 對于OpenCV的開發團隊來說,持續穩定地提高代碼庫非常重要。我們一直在思考如何在使其易用的同時保持靈活性。新的C接口即為此而來。盡管如此,向下兼容仍然十分重要。我們并不想打斷你基于早期OpenCV庫的開發。因此&am…

第五周 Leetcode 99. Recover Binary Search Tree (HARD)

Leetcode99 給定一個 二叉搜索樹,其中兩個節點被交換,寫一個程序恢復這顆BST. 只想到了時間復雜度O(n)空間復雜度O(h) h為樹高的解法,還沒想到空間O(1)的解法。 交換的情況只有兩種&…

Fedora15安裝NVIDIA顯卡驅動全過程

Fedora安裝N卡驅動全過程 Fedora安裝NVIDIA顯卡全過程,經過自己親自安裝 折騰了一個上午,搞定了N卡驅動安裝,現將安裝步驟整理如下: 1、首先訪問Nvidia官網下載最新的Linux驅動:http://www.nvidia.cn/Download/index…

板鄧:wordpress自定義登錄頁面實現用戶登錄

首先檢查用戶是否已經登錄&#xff0c;如果已經登錄就返回info目錄下的頁面。 <?phpglobal $current_user;$loginuserid $current_user->ID;if($loginuserid){//如果已經登錄header("Location:".get_bloginfo(url)."/info/"); exit;} 如果用戶未登…

機器學習(machine learning)之AdaBoost算法

轉自&#xff1a;http://blog.csdn.net/haidao2009/article/details/7514787 淺談 Adaboost 算法 機器學習是利用一些方法來使機器實現人的學習行為&#xff0c;以便獲取新的知識或技能&#xff0c;重新組織已有的知識結構使之不斷改善自身的性能。 AdaBoost全名“adaptive B…

交換兩個整形變量的數值

課堂問題一: #include<stdio.h>void swap(int *p,int *q) {int *m;printf("m%d\n",m);printf("%s\n",*m);*m*p;*p*q;*q*m; } int main(){int a,b;scanf("%d,%d",&a,&b);swap(&a,&b);printf("a%d b%d\n",a,b);re…

使用CodeFirst創建并更新數據庫

本文主要介紹如何使用CodeFirst模式來新建并更新數據庫 在使用Entity Framwork的三種方式&#xff08;ModelFist、DBFirst、CodeFirst&#xff09;中&#xff0c;CodeFirst方式書寫的代碼最為干凈。 至于CodeFist方式的詳細優缺點請各位讀者自行搜索&#xff0c;這里不多贅述。…

fedora 15怎么修改運行級別?

inittab改了已經在fedora15中&#xff0c;你vim它就可以看到更改說明&#xff0c;就是說都改到/etc/systemd/system/default.target這里了&#xff0c;就是缺省的設置。如果你要改變缺省值就把對應的runlevel移動過去覆蓋了。 To 3 字符 [root15 system]# rm -rf /etc/systemd…

淺析人臉檢測之Haar分類器方法

由于工作需要&#xff0c;我開始研究人臉檢測部分的算法&#xff0c;這期間斷斷續續地學習Haar分類器的訓練以及檢測過程&#xff0c;在這里根據各種論文、網絡資源的查閱和對代碼的理解做一個簡單的總結。我試圖概括性的給出算法的起源、全貌以及細節的來龍去脈&#xff0c;但…

利用微軟平臺生成報表,線性圖,柱形圖

說來慚愧,以前的工作中一直借助第三方dll進行報表制作,比如線性圖,柱形圖. 因為現在工作的這家公司不允許隨便引入第三方dll,聽同事說起可以建rdl類型文件進行引入到winform窗體中,窗體上使用reportViewer控件進行關聯展示.下面是我今天摸索3個小時的結果分享. 第一步. 首先找到…

Linux ffmpeg的安裝編譯過程

Linux ffmpeg的安裝編譯過程 1、下載ffmpeg。    在網上搜索一下,或者到官方網站下載2、解壓   tar命令解壓3、配置  ./configure --enable-shared --prefix/usr/local/ffmpeg  其中&#xff1a;--enable-shared 是允許其編譯產生動態庫&#xff0c;在以后的編程中…

opencv 模板匹配(cvMatchTemplate)

opencv 模板匹配(cvMatchTemplate) 模板匹配是通過在輸入圖像上滑動模板圖像塊對實際的圖像塊和輸入圖像進行匹配&#xff0c;并且可以利用函數cvMinMaxLoc()找到最佳匹配的位置。例如在工業應用中&#xff0c;可以鎖定圖像中零部件的位置&#xff0c;并根據具體的位置&…

爬蟲系統Lucene分詞

思路&#xff1a;查詢數據庫中信息&#xff0c;查詢出id和name把那么進行分詞存入文件 package com.open1111.index; import java.io.IOException;import java.nio.file.Paths;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet; impor…