![[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c63/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c631.gif)
![[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c63/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c632.gif)
![[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c63/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c633.gif)
![[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c63/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c634.gif)
![[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c63/8bc8dea8-3777-4c8b-85cd-a09fdd2c5c635.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.x264編碼詳細(xì)文字全過程 (1) x264_param_default( x264_param_t *param ) /重點(diǎn)參考x264_param_t結(jié)構(gòu)定義。作用: 對編碼器進(jìn)行參數(shù)設(shè)定 cqm:量化表相關(guān)信息 csp:
2、 量化表相關(guān)信息里的memset( param->cqm_4iy, 16, 16 ); &
3、#160; memset( param->cqm_4ic, 16, 16 );
4、 memset( param->cqm_4py, 16, 16 ); memset( param->cqm_4pc, 16, 16 );
5、0; memset( param->cqm_8iy, 16, 64 );
6、60; memset( param->cqm_8py, 16, 64 );(2)static int Parse( int argc, char *argv, x264_param_t *param, cli_opt_t *opt ) 初始化1 getopt
7、_long(nargc, nargv, options, long_options, idx) 得到入口地址的向量與方式的選則2 getopt_internal(nargc, nargv, options) 解析入口地址向量(3) static int Encode( x264_param_t *param, cli_opt_t *opt )/* Create a copy of param */ h->param=param/* VUI */vui信息主要包括幀率、圖像尺寸等信息/* Init x264
8、_t */x264_sps_init( h->sps, 0, &h->param );序列圖像集x264_pps_init( h->pps, 0, &h->param, h->sps);圖像參數(shù)集/* Init frames. */ 初始化并開辟幀空間/* init mb cache */ 對前一宏塊的信息保存,因?yàn)槭浅跏蓟?,所以作為第一個(gè)宏塊的參考,后面會有x264_macroblock_cache_load( h, i_mb_x, i_mb_y );它是將要編碼的宏塊的周圍
9、的宏塊的值讀進(jìn)來, 要想得到當(dāng)前塊的預(yù)測值,要先知道上面,左面的預(yù)測值/* init cabac adaptive model */* init CPU functions */ 初始化cpu對各種分塊的參數(shù)設(shè)定/* rate control */ 1 x264_t *x264_encoder_open ( x264_param_t *param ) 這個(gè)函數(shù)是對不正確的參數(shù)進(jìn)行修改,并對各結(jié)構(gòu)體參數(shù)和cabac編碼,預(yù)測等需要的參數(shù)進(jìn)行初始化
10、0; 2、p_read_frame( &pic, opt->hin, i_frame + opt->i_seek, param->i_width, param->i_height ) 讀取一幀,并把這幀設(shè)為prev 3. i_file += Encode_frame( h, opt->hout, &pic );進(jìn)入核心碼層 核心編碼層的總流程圖:(x264.c) 1 &
11、#160; x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out )對幀進(jìn)行編碼 2 i_size = x264_nal_encode( data, &i_data, 1, &nali ) 網(wǎng)絡(luò)打包編碼 3 i_file += p_write_nalu( hout, data, i_size )
12、把網(wǎng)絡(luò)包寫入到輸出文件中去 4 返回,對下一幀進(jìn)行編碼 下面一頁是詳細(xì)的流程圖:一幀內(nèi)詳細(xì)流程圖: (1) x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out )對幀進(jìn)行編碼 1 /* 1: Copy the picture to
13、 a frame and move it to a buffer */ x264_frame_t*fenc=x264_frame_get( h->frames.unused ); x264_frame_copy_picture( h, fenc, pic_in ); fenc->i_frame = h->frames.i_input+; x264_frame_put( h->frames.next, fenc ); x264_frame_init_lowres( h->para
14、m.cpu, fenc );/里面包含低象素的擴(kuò)展,很多for循環(huán),應(yīng)該是抽頭計(jì)算和半精度象素的擴(kuò)展,要認(rèn)真看 (2) 264_slicetype_decide( h );對slice類型的判定,里面也要看一下 (3) while( IS_X264_TYPE_B( h->frames.nextbframes-
15、>i_type ) )bframes+;x264_frame_put(h->frames.current,x264_frame_get( &h->frames.nextbframes ) );這主要是因?yàn)锽幀必須等后面的非B幀編碼結(jié)束后才能編碼,所以把暫時(shí)不編的一系列B幀存入隊(duì)列中,一直到非B幀才取出進(jìn)行編碼,之后再進(jìn)行前面的B幀編碼do_encode:(4) 建立list0 & list1.我感覺
16、0; x264_reference_build_list( h, h->fdec->i_poc, i_slice_type ); 比特率控制初始化x264_ratecontrol_start(h, i_slice_type, h->fenc->i_qpplus1 );(5) 創(chuàng)建slice的頭部數(shù)據(jù)x264_slice_init( h, i_nal_type, i_slice_type, i_global_qp );(6)
17、60; i_frame_size = x264_slices_write( h );這是編碼的關(guān)鍵了1. x264_slice_header_write(&h->out.bs,&h->sh,h->i_nal_ref_idc ); /* Slice header */2. 一些初始化工作3. for(mb_xy=h->sh.i_first_mb, i_skip = 0
18、; mb_xy < h->sh.i_last_mb; mb_xy+ )對一個(gè)slice中每個(gè)宏塊進(jìn)行循環(huán)遍歷編碼,其中const int i_mb_y = mb_xy / h->sps->i_mb_width;和const int i_mb_x = mb_xy % h->sps->i_mb_width;是對宏塊位置在slice中的x,y坐標(biāo)的定位,這個(gè)for語句幾乎覆蓋了整個(gè)x264_slices_write()函數(shù)4. x264_macroblock_cache_load( h, i_mb_x,
19、i_mb_y ); 它是將要編碼的宏塊的周圍的宏塊的值讀進(jìn)來, 要想得到當(dāng)前塊的預(yù)測值,要先知道上面,左面的預(yù)測值!5. *x264_macroblock_analyse( h );重點(diǎn)。通過一系列的SAD算出最優(yōu)化方案,例如把I幀16×16的宏塊分成16個(gè)4×4分別計(jì)算SAD和與原16×16SAD比較我感覺,在下面一層再詳細(xì)分析。a. x264_mb_analyse_intra( h, &analysis, COST_MAX );我感覺是在一個(gè)16×16的SAD
20、,4個(gè)8×8的SAD和,16個(gè)4×4SAD和中選出最優(yōu)方式進(jìn)行,可能我的理解不對,里面的x264_mb_encode_i4x4( h, idx, a->i_qp );i8×8幾個(gè)函數(shù)的跟蹤有問題,跟得我都找不到,要仔細(xì)看(現(xiàn)在又能跟到了) 這邊好像如果是直流分量在這里就進(jìn)行量化ZIGZAG掃描了,不用等到x264_macroblock_encode( h )再完成了 b. x264_analyse_update_cache( h, &analysis ); 有對色度塊的模式選擇的計(jì)算,好像也有更新信息以為下
21、次的預(yù)測作為參考 6. x264_macroblock_encode( h ); a. 判斷宏塊的類型 b. 根據(jù)判斷的類型進(jìn)行DCT,量化,ZIGZAG,并記錄當(dāng)前的模式為下次編碼宏塊(亞宏塊)做參考 ZIGZAG的實(shí)現(xiàn)不明白(原來ZIGZAG有宏定義,在上面,現(xiàn)在明白了),反量化和IDCT的過程跟不進(jìn)去,應(yīng)該是匯編了!函數(shù)如下:( I 4×4 中 x264_mb_encode_i4x4( h, i, i_qp );) x26
22、4_mb_dequant_4x4( dct4x4, h->dequant4_mfCQM_4IY, i_qscale ); h->dctf.add4x4_idct( p_dst, i_stride, dct4x4 ); 還有,這個(gè)函數(shù)跟蹤不進(jìn)去,應(yīng)該是重構(gòu)圖像的反變換吧 h->dctf.add4x4_idct( p_dst, i_stride, dct4x4 ); h->ra4x4_pred_modex264_scan8i=x264_mb_pred_mode4x4_fix(i_mode);這個(gè)值到底是怎么根據(jù)
23、前面的模式改變的,可能是上面兩個(gè)函數(shù)沒能更進(jìn)去所以模糊 c. 對色度塊進(jìn)行編碼,QP限制在051之間,選定預(yù)測模式(DC的話值全為128) x264_mb_encode_8x8_chroma( h, !IS_INTRA( h->mb.i_type ), i_qp );里面對兩個(gè)色度信號分別編碼,與亮度信號類似 d. 求亮度和色度的cbp,完全不明白是怎么求的,需要解決!現(xiàn)在有點(diǎn)明白,每個(gè)比特代表子塊是不是全為0,但還沒有全部明白,色度塊cbp中0x02表示有AC,DC 0x01表示只有DC,
24、0;e利用CBP判斷要不要SKIP.,里面還關(guān)系到向量預(yù)測,明天好好看一下。 其中 h->mb.qph->mb.i_mb_xy = h->mb.i_last_qp;這個(gè)為讀下一個(gè) qp的保存,不然解碼端是讀不出下一個(gè) qp的, 關(guān)于CBP的理解還存在問題,他的8位比特各個(gè)代表的意思還不是十分明確,反正是對DC,AC的編碼的選擇。185頁有介紹(新一代視頻壓縮標(biāo)準(zhǔn)畢厚杰) 7. 選用CABAC還是CAVLC
25、CABAC的原理實(shí)現(xiàn)沒仔細(xì)看 8. x264_macroblock_cache_save( h );保存以為下次的預(yù)測作為參考 9. 一些收尾工作,為下次宏塊作準(zhǔn)備(看的比較粗) x264基于經(jīng)驗(yàn)和感覺的碼率控制策略 收藏 前提: 1 high-complexity or high-motion scenes,細(xì)節(jié)將不會很明顯,此時(shí)高qp也是浪費(fèi) 2 where motion compensation works well,在景物邊沿的失真,只需
26、在一幀中去掉,以后就都不會有.在這里投入有限的bits可以獲得最好的圖像質(zhì)量性價(jià)比 3 已經(jīng)編碼一frame,可以預(yù)測其他qp下所需bit數(shù).預(yù)測距離越遠(yuǎn)越不精確 4隨著frame重要性降低,他們只配用更大的qp,i ,p ,參考b ,disposable b.依次降低 5H.264支持1frame內(nèi)不同mb使用不同qp,x264不支持,而由rc返回統(tǒng)一qp。但有那個(gè)功能函數(shù)存在那個(gè)函數(shù)僅精確到每一行mb變一次qp 所以rc策略如下: 2pass: step1 1pass編碼,由qp推斷某qp下framesize *0.6符合目標(biāo)fr
27、ame size的限制,得到這個(gè)qp step2 修改qp 以滿足requested total size(total是指整個(gè)Gop的大小,分段先編一邊再一邊) step3 encode根據(jù)實(shí)際大小值修正預(yù)測的qp,并額外增加short-term compensation,針對開始和結(jié)束部分沒有很多bits余地的位置. 1pass: abr (average bit rate ) step1 用半尺寸快速運(yùn)動估計(jì)和SATD residuals 替換1st pass中相關(guān)部分,獲得預(yù)測 step2 用之前的樣本估計(jì)scale
28、;step3 Overflow compensation 和2pass相似 限制filesize 犧牲圖像質(zhì)量 1pass,:constant bitrate (VBV compliant)! VBV是指: Video Buffer Verifier The Video Buffer Verifier (VBV) is a model hypothetical decoder buffer that will not overflow or underflow when fed a conforming MPEG bit stream.&
29、#160; 包含2個(gè)因素.size和造成的delay step1 same as abr step2 Scaling factor is based on a local average (dependent on VBV buffer size) instead of all past frames step3 stricter Overflow compensation , additional term to hard limit the QPs if the VBV is near empty. no har
30、d limit is done for a full VBV這里更加嚴(yán)格的空限制,防止沒有bits可以送出,破壞了cbr的傳輸 1pass, constant ratefactor: Constant Rate Factor (or Constant Quality)(1) Same as ABR.(2) The scaling factor is a constant based on the -crf argument.(3) No overflow compensation is done. ra
31、tefactor是指: constant quantizer:QPs are simply based on frame type. RC中的蛋雞悖論:為了計(jì)算當(dāng)前幀中宏塊的RDO,需利用已定qp確定當(dāng)前幀或宏塊的cost預(yù)測每個(gè)宏塊的mode mv ref等. ratecontrol是在確定mode mv ref后決定qp,在此之前qp不能獲得。 于是rdo與rc不知道先做哪個(gè)了. x264命令行參數(shù)解釋 收藏 本文對應(yīng)的是x264命令行模式,VFW方式也用相同的參數(shù),不過是圖形界面,可以自己找對應(yīng)的英文。
32、; 使用格式:x264 默認(rèn)選項(xiàng) -o 輸出文件 輸入文件 長x寬輸入支持格式:RAW/y4m/avi/avs(編譯時(shí)可選)輸出支持格式:264/mkv/mp4(編譯時(shí)可選) x264的許多參數(shù)可以有-/-兩種輸入法,筆者也不知道為什么。以下等價(jià)參數(shù)用“參數(shù)1/參數(shù)2 <必需數(shù)值格式>”表示,參數(shù)尾部()內(nèi)為個(gè)人推薦。 -h/-help 幫助 幀類型選項(xiàng): -I/-keyint <整數(shù)> 最大IDR幀間距,默認(rèn)250-i/-min-keyint <整數(shù)> 最小IDR幀間
33、距,默認(rèn)25-scenecut <整數(shù)> 畫面動態(tài)變化限,當(dāng)超出此值時(shí)插入I幀,默認(rèn)40-b/-bframes <整數(shù)> 在IP幀之間可插入的B幀數(shù)量最大值,范圍016,默認(rèn)0-no-b-adapt 關(guān)閉自適應(yīng)B幀判定(-b設(shè)為1時(shí)可用,其他不推薦)-b-bias <整數(shù)> 控制插入B幀判定,范圍-100+100,越高越容易插入B幀,默認(rèn)0-b-pyramid
34、; 允許B幀做參考幀-no-cabac 關(guān)閉內(nèi)容自適應(yīng)二進(jìn)制算術(shù)編碼(CABAC,高效率的熵編碼)(會提高速度,但嚴(yán)重影響質(zhì)量)-r/-ref <整數(shù)> 最大參考幀數(shù),范圍016,默認(rèn)1-nf
35、 關(guān)閉環(huán)路濾波(一種除馬賽克算法)-f/-filter <alpha:beta>設(shè)置環(huán)路濾波的AlphaC和Beta的參數(shù),范圍-6-6,默認(rèn)都為0 碼率控制選項(xiàng): -q/-qp <整數(shù)> 固定量化模式并設(shè)置使用的量化值,范圍051,0為無損壓縮,默認(rèn)26 -B/-bitrate <整數(shù)> 設(shè)置平均碼率-crf &l
36、t;整數(shù)> 質(zhì)量模式,量化值動態(tài)可變(目前不太成熟,質(zhì)量不如設(shè)置固定量化值)-qpmin <整數(shù)> 設(shè)置最小量化值,范圍051,默認(rèn)10-qpmax <整數(shù)> 設(shè)置最大量化值,范圍051,默認(rèn)51-qpstep <整數(shù)> 設(shè)置相鄰幀之間的量化值差,范圍050,默認(rèn)4-ratetol <小數(shù)> 平均碼率模式下,瞬時(shí)碼率可以偏離的倍數(shù),范圍0.1100.0,默認(rèn)1.0-vbv-maxrate <整數(shù)> 平均碼率模式下,最大瞬時(shí)碼率,默認(rèn)0(與-B設(shè)置相同)-vbv-bufsize <整數(shù)> 碼率控制緩沖區(qū)的大小,單位kb
37、it,默認(rèn)0-vbv-init <小數(shù)> 碼率控制緩沖區(qū)數(shù)據(jù)保留的最大數(shù)據(jù)量與緩沖區(qū)大小之比,范圍01.0,默認(rèn)0.9 -ipratio <小數(shù)> I幀和P幀之間的量化系數(shù),默認(rèn)1.40-pbratio <小數(shù)> P幀和B幀之間的量化系數(shù),默認(rèn)1.30-色度-qp-offset <整數(shù)> 色度和亮度之間的量化差,范圍-12+12,默認(rèn)0 -p/-pass <1|2|3> 多次壓縮碼率控制1:第一次壓縮,創(chuàng)建統(tǒng)計(jì)文件2:按建立的統(tǒng)計(jì)文件壓縮并輸出,不覆蓋統(tǒng)計(jì)文件,3:按建立的統(tǒng)計(jì)文件壓縮,優(yōu)化統(tǒng)計(jì)文件-stats &
38、lt;字符串> 統(tǒng)計(jì)文件的名稱,默認(rèn)"x264_2pass.log"-rceq <字符串> 速率控制公式,默認(rèn)"blurCplx(1-qComp)"-qcomp <小數(shù)> 線性量化控制,0.0為固定碼率,1.0為固定量化值,默認(rèn)0.6,只用于2-pass和質(zhì)量模式-cplxblur <小數(shù)> 根據(jù)相鄰幀平滑量化值比例的最大值,范圍099.9,默認(rèn)20.0,只用于2-pass和質(zhì)量模式-qblur <小數(shù)> 對統(tǒng)計(jì)文件結(jié)果平滑量化值比例的最大值,范圍099.9,默認(rèn)0.5,只用于2-pass
39、-zones <z0>/<z1>/ 分段量化,格式為:<開始幀>,<結(jié)束幀>,<選項(xiàng)>,可選項(xiàng)為:q=<整數(shù)>(量化值)或b=<小數(shù)>(碼率倍數(shù)) 分析選項(xiàng): -A/-analyse <字符串> 動態(tài)塊劃分方法,默認(rèn)"p8x8,b8x8,i8x8,i4x4"。可選項(xiàng):p8x8/p4x4/b8x8/i8x8/i4x4;none/all(p4x4需要p8x8. i8x8需要-8x8dct)-direct <字符串> &
40、#160; 動態(tài)預(yù)測方式,默認(rèn)"spatial"??蛇x項(xiàng):none/spatial/temporal/auto-w/-weightb 允許B幀加權(quán)預(yù)測(可以減少相鄰B幀質(zhì)量低的影響)-me <字符串> 對全像素塊動態(tài)預(yù)測搜索的方式,默認(rèn)"hex",可選項(xiàng):dia:菱形搜索,半徑1 (快)hex:正六邊形搜索,半徑2umh:可變半徑六邊形搜索esa:全面搜索(很慢,而且效果與umh幾乎相同)-merange <整數(shù)> -me為umh/esa時(shí)的搜索半徑,最大64,默認(rèn)16-m/-subme <整數(shù)>
41、; 動態(tài)預(yù)測和分區(qū)方式,可選項(xiàng)17,默認(rèn)5(與壓縮質(zhì)量和時(shí)間關(guān)系密切,1是7速度的四倍以上)1:用全像素塊進(jìn)行動態(tài)搜索,對每個(gè)塊再用快速模式進(jìn)行四分之一像素塊精確搜索2:用半像素塊進(jìn)行動態(tài)搜索,對每個(gè)塊再用快速模式進(jìn)行四分之一像素塊精確搜索3:用半像素塊進(jìn)行動態(tài)搜索,對每個(gè)塊再用質(zhì)量模式進(jìn)行四分之一像素塊精確搜索4:用快速模式進(jìn)行四分之一像素塊精確搜索5:用質(zhì)量模式進(jìn)行四分之一像素塊精確搜索6:進(jìn)行I、P幀像素塊的速率失真最優(yōu)化(rdo)7:進(jìn)行I、P幀運(yùn)動矢量及塊內(nèi)部的速率失真最優(yōu)化(質(zhì)量最好)-b-rdo B幀也進(jìn)行rdo,需要-subme在6以上-mixed-refs 可以在一幀內(nèi)使用不
42、同參考幀-no-chroma-me 不進(jìn)行色度的動態(tài)預(yù)測-bime 可以平均B幀參考塊的運(yùn)動矢量-8/-8x8dct 可以使用8x8的離散余弦變換(DCT)-t/-trellis <整數(shù)> Trellis量化,對每個(gè)8x8的塊尋找合適的量化值,需要CABAC,默認(rèn)00:關(guān)閉1:只在最后編碼時(shí)使用2:一直使用-no-fast-pskip 關(guān)閉快速P幀跳過檢測-no-dct-decimate 關(guān)閉P幀聯(lián)合編碼(可以增加細(xì)節(jié),但也會增大體積)-nr <整數(shù)>
43、 噪聲去除,范圍0100000,默認(rèn)0 -cqm <字符串> 設(shè)置外部量化矩陣格式,默認(rèn)"flat",可選項(xiàng):jvt/flat-cqmfile <字符串> 讀取JM格式的外部量化矩陣文件,自動忽略其他-cqm*選項(xiàng)-cqm4 <list> 設(shè)置4x4的量化矩陣,用逗號分開,范圍1255的16個(gè)整數(shù)-cqm8 <list> 設(shè)置8x8的量化矩陣,用逗號分開,范圍1255的64個(gè)整數(shù)-cqm4i/-cqm4p/-cqm8i/-cqm8p 設(shè)置I、P幀不同的量化矩陣-cqm4iy/-cqm4ic/-cqm4py/-cqm4
44、pc 設(shè)置亮度、色度不同的量化矩陣 視頻標(biāo)準(zhǔn)化選項(xiàng):這些選項(xiàng)與編碼無關(guān),不過如果要用mp4之類的播放器,可以設(shè)置,風(fēng)險(xiǎn)自擔(dān) -sar width:height 設(shè)置長寬比-overscan <字符串> 過掃描線,默認(rèn)"undef"(不設(shè)置),可選項(xiàng):show(觀看)/crop(去除)-videoformat <字符串> 視頻格式,默認(rèn)"undef",可選項(xiàng):component/pal/ntsc/secam/mac/undef-fullrange <字符串> Spe
45、cify full range samples setting,默認(rèn)"off",可選項(xiàng):off/on(我也不明白這是干什么的,請高手指點(diǎn))-colorprim <字符串> 原始色度格式,默認(rèn)"undef",可選項(xiàng):undef/bt709/bt470m/bt470bg,smpte170m/smpte240m/film-transfer <字符串> 轉(zhuǎn)換方式,默認(rèn)"undef",可選項(xiàng):undef/bt709/bt470m/bt47
46、0bg/linear,log100/log316/smpte170m/smpte240m-colormatrix <字符串> 色度矩陣設(shè)置,默認(rèn)"undef",undef/bt709/fcc/bt470bg,smpte170m/smpte240m/GBR/YCgCo-chromaloc <整數(shù)> 色度樣本指定,范圍05,默認(rèn)0 輸入、輸出選項(xiàng): -level <字符串> 設(shè)定等級(as defined by Annex A)(不明白,請高手指點(diǎn))-fps <小數(shù)> 設(shè)定幀率-seek <整
47、數(shù)> 設(shè)定起始幀-frames <整數(shù)> 最大編碼幀數(shù)-o/-output 指定輸出文件 -threads <整數(shù)> 編碼線程(使用分片技術(shù))-thread-input 在編碼線程中運(yùn)行Avisynth-no-asm 關(guān)閉全部CPU優(yōu)化指令-no-psnr 關(guān)閉PSNR計(jì)算-quiet 安靜模式-v/-verbose 顯示每一個(gè)幀的信息-progress 顯示編碼進(jìn)程-visualize 顯示運(yùn)動矢量-sps-id <整數(shù)> 設(shè)置SPS和PPS的ID值,默認(rèn)0-aud 使用數(shù)據(jù)單元定義符號x264中重要結(jié)構(gòu)體說明 收藏 首先解釋一下cli_o
48、pt_t的這個(gè)_t代表結(jié)構(gòu)圖可能是type的意思。同時(shí)還有很多i_ b_等作為前綴的變量,其中的I_表示int類型的變量 b表示bool類型的。依次類推。 正式進(jìn)入主題。 typedef struct int b_progress; int i_seek; hnd_t hin; hnd_t hout; FILE *qpfile; cli_opt_t;此結(jié)構(gòu)體是記錄一些與編碼關(guān)系較小的設(shè)置信息的o
49、pt=option。結(jié)構(gòu)體內(nèi)部的變量都可以通過讀取main()的參數(shù)獲得。也就是argv。b_progress表示一個(gè)bool類型的變量,看參數(shù)幫助 也就是x264-help你會知道,他是用來控制是否顯示編碼進(jìn)度的一個(gè)東西。取值為0,1.I_seek 整數(shù)類型 表示開始從哪一幀編碼。因?yàn)椴灰欢◤倪@個(gè)文件的第一幀開始編碼,這是可以控制的。Hnd_t(hnd=handle)是一個(gè)空指針, void *在C語言里空指針是有幾個(gè)特性的,他是一個(gè)一般化指針,可以指向任何一種類型,但卻不能解引用,需要解引用的時(shí)候,需要進(jìn)行強(qiáng)制轉(zhuǎn)換。采用空指針的策略,應(yīng)該是為了聲明變量的簡便和統(tǒng)一。Hin 指向輸入yuv文
50、件的指針。Hout 指向編碼過后生成的文件的指針。Qpfile 是一個(gè)指向文件類型的指針,他是文本文件,其每一行的格式是framenum frametype QP用于強(qiáng)制指定某些幀或者全部幀的幀類型和QP(quant param量化參數(shù))的值。x264_param_default( ¶m ); 這部分設(shè)置編碼參數(shù)的缺省值附結(jié)構(gòu)體param中部分變量的意義: param->i_csp = X264_CSP_I420; /
51、設(shè)置輸入的視頻采樣的格式param->vui.i_sar_width = 0; /VUI:video usability information param->i_fps_num = 10; /幀率 param->i_fps_den = 1; /用兩個(gè)整型的數(shù)的比值,來表示幀率 /* Encoder pa
52、rameters */ param->i_frame_reference = 1; /參考幀的最大幀數(shù)。 param->i_bframe = 0; /兩個(gè)參考幀之間的B幀數(shù)目。 param->b_deblocking_filter = 1; /去塊效應(yīng)相關(guān) param->b_cabac = 0;
53、160; /cabac的開關(guān) param->i_cabac_init_idc = -1; param->rc.b_cbr = 1; /constant bitrate 恒定碼率控制模式 param->rc.i_bitrate = 0;
54、 /默認(rèn)的碼率 param->rc.i_rc_buffer_size = 0; /buffer的大小 param->rc.i_rc_init_buffer = 0; /param->rc.i_rc_sens = 100; /* rate control sensitivityparam->rc.i_rc_method = X264_R
55、C_NONE; /碼率控制,CQP(恒定質(zhì)量)、/CRF(恒定碼率)、ABR(平均碼率)param->rc.i_qp_constant = 26; /qp的初始值,最大最小的qp值, param->rc.i_qp_min = 10; /最小的qp值 param->rc.i_qp_max = 51;
56、0; /最大的qp值param->rc.i_qp_step = 4; /qp步長step。 param->rc.f_ip_factor = 1.4; /ip-i幀p幀的qp的差值 param->rc.f_pb_factor = 1.3; /pb-p幀b幀的qp的差值/* Log */ /整個(gè)param的一個(gè)log文件 /*analyse */
57、;param->ra = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8; /楨內(nèi)分析 param->er = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8
58、0; |X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16; /楨間分析 param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL; /預(yù)測模式param->analyse.i_me_method = X264_ME_HEX; /運(yùn)動估計(jì)模式param->analyse.i_me_range = 16;
59、0; /運(yùn)動估計(jì)范圍 param->analyse.i_subpel_refine = 5; param->analyse.b_chroma_me = 1; param->analyse.i_mv_range_thread = -1; param->analyse.i_mv_range = -1; / set from level_idc
60、0; param->analyse.i_direct_8x8_inference = -1; / set from level_idc param->analyse.i_chroma_qp_offset = 0; param->analyse.b_fast_pskip = 1; param->analyse.b_dct_decimate = 1; param
61、->analyse.i_luma_deadzone0 = 21; param->analyse.i_luma_deadzone1 = 11; param->analyse.b_psnr = 1; param->analyse.b_ssim = 1; param->i_cqm_preset = X264_CQM_FLAT; /自定義量化矩陣(
62、CQM),初始化量化模式為flat typedef struct /* In: force picture type (if not auto) * If x264 encoding parameters are violated in the forcing of picture types, * &
63、#160; x264 will correct the input picture type and log a warning. * The quality of frametype decisions may suffer if a great deal of fine-grained * mixing of auto and forced frametypes i
64、s done. * Out: type of the picture encoded */ int i_type; /* In: force quantizer for > 0 */ int i_qpplus1; /* In: user pts,
65、 Out: pts of encoded picture (user)*/ int64_t i_pts; /* In: raw data */ x264_image_t img; x264_picture_t; 具體的含義理解參考了read_frame_yuv()x264_picture_alloc(); I_type 指明被編碼圖像的類型,有X264_TYPE_AUTO X264_TYPE_ID
66、R X264_TYPE_I X264_TYPE_P X264_TYPE_BREF X264_TYPE_B可供選擇,初始化為AUTO,說明由x264在編碼過程中自行控制。 I_qpplus1 :此參數(shù)減1代表當(dāng)前畫面的量化參數(shù)值。 I_pts :program time stamp 程序時(shí)間戳,指示這幅畫面編碼的時(shí)間戳。 Img :存放真正一副圖像的原始數(shù)據(jù)。 typedef struct &
67、#160; int i_csp; int i_plane; int i_stride4; uint8_t *plane4; x264_image_t; Csp: color space parameter 色彩空間參數(shù) X264只支持I420 i_Plan
68、e 代表色彩空間的個(gè)數(shù)。一般為3,YUV,初始化為 x264常用options整理 收藏 x264源碼解析2009年11月12日 星期四 22:44 x264源碼解析(01) 由main函數(shù)進(jìn)入?yún)?shù)設(shè)置后開始Encode函數(shù)。這里只把Encode函數(shù)體解析下,借鑒了很多網(wǎng)上資源(即使不全是自己原話也是親手打字上去的哦_),感謝網(wǎng)友。 代碼似懂非懂的注釋了下,盡當(dāng)資源存儲吧吧,暫且發(fā)到博客大家討論批評。static int Encode( x26
69、4_param_t *param, cli_opt_t *opt ) x264_t *h; /還不知道干啥的,這個(gè)結(jié)構(gòu)也很煩,不壓x264_param_t x264_picture_t pic; /一幀的結(jié)構(gòu)體,色度存儲 int i_frame, i_frame_total; int64_t i_start, i_end; /用來計(jì)算時(shí)間 int64_t i_file;
70、 int i_frame_size; int i_update_interval; char buf200; opt->b_progress &= param->i_log_level < X264_LOG_DEBUG; i_frame_total = p_ge
71、t_frame_total( opt->hin ); i_frame_total -= opt->i_seek; if( ( i_frame_total = 0 | param->i_frame_total < i_frame_total ) && param->i_frame_total > 0 ) i_
72、frame_total = param->i_frame_total; param->i_frame_total = i_frame_total; /上面這段代碼是實(shí)現(xiàn),計(jì)算文件中的總共的幀數(shù),并根據(jù)輸入的參數(shù)初始幀的位置, /對i_frame_total做出修正,i_frame_total -= opt->i_seek,然后再根據(jù)param->i_frame_total,
73、0; /對i_frame_total做出進(jìn)一步的修正。 /總體來說,就是對參數(shù)設(shè)置中的進(jìn)行編碼的幀數(shù)的總數(shù)進(jìn)行修正和計(jì)算。 i_update_interval = i_frame_total ? x264_clip3( i_frame_total / 1000, 1, 10 ) : 10; if( ( h = x264_encoder_open( param ) ) = NULL )/關(guān)鍵函數(shù):x264_
74、encoder_open( param ) 根據(jù)參數(shù)要求對encoder進(jìn)行一系列的初始化,例如分配內(nèi)存,值的初始化等。 (略) if( p_set_outfile_param( opt->hout, param ) )/關(guān)鍵函數(shù):p_set_outfile_param() 設(shè)置輸出文件格式
75、0; (略) /* Create a new pic */ /關(guān)鍵函數(shù):x264_picture_alloc() 按照色度空間分配內(nèi)存,并返回內(nèi)存的首地址作為指針 if( x264_picture_alloc( &pic, X264_CSP_I420, param->i_width, param->i_height ) < 0 )
76、; (略) /關(guān)鍵函數(shù):x264_mdate() 用于編碼用時(shí)的計(jì)算,設(shè)定起始時(shí)間 i_start = x264_mdate(); /* Encode frames */ for( i_frame = 0, i_file = 0; b_ctrl_c = 0 &a
77、mp;& (i_frame < i_frame_total | i_frame_total = 0); ) /p_read_frame() 按照h->hin提供的輸入文件的地址,讀入圖像的內(nèi)容到&pic提供的存儲區(qū)的首地址 if( p_read_frame( &pic, opt->hin,
78、 i_frame + opt->i_seek ) ) break; pic.i_pts = (int64_t)i_frame * param->i_fps_den; if( opt->qpfile )
79、; parse_qpfile( opt, &pic, i_frame + opt->i_seek );/parse_qpfile() 為從指定的文件中讀入qp的值留下的接口,qpfile為文件的首地址 else /* Do not fo
80、rce any parameters */ pic.i_type = X264_TYPE_AUTO; pic.i_qpplus1 = 0;/ 參數(shù)減1代表當(dāng)前畫面的量化參數(shù)值
81、160; i_frame_size = Encode_frame( h, opt->hout, &pic );/*核心程序 (略) /* update status line (up to 1000 times per input file) */ /用于顯示整個(gè)編碼過程的進(jìn)度 if( opt->b_progress && i_frame % i_update_interval = 0 ) int64_t i_elapsed = x264
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 5.1 物體的質(zhì)量說課稿 2025年初中物理八年級上冊
- 2025年全自動流體包裝設(shè)備項(xiàng)目發(fā)展計(jì)劃
- 2025年黨員領(lǐng)導(dǎo)干部學(xué)法用法知識考試模擬試題及答案(共七套)
- 街道物業(yè)態(tài)發(fā)言材料
- 外國禮儀合作協(xié)議
- 1例尖吻蝮咬傷致腦梗死應(yīng)用阿替普酶溶栓的臨床效果分析
- 《深度學(xué)習(xí)項(xiàng)目案例開發(fā)》課件-任務(wù)五:使用遷移學(xué)習(xí)完成垃圾分類
- 2025年度北京市城市綠化養(yǎng)護(hù)項(xiàng)目勞動合同范本
- 危險(xiǎn)品運(yùn)輸司機(jī)合作協(xié)議
- 快遞物流高效配送調(diào)度策略
- 電動汽車電機(jī)驅(qū)動控制系統(tǒng)設(shè)計(jì)
- 醫(yī)療器械公司員工入職培訓(xùn)
- 獸藥行業(yè)供銷模式分析
- 校園綠化養(yǎng)護(hù)投標(biāo)方案技術(shù)標(biāo)
- 小蘿卜頭的故事演講稿3分鐘三篇
- 卷揚(yáng)機(jī)驗(yàn)收表格
- 14天攻克KET詞匯表
- 張祖濤:新課改背景下思想政治教師的專業(yè)發(fā)展77課件
- 百萬機(jī)組PSS參數(shù)整定試驗(yàn)方案
- 查泰萊夫人的情人
- 寧夏水利建筑工程預(yù)算定額
評論
0/150
提交評論