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

FFMpeg中apiexample.c例子分析——編碼分析apiexample.c例子教我們如何去利用ffmpeg庫中的api函數來自己編寫編解碼程序。

?

FFMpeg中apiexample.c例子分析——編碼分析 - 小康 - 小康的博客
?

?

?

(1)首先,main函數中一開始會去調用avcodec_init()函數,該函數的作用是初始化libavcodec,而我們在使用avcodec庫時,該函數必須被調用。

  (2)avcodec_register_all()函數,注冊所有的編解碼器(codecs),解析器(parsers)以及碼流過濾器(bitstream filters)。當然我們也可以使用個別的注冊函數來注冊我們所要支持的格式。

  (3)video_encode_example()函數用于視頻編碼,由圖可知,所有的編碼工作都在該函數內完成。

  (4)avcodec_find_encoder()函數用于查找一個與codec ID相匹配的已注冊的編碼器。

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

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

  (7)設置參數:

    設置采樣參數,即比特率。

    c->bit_rate = 400000;

    設置分辨率,必須是2的倍數。

    c->width = 352;

    c->height = 288;

    設置幀率。

    c->time_base = (AVRational){1,25}; 該幀率為25,其實timebase = 1/framerate,花括號內分別為分子和分母。

    設置GOP大小。

    c->gop_size = 10; 該值表示每10幀會插入一個I幀(intra frame)。

    設置B幀最大數。

    c->max_b_frames = 1; 該值表示在兩個非B幀之間,所允許插入的B幀的最大幀數。

    設置像素格式。

    c->pix_fmt = PIX_FMT_YUV420P; 該值將像素格式設置為YUV420P。

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

  (9)接著是打開文件,f = fopen( filename, “wb” );

????(10)分配圖像和輸出緩存。

    申請100KB左右的內存作為輸出緩存。

outbuf_size = 100000;

    outbuf = malloc( outbuf_size );

    根據幀的大小來確定YUV420所占內存大小,一個像素,RGB格式占用3個字節,而YUV420格式只占用兩個字節。YUV420格式是指,每個像素都保留一個Y(亮度)分量,而在水平方向上,不是每行都取U和V分量,而是一行只取U分量,則其接著一行就只取V分量,以此重復,所以420不是指沒有V,而是指一行采樣只取U,另一行采樣只取V。在取U和V時,每兩個Y之間取一個U或V。但從4x4矩陣列來看,每4個矩陣點Y區域中,只有一個U和V,所以它們的比值是4:1。所以對于一個像素,RGB需要8 * 3 = 24位,即占3個字節;而YUV420P,8 + 8/4 + 8/4 = 12位,即占2個字節,其中8指Y分量,8/4指U和V分量。

    size = c->width * c->height;

    picture_buf = malloc( (size * 3) / 2 );??

    picture->data[0] = picture_buf;

    picture->data[1] = picture->data[0] + size;

    picture->data[2] = picture->data[1] + size / 4;

    picture->linesize[0] = c->width;

    picture->linesize[1] = c->width / 2;

    picture->linesize[2] = c->width / 2;

    其中,data[0]存放Y,data[1]存放U,data[2]存放V【FixMe】。linesize[0]表示Y分量的寬度,linesize[1]表示U分量的寬度,linesize[2]表示V分量的寬度。

  (11)編碼一秒鐘的視頻,幀率為25,所以需要循環25次,每次編碼一幀。

  (11.1)準備一幅偽圖像,即自己自定義往里面塞數據。

    for(y=0;y<c->height;y++){

?????????????????????for(x=0;x<c->width;x++){

????????????????????????????picture->data[0][y*picture->linesize[0]+x]=x+y+i*3;

}

}

for(y=0;y<c->height/2;y++){

???????for(x=0;x<c->width/2;x++){

??????????????picture->data[1][y*picture->linesize[1]+x]=128+y+i*2;

??????????????picture->data[2][y*picture->linesize[2]+x]=64+x+i*5;

}

}

  (11.2)avcodec_encode_video()從picture中編碼一幀視頻數據,并存入到outbuf中,而期間所使用的編碼器為c。

  (11.3)將編碼完的數據寫入到文件里。

  (12)對延時的幀數據進行編碼。因為像MPEG4中,I幀、P幀和B幀之間存在一定的延時【FixMe】。同樣是avcodec_encode_video(),然后寫入文件。

  (13)添加結束代碼,使其成為一個真正的mpeg文件。

    outbuf[0] = 0x00;

    outbuf[1] = 0x00;

    outbuf[2] = 0x01;

    outbuf[3] = 0xb7;

    fwrite( outbuf, 1, 4, f );

  這個結束代碼表示什么???

  (14)釋放資源。

    fclose(f);   free(picture_buf);

    free(outbuf);

    avcodec_close(c);

    av_free(c);

    av_free(picture);

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

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

相關文章

.net 常見異常及其翻譯

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

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

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

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

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

與 OpenCV 1 同時使用

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

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

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

Fedora15安裝NVIDIA顯卡驅動全過程

Fedora安裝N卡驅動全過程 Fedora安裝NVIDIA顯卡全過程&#xff0c;經過自己親自安裝 折騰了一個上午&#xff0c;搞定了N卡驅動安裝&#xff0c;現將安裝步驟整理如下&#xff1a; 1、首先訪問Nvidia官網下載最新的Linux驅動&#xff1a;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…

[BZOJ1880] [Sdoi2009] Elaxia的路線 (SPFA 拓撲排序)

Description 最近&#xff0c;Elaxia和w**的關系特別好&#xff0c;他們很想整天在一起&#xff0c;但是大學的學習太緊張了&#xff0c;他們 必須合理地安排兩個人在一起的時間。Elaxia和w**每天都要奔波于宿舍和實驗室之間&#xff0c;他們 希望在節約時間的前提下&#xff0…

ffmpeg的編譯大全

ffmpeg的編譯大全 最近互聯網視頻共享的網站很火&#xff0c;公司也想搞類似的網站&#xff0c;初步是用fmsffmpeg形式 fms負責在線錄制&#xff0c;播放&#xff0c;ffmpeg則在后臺處理上傳的資源轉換成一定的格式。 為了讓ffmpeg支持的格式盡量多&#xff0c;所以特把我的編譯…

用OPENCV視覺解數獨

用OPENCV視覺解數獨 2010-06-29 看到增強視覺網站上介紹老外用視覺解SUDOKU(http://www.cvchina.info/2011/05/29/video-sudoku-solver/)&#xff0c;覺得應該不難&#xff0c;于是用OPENCV和訓練好的數字分類器&#xff0c;也試著做一個&#xff0c;純屬娛樂 基本思路如下&…

集成ffmpeg/x264:ERROR: libx264 not found的問題

集成ffmpeg/x264:ERROR: libx264 not found的問題--拔劍集成ffmpeg/x264碰到如下問題&#xff1a; ERROR: libx264 not found察看config.log,詳細信息如下&#xff1a;check_lib x264.h x264_encoder_encode -lx264check_header x264.hcheck_cppBEGIN/tmp/ffconf.isuazGlg.c1 …