XVID基本參數解析

XVID,X264等是MPEG4、H264標準的開源編碼器,其中X264只有編碼部分,解碼部分需要FFMPEG完成;XVID有編解碼部分,其中解碼亦可以利用FFMPEG中的MPEG4完成解碼。視頻壓縮算法的計算復雜度,都是比較高的。其中具有最大計算復雜度有三部分:宏塊搜素運動補償部分、碼率控制部分、濾波算法部分;這三部分占據了算法復雜度的絕大部分資源。
XVID參數解釋:
參數的設置集中在FFMPEG中的libxvidff.C中的 ff_xvid_encode_init()函數里面,主要是對編碼上下文進行初始化賦值操作,此函數中的宏定義在XVID.H之中:
ff_xvid_encode_init(AVCodecContext *avctx)? {
??? int xerr, i;
??? int xvid_flags = avctx->flags;
??? xvid_context_t *x = avctx->priv_data;
??? uint16_t *intra, *inter;
??? int fd;

??? xvid_plugin_single_t single;
??? xvid_ff_pass1_t rc2pass1;
??? xvid_plugin_2pass2_t rc2pass2;
??? xvid_gbl_init_t xvid_gbl_init;
??? xvid_enc_create_t xvid_enc_create;
??? xvid_enc_plugin_t plugins[7];

??? /* Bring in VOP flags from ffmpeg command-line */
??? x->vop_flags = XVID_VOP_HALFPEL; /* Bare minimum quality */ 半像素運動插值
??? if( xvid_flags & CODEC_FLAG_4MV )
??????? x->vop_flags |= XVID_VOP_INTER4V; /* Level 3 */每個宏塊分配四個運動矢量
??? if( xvid_flags & CODEC_FLAG_TRELLIS_QUANT)
??????? x->vop_flags |= XVID_VOP_TRELLISQUANT; /* Level 5 */
??? if( xvid_flags & CODEC_FLAG_AC_PRED )
??????? x->vop_flags |= XVID_VOP_HQACPRED; /* Level 6 * /高質量的AC預測
??? if( xvid_flags & CODEC_FLAG_GRAY )
??????? x->vop_flags |= XVID_VOP_GREYSCALE;

??? /* Decide which ME quality setting to use */
??? x->me_flags = 0;
??? switch( avctx->me_method ) { //宏塊搜索區域,搜索算法
?????? case ME_FULL:?? /* Quality 6 */
?????????? x->me_flags |=? XVID_ME_EXTSEARCH16/* extend PMV by more searches */
?????????????????????? |?? XVID_ME_EXTSEARCH8;/* use diamond/square for extended 8x8 search */

?????? case ME_EPZS:?? /* Quality 4 */
?????????? x->me_flags |=? XVID_ME_ADVANCEDDIAMOND8/* use advdiamond for XVID_ME_EXTSEARCH8 */
?????????????????????? |?? XVID_ME_HALFPELREFINE8
?????????????????????? |?? XVID_ME_CHROMA_PVOP/* also use chroma for P_VOP/S_VOP ME */
?????????????????????? |?? XVID_ME_CHROMA_BVOP;/* also use chroma for B_VOP ME */

?????? case ME_LOG:??? /* Quality 2 */
?????? case ME_PHODS:
?????? case ME_X1:
?????????? x->me_flags |=? XVID_ME_ADVANCEDDIAMOND16/* use advdiamonds instead of diamonds as search pattern */
?????????????????????? |?? XVID_ME_HALFPELREFINE16;

?????? case ME_ZERO:?? /* Quality 0 */
?????? default:
?????????? break;
??? }

??? /* Decide how we should decide blocks */
??? switch( avctx->mb_decision ) { //是否選擇碼率控制方式 avctx->mb_decision=1時,編碼一幀時間迅速增加
?????? case 2:
?????????? x->vop_flags |= XVID_VOP_MODEDECISION_RD;
?????????? x->me_flags |=? XVID_ME_HALFPELREFINE8_RD
?????????????????????? |?? XVID_ME_QUARTERPELREFINE8_RD
?????????????????????? |?? XVID_ME_EXTSEARCH_RD
?????????????????????? |?? XVID_ME_CHECKPREDICTION_RD;
?????? case 1:
?????????? if( !(x->vop_flags & XVID_VOP_MODEDECISION_RD) )
?????????????? x->vop_flags |= XVID_VOP_FAST_MODEDECISION_RD;
?????????? x->me_flags |=? XVID_ME_HALFPELREFINE16_RD
?????????????????????? |?? XVID_ME_QUARTERPELREFINE16_RD;

?????? default:
?????????? break;
??? }

??? /* Bring in VOL flags from ffmpeg command-line */
??? x->vol_flags = 0;
??? if( xvid_flags & CODEC_FLAG_GMC ) {
??????? x->vol_flags |= XVID_VOL_GMC;
??????? x->me_flags |= XVID_ME_GME_REFINE;
??? }
??? if( xvid_flags & CODEC_FLAG_QPEL ) { //是否允許1/4像素
??????? x->vol_flags |= XVID_VOL_QUARTERPEL;
??????? x->me_flags |= XVID_ME_QUARTERPELREFINE16;
??????? if( x->vop_flags & XVID_VOP_INTER4V )
??????????? x->me_flags |= XVID_ME_QUARTERPELREFINE8;
??? }

??? memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init));
??? xvid_gbl_init.version = XVID_VERSION;
??? xvid_gbl_init.debug = 0;

#ifdef ARCH_POWERPC
??? /* XviD's PPC support is borked, use libavcodec to detect */
#if HAVE_ALTIVEC==1
??? if( has_altivec() ) {
??????? xvid_gbl_init.cpu_flags = XVID_CPU_FORCE | XVID_CPU_ALTIVEC;
??? } else
#endif
??????? xvid_gbl_init.cpu_flags = XVID_CPU_FORCE;
#else
??? /* XviD can detect on x86 */
??? xvid_gbl_init.cpu_flags = 0;
#endif

??? /* Initialize */
??? xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL);

??? /* Create the encoder reference */
??? memset(&xvid_enc_create, 0, sizeof(xvid_enc_create));
??? xvid_enc_create.version = XVID_VERSION;

??? /* Store the desired frame size */
??? xvid_enc_create.width = x->xsize = avctx->width; //圖像寬度
??? xvid_enc_create.height = x->ysize = avctx->height; //圖像高度

??? /* XviD can determine the proper profile to use */
???? xvid_enc_create.profile = XVID_PROFILE_S_L3; //? 編碼設定檔次和級別 //壓縮級別,MPEG4-ASP最高壓縮級別

??? /* We don't use zones or threads */
??? xvid_enc_create.zones = NULL;
??? xvid_enc_create.num_zones = 0;
??? xvid_enc_create.num_threads = 0;

??? xvid_enc_create.plugins = plugins;
??? xvid_enc_create.num_plugins = 0;

??? /* Initialize Buffers */
??? x->twopassbuffer = NULL;
??? x->old_twopassbuffer = NULL;
??? x->twopassfile = NULL;

??? if( xvid_flags & CODEC_FLAG_PASS1 ) {
? ?
??????? }
??????? x->twopassbuffer[0] = x->old_twopassbuffer[0] = 0;

??????? plugins[xvid_enc_create.num_plugins].func = xvid_ff_2pass;
??????? plugins[xvid_enc_create.num_plugins].param = &rc2pass1;
??????? xvid_enc_create.num_plugins++;
??? } else if( xvid_flags & CODEC_FLAG_PASS2 ) {//第二次編碼,需要第一次編碼生成的文件才可以完成第二次編碼,不適用實時編碼
??????? memset(&rc2pass2, 0, sizeof(xvid_plugin_2pass2_t));
??????? rc2pass2.version = XVID_VERSION;
??????? rc2pass2.bitrate = avctx->bit_rate;

????? ?

??????? close(fd);
??????? rc2pass2.filename = x->twopassfile;
??????? plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2;
??????? plugins[xvid_enc_create.num_plugins].param = &rc2pass2;
??????? xvid_enc_create.num_plugins++;
??? } else if( !(xvid_flags & CODEC_FLAG_QSCALE) ) {
??????? /* Single Pass Bitrate Control! */
??????? memset(&single, 0, sizeof(xvid_plugin_single_t));
??????? single.version = XVID_VERSION;
??????? single.bitrate = avctx->bit_rate;

??????? plugins[xvid_enc_create.num_plugins].func = xvid_plugin_single;
??????? plugins[xvid_enc_create.num_plugins].param = &single;
??????? xvid_enc_create.num_plugins++;
??? }

??? /* Luminance Masking */
??? if( 0.0 != avctx->lumi_masking ) {
??????? plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking;
??????? plugins[xvid_enc_create.num_plugins].param = NULL;
??????? xvid_enc_create.num_plugins++;
??? }

??? /* Frame Rate and Key Frames */
??? xvid_correct_framerate(avctx);
??? xvid_enc_create.fincr = avctx->time_base.num;
??? xvid_enc_create.fbase = avctx->time_base.den;
??? if( avctx->gop_size > 0 )
??????? xvid_enc_create.max_key_interval = avctx->gop_size; //圖像組的長度設定
??? else
??????? xvid_enc_create.max_key_interval = 240; /* XviD's best default */

??? /* Quants */
??? if( xvid_flags & CODEC_FLAG_QSCALE ) x->qscale = 1; ///encodes[i]->codec.vcc->flags|=CODEC_FLAG_QSCALE; 選擇常量化/ //質量控制=量化參數,1~31,數值越小質量越高
??? else x->qscale = 0;

??? xvid_enc_create.min_quant[0] = avctx->qmin;
??? xvid_enc_create.min_quant[1] = avctx->qmin;
??? xvid_enc_create.min_quant[2] = avctx->qmin;
??? xvid_enc_create.max_quant[0] = avctx->qmax;
??? xvid_enc_create.max_quant[1] = avctx->qmax;
??? xvid_enc_create.max_quant[2] = avctx->qmax;

??? /* Quant Matrices */
??? x->intra_matrix = x->inter_matrix = NULL;
??? if( avctx->mpeg_quant ) //允許MPEG量化 量化矩陣
?????? x->vol_flags |= XVID_VOL_MPEGQUANT;
??? if( (avctx->intra_matrix || avctx->inter_matrix) ) { //可以自己設定量化矩陣avctx->intra_matrix,avctx->inter_matrix
?????? x->vol_flags |= XVID_VOL_MPEGQUANT;

?????? if( avctx->intra_matrix ) {
?????????? intra = avctx->intra_matrix;
?????????? x->intra_matrix = av_malloc(sizeof(unsigned char) * 64);
?????? } else
?????????? intra = NULL;
?????? if( avctx->inter_matrix ) {
?????????? inter = avctx->inter_matrix;
?????????? x->inter_matrix = av_malloc(sizeof(unsigned char) * 64);
?????? } else
?????????? inter = NULL;

?????? for( i = 0; i < 64; i++ ) {
?????????? if( intra )
?????????????? x->intra_matrix[i] = (unsigned char)intra[i];
?????????? if( inter )
?????????????? x->inter_matrix[i] = (unsigned char)inter[i];
?????? }
??? }

??? /* Misc Settings */
??? xvid_enc_create.frame_drop_ratio = 0; //丟幀率;0~100
??? xvid_enc_create.global = 0;
??? if( xvid_flags & CODEC_FLAG_CLOSED_GOP )
??????? xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP;

??? /* Determines which codec mode we are operating in */
??? avctx->extradata = NULL;
??? avctx->extradata_size = 0;
??? if( xvid_flags & CODEC_FLAG_GLOBAL_HEADER ) {
??????? /* In this case, we are claiming to be MPEG4 */
??????? x->quicktime_format = 1;
??????? avctx->codec_id = CODEC_ID_MPEG4;
??? } else {
??????? /* We are claiming to be XviD */
??????? x->quicktime_format = 0;
??????? if(!avctx->codec_tag)
??????????? avctx->codec_tag = ff_get_fourcc("xvid");
??? }

??? /* Bframes */
??? xvid_enc_create.max_bframes = avctx->max_b_frames;
??? xvid_enc_create.bquant_offset = 100 * avctx->b_quant_offset;
??? xvid_enc_create.bquant_ratio = 100 * avctx->b_quant_factor;
??? if( avctx->max_b_frames > 0? && !x->quicktime_format ) xvid_enc_create.global |= XVID_GLOBAL_PACKED;

??? /* Create encoder context */
??? xerr = xvid_encore(NULL, XVID_ENC_CREATE, &xvid_enc_create, NULL); //建立編碼上下文
??? if( xerr ) {
??????? av_log(avctx, AV_LOG_ERROR, "XviD: Could not create encoder reference\n");
??????? return -1;
??? }

??? x->encoder_handle = xvid_enc_create.handle;
??? avctx->coded_frame = &x->encoded_picture;

??? return 0;
}

int ff_xvid_encode_frame(AVCodecContext *avctx,

???????????????????????? unsigned char *frame, int buf_size, void *data) { 開始編碼一幀

?xerr = xvid_encore(x->encoder_handle, XVID_ENC_ENCODE,
??????? &xvid_enc_frame, &xvid_enc_stats); //開始編碼一幀


XVID的量化可以有三種方式:常量化,用戶自己設定量化矩陣,調用默認的量化矩陣


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

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

相關文章

自己整理的openresty安裝步驟

這幾天一直在研究對webapi的限流和名單的問題&#xff0c;于是看了開濤博客的方案&#xff0c;于是就用到了openresty&#xff0c;一個把Nginx和lua集成的東西。 下面就是整理的安裝方案&#xff08;簡單使用基本可以這么安裝&#xff09; 下載openresty&#xff08;centos上下…

京東入職一周感悟:4個匹配和4個觀點

入職一周啦&#xff0c;隨便寫點。一、京東之緣1、我和京東之間的4點匹配Ⅰ技術2008年9月到2016年9月&#xff0c;一直堅持自學技術。京東&#xff0c;是一家商業化的互聯網公司&#xff0c;有技術積淀&#xff0c;有發揮空間。作為技術人員&#xff0c;職業匹配。Ⅱ讀書大學的…

C#賦值運算符及解析

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 賦值運算符對運算符右邊的操作式求值&#xff0c;并用該值設置運算符左邊的變量操作式。賦值運算符主要有簡單賦值及復合賦值運算符&#xff1b;可以放在賦值運算符左邊的對象類型是變量…

mysql 案例 ~ pt修復工具的使用

簡介:今天咱們來聊聊PT修復工具pt-table-sync 注意事項&#xff1a; 1 表要有主鍵或者唯一鍵 2 針對每一個chunk加的是for update鎖 3 修復過程中不能容忍從庫延遲 如果從庫延遲太多&#xff0c;pt-table-sync會長期持有對chunk的for update鎖&#xff0c;然后等待從庫的…

mpeg2,mpeg4,h264編碼標準的異同

1、宏塊匹配像素精度&#xff1a; MPEG2中&#xff0c;運動估計的精度是1/2的像素&#xff0c;通過線性插值實現&#xff08;可能有簡單修正&#xff09;&#xff1b; H264和MPEG4 都可以支持1/4像素的精度 2、參考幀的數量&#xff1a;MPEG2&#xff0c;MPEG4的P幀只能有一幀…

四十歲學編程(一)

有時想想&#xff0c;人生還真的是曲折&#xff0c;人到中年了&#xff0c;我才開始學編程。 這一學&#xff0c;就是三年多&#xff0c;我居然堅持了下來。 更沒想到的是&#xff0c;三年后的我居然有勇氣投簡歷求職前端&#xff0c;雖然面試前戰戰兢兢。 很多時候&#xff0c…

01_SQlite數據庫簡介

轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/7023014.html

GNU Make 使用手冊(中譯版)

翻譯&#xff1a;于鳳昌譯者注&#xff1a;本人在閱讀Linux源代碼過程中發現如果要全面了解Linux的結構、理解Linux的編程總體設計及思想必須首先全部讀通Linux源代碼中各級的Makefile文件。目前&#xff0c;在網上雖然有一些著作&#xff0c;但都不能全面的解釋Linux源代碼中各…

基礎10 多進程、協程(multiprocessing、greenlet、gevent、gevent.monkey、select、selector)...

1.多進程實現方式&#xff08;類似于多線程&#xff09; 1 import multiprocessing2 import time,threading3 4 def thread_run():#定義一個線程函數5 print("我是子線程%s" %threading.get_ident()) #threading.get_ident()函數獲取當前線程的id6 def run(name…

C#比較運算符及解析

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 比較運算符得出的結果是邏輯型&#xff08;bool&#xff09;&#xff0c;即 True 或 False 。 比較運算符又稱關系運算符&#xff0c;我們可以把它理解為一種判斷&#xff0c;判斷的結果…

開發人員MySQL調優-理論篇

2019獨角獸企業重金招聘Python工程師標準>>> 修改字符集 查看字符集 show variables like character% show variables like %char% 上面的兩個命令都可以&#xff0c;我一般使用的下面的&#xff0c;會出來如下幾個字符集設定的選項&#xff1a; character_set_clie…

Java基礎之反射機制

Java反射機制 反射機制是什么 反射機制是在運行狀態中&#xff0c;對于任意一個類&#xff0c;都能夠知道這個類的所有屬性和方法&#xff1b;對于任意一個對象&#xff0c;都能夠調用它的任意一個方法和屬性&#xff1b;這種動態獲取的信息以及動態調用對象的方法的功能稱為ja…

C#邏輯運算符及解析

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 邏輯運算符用于連接一個或多個條件&#xff0c;判斷這些條件是否成立。 &#xff23;&#xff03;的邏輯運算符可以分為兩類&#xff1a; “&#xff06;” “&#xff5c;” “&…

通過ProGet搭建一個內部的Nuget服務器

.NET Core項目完全使用Nuget 管理組件之間的依賴關系&#xff0c;Nuget已經成為.NET 生態系統中不可或缺的一個組件&#xff0c;從項目角度&#xff0c;將項目中各種組件的引用統統交給NuGet&#xff0c;添加組件/刪除組件/以及更新組件即可一鍵完成&#xff0c;大大提升工作效…

unity官方教程-TANKS(一)

unity官方教程TANKS&#xff0c;難度系數中階。跟著官方教程學習Unity&#xff0c;通過本教程你可以學會使用Unity開發游戲的基本流程。 一、環境 Unity 版本 > 5.2Asset Store 里面搜索 Tanks!Tutorial ,下載導入 二、項目設置 為了便于開發&#xff0c;很多時候我們選用的…

Play框架的用戶驗證。

最近剛剛參與一個基于Play框架的管理平臺的升級工作&#xff0c;其中涉及到了用戶的驗證工作。第一次接觸play框架&#xff0c;直接看已有代碼&#xff0c;有點暈。因此&#xff0c;自己實現了一個簡單的用戶驗證功能。 首先&#xff0c;新建一個User類&#xff0c;包含兩個屬性…

C#條件運算符if-else的簡化格式

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 條件運算符&#xff08;&#xff1f;&#xff1a;&#xff09;是&#xff49;&#xff46;……&#xff45;&#xff4c;&#xff53;&#xff45;的簡化形式 其使用格式為&#xff1a…

碼率控制方式選擇

同碼率下的圖像質量或同圖像質量下的碼率。 AVCodecContext /** * the average bitrate * - encoding: Set by user; unused for constant quantizer encoding. * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the strea…

Fortran執行語句中的“雙冒號” ::

雙冒號“::”&#xff0c;通常出現于Fortran在變量聲明中&#xff0c;但是在特殊情況下&#xff0c;也會出現于數組中。例如&#xff1a; ... real,target,dimension(10):: a real,pointer,dimension(:):: pa,pb integer:: n3 ... pa > a(n::1) pb > a(n:10:1) ... 咋一看…

VS配置本地IIS以域名訪問

1.IIS下配置自己的網站&#xff0c;添加主機名 2.修改hosts文件&#xff08;C://Windows/System32/drivers/etc&#xff09; 3.VS中配置項目Web服務器&#xff08;選擇外部主機&#xff09; 轉載于:https://www.cnblogs.com/zuimeideshi520/p/7028544.html