X264用法
x264命令介绍
[X264] [转贴] x264命令介绍——herohero12.21 11:13Q x264命令介绍一语法: x264 [options] -o outfile infile [widthxheight]infile参数是 YUV 4:2:0 格式的,如果编译的时候选择支持AVIS,那么可以是avi格式的。
outfile参数指定输出文件名,格式根据扩展名定义.264 -> H.264码流格式.mp4 -> MP4 ,需要支持GPAC.Options-h, --help 打印帮助。
-I, --keyint <integer> 最大的GOP尺寸是250-i, --min-keyint <integer> 最小的GOP尺寸是25--scenecut <integer> 多少间隔插入I帧(默认40)-b, --bframes <integer> 在I帧和P帧之间B帧的数量(默认0)--no-b-adapt 显示B帧说明--b-bias <integer> 指示B帧如何被使用(默认0)--b-pyramid 保持一些帧的引用--no-cabac 不使用CABAC-r, --ref <integer> 引用帧的数量--nf 不使用loop filter-f, --filter <alpha:beta> Loop filter 的 AlphaC0 和 Beta 参数 [0:0]-q, --qp <integer> 设置QP [26]-B, --bitrate <integer> 设置码率,注意单位是K。
--qpmin <integer> 设置最小QP值 [10]--qpmax <integer> 设置最大QP值 [51]--qpstep <integer> 设置最大QP 步进值 [4]--ratetol <float> 运行变化的码率值 [1.0]--vbv-maxrate <integer> 最大的本地码率 [0]--vbv-bufsize <integer> VBV 缓冲区尺寸 [0]--vbv-init <float> 初始VBV缓冲区占用率 [0.9]--ipratio <float> 在I帧和P帧之间的QP factor [1.4]--pbratio <float> 在P帧和B帧之间的QP factor [1.3]--chroma-qp-offset <integer> 在 chroma和luma之间,QP调整值 [0]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<hero12.21 11:14x264命令介绍二-p, --pass <1|2|3> 激活 multipass ratecontrol:- 1: 创建状态文件- 2: 不重写状态文件- 3: 在文件中显示更多信息--stats <string> 选择2 pass状态是的文件名 [x264_2pass.log]--rceq <string> 码率控制公式 ["blurCplx^(1-qComp)"]--qcomp <float> QP 曲线压缩: 0.0 => CBR, 1.0 => CQP 0.60]--cplxblur <float> 在QP时缩小波动 (从曲线压缩之前) [20.0]--qblur <float> 在QP时缩小波动 (在曲线压缩之后) [0.5]-A, --analyse <string> 分析选项: ["i4x4,p8x8,b8x8"]- i4x4- p8x8, p4x4, b8x8- none, all--direct <string> 指示 MV 预言模式 ["temporal"]- none, spatial, temporal-w, --weightb B帧的预判参数--me <string> 整数象素运动估算模式 ["hex"]- dia: 菱形查找, 半径 1 (fast)- hex: 六边形查找,半径 2- esa: 穷举搜索算法(slow)--merange <integer> 最大的运动向量搜索矩形 [16]-m, --subme <integer> Subpixel运动估算质量: 1=fast, 5=best. [5]--no-chroma-me 在运动估算中忽略色度--level <integer> 指定level(在Annex A定义)--sar width:height 指定宽高的比率--fps <float|rational> 指定帧率--seek <integer> 指定编码的第一帧--frames <integer> 编码的最大帧数量-o, --output 指定输出文件--no-asm 取消所有CPU优化--no-psnr 取消 PSNR 估算--quiet Quiet模式-v, --verbose 打印每一帧的状态--progress 在编码时显示处理指示进度--visualize 在编码视频时显示MB--aud 使用存储分隔符。
x264学习笔记(1)-函数调用流程
/* 1: Copy the picture to a frame and move it to a buffer */
x264_stack_align( x264_slicetype_decide, h )
/* 2: Select frame types */
x264_frame_push()
/* 3: move some B-frames and 1 non-B to encode queue */
i_file = 0; b_ctrl_c == 0 &&
(i_frame < i_frame_total || i_frame_total ==
0); )
parse_qpfile() Encode_frame()
i_frame++;
分析量化表,如果有 编码一帧
打印输出信息
编码循环结束 Encode_frame( )
Flush delayed B-frames
x264_mdate() x264_picture_clean( &pic );
x264_encoder_close( h ); x264_free( mux_buffer ); p_close_infile( opt->hin ); p_close_outfile( opt->hout );
Encode()函 数,编码器
主循环
main() (x264.c)
x264_param_default()
Parse()
分析命令行参数,并 打开输入输出文件
Encode()
x264_encoder_open()
初始化编码器参数,以及 编码器用到的函数
X264编码参数设置
X264编码参数设置By:林立翔standfly@北京邮电大学多媒体通信中心2011-11一,X264版本本项目使用X264编码版本为20091008-2245,附带FFMPEG解码器用以验证编码效果。
二,编译条件本测试在windows xp平台下的visual studio 2008 编译环境下进行三,软件配置1. 打开X264CODEC文件夹,双击X264CODEC解决方案,用Visual Studio 2008打开工程文档2. 单击左上角解决方案资源管理器中X264ENCODE解决方案—>击右键 左击属性,进入X264ENCODE属性页—>选择配置属性—>调试—>在右栏的命令参数中输入所需的编码参数。
四,编码参数设置1.x264基本参数设置格式[--参数名参数值 ...] --output 输出文件输入文件其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。
观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号。
此外,还有短参数模式。
这是为了简化某些常用参数名设计的。
一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。
注意此时这个字母区分大小写。
在--fullhelp 列表里,有短参数的参数的短参数都列在此参数的前面。
2.本测试预设的编码参数--crf 23 --tune psnr --preset medium --output X:\xxx\xxx.264 --fps 25 X:\广科院测试序列\左测试序列1.yuv 1920x1080其中,1).crfcrf为一种根据片子质量自动分配码率的 vbr 码率控制方式。
可用的值从 1到 51,越小编码质量越好,码率越高。
一般使用 16 到 24可以为浮点。
本测试预采用此参数或许不同码率下的编码数据。
X264简单配置详解
X264 简单配置详解1、X264 介绍X264 是一个基于 H264 的免费开源的视频编码器,属于后起之秀,采用x264 编解码的视频文件,相比较 xvid 或者其它流行的编解码器转换效率和转换后的画面质量都更加优异,已经受到众多非编人士的青睐。
2、Basic 基本配置preset 预设:通过preset 的参数调节编码速度和质量的平衡。
preset 预设参数类似于 WinRAR 的压缩方式参数,参数值有:UltraFast、SuperFast、VeryFast、Faster、Fast、Medium、Slow、Slower、VerySlow、Placebo。
从快到慢,参数越来越慢,越慢压缩比越高,消耗的时间也越长,默认是 Medium。
Tuning 优化:特别的情况时可以指定片子的类型和视觉优化的参数。
默认值为None,没有特殊要求的不用设置此项。
Tuning 的参数值有:●f ilm:电影、真人类型;●a nimation:动画类型;●g rain:需要保留大量的颗粒时使用;●s tillimage:静态图像编码时使用;●p snr:为提高psnr 做了优化的参数;解释:峰值信噪比(PSNR),是一种评价图像的客观标准。
●s sim:为提高 ssim 做了优化的参数;解释:一种衡量两幅图像相似度的指标,其值越大越好,最大为 1,经常用到图像处理中,特别在图像去噪处理中在图像相似度。
Profile 画质级别:X264 有四种画质级别,分别是baseline, extended, main, high;默认为:Auto(自动),其他参数值的含义:(1)Baseline Profile:基本画质。
支持 I/P 帧,只支持无交错(Progressive)和 CAVLC;(2)Extended profile:进阶画质。
支持 I/P/B/SP/SI 帧,只支持无交错(Progressive)和 CAVLC;(3)Main profile:主流画质。
X264参数设置(1)
0
设置VBV模式的最大码率,强烈建议如果使用,则用2-pass bitrate
Vbv-buffsize
0
设置VBV的最大Buffer大小
Vbv-init
0
初始化buffer值
qpmin
10
Qp最小量化值,qp值越小,视频越清晰,码率越高,一般qp小于16即接近无损压码
qpmax
Aq-mode
1
0:不使用AQ自适应模式,
1:使用
推荐:使用缺省值
Beta deblocking值越低,被去块化(deblock)的方块越少。增加Beta值,环状物(ringing)就越少,而降低Beta则DCT块越少(矛盾)?。/showthread.php?t=109747
如果你不需要编码很细,不介意偶尔的块,可以用-2:-1;如果你喜好更明亮的画面,且不介意一点点模糊,那就用1:2;动画则用低beta值;推荐用缺省值
X264参数设置(1)
X264参数设置
注:I帧:关键帧,P帧:预报帧,B帧:I帧和P帧之间的双向插值帧
名称
缺省值设置IDR帧的最大间隔为250帧,IDR帧就是可备用于拖拽的帧,IDR帧一定是I帧,反之不成立。最好是设成帧率的10倍。显然改值越小,P,B帧越少。
min-keyint
interlace
无
交错编码,无详细说明,缺省值
以下是码率控制
码率控制方法有三种:qp, bitrate, crf,他们是互斥的。三种方法目标不同:qp:固定量化子,bitrate:固定文件大小,crf固定视频“质量”
qp
无
固定量化模式(CQ),数值是针对P帧的量化值,I,B帧则根据ipratio和pbratio算出;0值表示无损压缩;推荐使用crf方法替代qp;值越小越清晰。
x264命令行参数解释
x264命令行参数解释使用格式:x264 默认选项 -o 输出文件输入文件 [长x宽]输入支持格式:RAW/y4m/avi/avs(编译时可选)输出支持格式:264/mkv/mp4(编译时可选)x264的许多参数可以有-/--两种输入法,笔者也不知道为什么。
以下等价参数用“参数1/参数2 <必需数值格式>”表示,参数尾部()内为个人推荐。
-h/--help 帮助帧类型选项:-I/--keyint <整数> 最大IDR帧间距,默认250-i/--min-keyint <整数> 最小IDR帧间距,默认25--scenecut <整数> 画面动态变化限,当超出此值时插入I帧,默认40-b/--bframes <整数> 在IP帧之间可插入的B帧数量最大值,范围0~16,默认0--no-b-adapt 关闭自适应B帧判定(-b设为1时可用,其他不推荐)--b-bias <整数> 控制插入B帧判定,范围-100~+100,越高越容易插入B帧,默认0--b-pyramid 允许B帧做参考帧--no-cabac 关闭内容自适应二进制算术编码(CABAC,高效率的熵编码)(会提高速度,但严重影响质量)-r/--ref <整数> 最大参考帧数,范围0~16,默认1--nf 关闭环路滤波(一种除马赛克算法)-f/--filter <alpha:beta>设置环路滤波的AlphaC和Beta的参数,范围-6-6,默认都为0码率控制选项:-q/--qp <整数> 固定量化模式并设置使用的量化值,范围0~51,0为无损压缩,默认26-B/--bitrate <整数> 设置平均码率--crf <整数> 质量模式,量化值动态可变(目前不太成熟,质量不如设置固定量化值)--qpmin <整数> 设置最小量化值,范围0~51,默认10--qpmax <整数> 设置最大量化值,范围0~51,默认51--qpstep <整数> 设置相邻帧之间的量化值差,范围0~50,默认4--ratetol <小数> 平均码率模式下,瞬时码率可以偏离的倍数,范围0.1~100.0,默认1.0 --vbv-maxrate <整数> 平均码率模式下,最大瞬时码率,默认0(与-B设置相同)--vbv-bufsize <整数> 码率控制缓冲区的大小,单位kbit,默认0--vbv-init <小数> 码率控制缓冲区数据保留的最大数据量与缓冲区大小之比,范围0~1.0,默认0.9--ipratio <小数> I帧和P帧之间的量化系数,默认1.40--pbratio <小数> P帧和B帧之间的量化系数,默认1.30--色度-qp-offset <整数> 色度和亮度之间的量化差,范围-12~+12,默认0-p/--pass <1|2|3> 多次压缩码率控制1:第一次压缩,创建统计文件2:按建立的统计文件压缩并输出,不覆盖统计文件,3:按建立的统计文件压缩,优化统计文件--stats <字符串> 统计文件的名称,默认"x264_2pass.log"--rceq <字符串> 速率控制公式,默认"blurCplx^(1-qComp)"--qcomp <小数> 线性量化控制,0.0为固定码率,1.0为固定量化值,默认0.6,只用于2-pass 和质量模式--cplxblur <小数> 根据相邻帧平滑量化值比例的最大值,范围0~99.9,默认20.0,只用于2-pass和质量模式--qblur <小数> 对统计文件结果平滑量化值比例的最大值,范围0~99.9,默认0.5,只用于2-pass--zones <z0>/<z1>/…分段量化,格式为:<开始帧>,<结束帧>,<选项>,可选项为:q=<整数>(量化值)或b=<小数>(码率倍数)分析选项:-A/--analyse <字符串> 动态块划分方法,默认"p8x8,b8x8,i8x8,i4x4"。
x264使用示例(初学者使用)
x264使用示例(初学者使用)x264使用示例/*** @note x264的编码示例.* 使用x264的版本为libx264-115* 1. 示例是个死循环,会源源不断的编码,然后将数据写文件.* 2. 示例的行为是:编码1000帧后,取空编码缓冲区,然后循环执行这两步.**/#include#include#include#include "stdint.h"extern "C"{#include "x264.h"};unsigned int g_uiPTSFactor = 0;int iNal = 0;x264_nal_t* pNals = NULL;int encode(x264_t* p264, x264_picture_t* pIn, x264_picture_t* pOut);int main(int argc, char** argv){int iResult = 0;x264_t* pX264Handle = NULL;x264_param_t* pX264Param = new x264_param_t;assert(pX264Param);//* 配置参数//* 使用默认参数x264_param_default(pX264Param);//* cpuFlagspX264Param->i_threads = X264_SYNC_LOOKAHEAD_AUTO;//* 取空缓冲区继续使用不死锁的保证.//* video PropertiespX264Param->i_width = 320; //* 宽度.pX264Param->i_height = 240; //* 高度pX264Param->i_frame_total = 0; //* 编码总帧数.不知道用0.pX264Param->i_keyint_max = 10;//* bitstream parameterspX264Param->i_bframe = 5;pX264Param->b_open_gop = 0;pX264Param->i_bframe_pyramid = 0;pX264Param->i_bframe_adaptive = X264_B_ADAPT_TRELLIS;//* 宽高比,有效果,但不是想要的.//pX264Param->vui.i_sar_width = 1080;//pX264Param->vui.i_sar_height = 720;//* LogpX264Param->i_log_level = X264_LOG_DEBUG;//* Rate control ParameterspX264Param->rc.i_bitrate = 1024 * 10;//* 码率(比特率,单位Kbps)//* muxing parameterspX264Param->i_fps_den = 1; //* 帧率分母pX264Param->i_fps_num = 25;//* 帧率分子pX264Param->i_timebase_den = pX264Param->i_fps_num;pX264Param->i_timebase_num = pX264Param->i_fps_den;//* 设置Profile.使用MainProfilex264_param_apply_profile(pX264Param,x264_profile_names[1]);//* 打开编码器句柄,通过x264_encoder_parameters得到设置给X264//* 的参数.通过x264_encoder_reconfig更新X264的参数pX264Handle = x264_encoder_open(pX264Param);assert(pX264Handle);//* 获取整个流的PPS和SPS,不需要可以不调用.iResult = x264_encoder_headers(pX264Handle, &pNals, &iNal);assert(iResult >= 0);//* PPS SPS 总共只有36B,如何解析出来呢?for (int i = 0; i < iNal; ++i){switch (pNals[i].i_type){case NAL_SPS:break;case NAL_PPS:break;default:break;}}//* 获取允许缓存的最大帧数.int iMaxFrames = x264_encoder_maximum_delayed_frames(pX264Handle);//* 编码需要的参数.iNal = 0;pNals = NULL;x264_picture_t* pPicIn = new x264_picture_t;x264_picture_t* pPicOut = new x264_picture_t;x264_picture_init(pPicOut);x264_picture_alloc(pPicIn, X264_CSP_I420, pX264Param->i_width, pX264Param->i_height);pPicIn->img.i_csp = X264_CSP_I420;pPicIn->img.i_plane = 3;//* 创建文件,用于存储编码数据FILE* pFile = fopen("agnt.264","wb");assert(pFile);//* 示例用编码数据.int iDataLen = pX264Param->i_width * pX264Param->i_height;uint8_t* data = new uint8_t[iDataLen];unsigned int uiComponent = 0;while (++uiComponent)//* 构建需要编码的源数据(YUV420色彩格式)::memset(data, uiComponent, iDataLen);::memcpy(pPicIn->img.plane[0], data, iDataLen);::memcpy(pPicIn->img.plane[1], data, iDataLen/4 ); ::memcpy(pPicIn->img.plane[2], data, iDataLen/4);if (uiComponent <= 1000){pPicIn->i_pts = uiComponent + g_uiPTSFactor * 1000; encode(pX264Handle, pPicIn, pPicOut);}else{//* 将缓存的数据取出int iResult = encode(pX264Handle, NULL, pPicOut);if (0== iResult){//break; //* 取空,跳出uiComponent = 0;++g_uiPTSFactor;/* {{ 这个解决不了取空缓冲区,再压缩无B帧的问题x264_encoder_reconfig(pX264Handle, pX264Param); x264_encoder_intra_refresh(pX264Handle);//* }} */}}//* 将编码数据写入文件.for (int i = 0; i < iNal; ++i){fwrite(pNals[i].p_payload, 1, pNals[i].i_payload, pFile);}}//* 清除图像区域x264_picture_clean(pPicIn);x264_picture_clean(pPicOut);//* 关闭编码器句柄x264_encoder_close(pX264Handle);pX264Handle = NULL;delete pPicIn ;pPicIn = NULL;delete pPicOut;pPicOut = NULL;delete pX264Param;pX264Param = NULL;delete [] data;data = NULL;return 0;}int encode(x264_t* pX264Handle, x264_picture_t* pPicIn, x264_picture_t* pPicOut){int iResult = 0;iResult = x264_encoder_encode(pX264Handle, &pNals, &iNal, pPicIn, pPicOut);if (0 == iResult){std::cout<<"编码成功,但被缓存了."<<std::endl;}elseif(iResult < 0){std::cout<<"编码出错"<<std::endl;}elseif (iResult > 0){std::cout<<"得到编码数据"<<std::endl;}/* {{ 作用不明unsigned char* pNal = NULL;for (int i = 0;i < iNal; ++i){int iData = 1024 * 32;x264_nal_encode(pX264Handle, pNal,&pNals[i]);}//* }} *///* 获取X264中缓冲帧数.int iFrames = x264_encoder_delayed_frames(pX264Handle);std::cout<<"当前编码器中缓存数据:"<<iframes<<"帧\n";return iFrames;}</iframes<<"帧\n"; </std::endl;</std::endl;</std::endl;。
[VCB-Studio][教程09]x264参数设置
[VCB-Studio][教程09]x264参数设置VCB-Studio教程09 x264参数设置0. 前言本教程旨在讲述x264参数设置的技巧,并侧重于vcb-s定位的使用:10bit,动漫,高码率,高参数。
对于非这类定位的压制,虽有叙述但不详细。
本教程请搭配MeGUI的参数设置面板一起阅读:本教程会按照标签卡(Main->Frame Type->…->Misc)分别讲解,每个标签卡内,按照从左上到左下,到右上到右下的顺序,讲述每个参数的使用,并给出它们在批处理命令行中的写法。
或者,你完全可以在MeGUI中调好,然后复制下方的命令行(去掉开头的program和结尾的--output "output" "input")到批处理。
后续会有教程讲述低码率下8bit压制的技巧。
不要将本篇中讲述的任何参数和逻辑套用在x265上。
1. Main标签卡,x264基础设置Main标签卡里面都是最主要的参数,新手上路,掌握Main标签卡的内容,就足以去一些普通字幕组担任压制了。
Encoding Mode(rc,ratecontrol,码率控制方法):ABR: Average Bit Rate,指定一个平均码率。
x264会试图让整部视频的平均码率达到你的给定值。
如果视频前后编码复杂度相差很大,那么码率的时间分配效果就很差,尤其是到了结尾,为了达到预定的码率值,x264经常不得不采用过高/过低的码率。
所以一般不推荐这个模式。
命令行: --bitrate 1000,1000是码率,单位Kbps。
Const quantizer:cq模式,固定量化模式。
所有P帧(下文有讲)采用一个固定的Quantizer。
Quantizer, 量化,是一种衡量图像压缩程度的方法,用0-69的浮点数表示,0为无损。
图像被压缩的越多,量化值越大,码率越低,注意量化值不一定代表目视质量,比如说一个纯色的图像可以以很高的量化值被量化,占用的体积很小,而一个很复杂的图像就算量化值不高,但是压缩后观感也可能很差。
X264参数设定详细解释
X264参数设定详细解释x264 core:65 r1074M b6bb3d4Syntax: x264 [options] -o outfile infile [widthxheight]语法(命令行写法):x264 [参数] -o 输出文件名输入文件名[宽x高]范例:x264 --crf 26 --ref 3 --mixed-refs --bframes 3 --b-adapt 2 --b-pyramid --weightb --deblock -1:-1 --trellis 2 --partitions all --8x8dct --me umh --threads auto --thread-input --aud --progress --no-psnr --no-ssim -o output.mp4 input.avs 720x480 Infile can be raw YUV 4:2:0 (in which case resolution is required),or YUV4MPEG 4:2:0 (*.y4m),or AVI or Avisynth if compiled with AVIS support (yes).输入文件可以是RAW YUV 4:2:0(在某些情况下分辨率是必需的)或者YUV4MPEG 4:2:0 (*.y4m)或者AVI 或Avisynth(后面的yes说明支持AVS输入)Outfile type is selected by filename:.264 -> Raw bytestream.mkv -> Matroska.mp4 -> MP4 if compiled with GPAC support (yes)输出文件类型由输出文件名指定:.264 -> Raw 格式.mkv -> MKV格式.MP4 -> MP4格式(yes说明支持MP4输出)Options:可选参数:-h, --help List the more commonly used options --longhelp List all options-h, --help 显示常用参数--longhelp 显示全部参数注:-h,--help代表-h与--help两者都可以,-h是简化写法举个例子:x264 -h与x264 --help两者效果等价——————————————————————————————————————Frame-type options:帧-类型选项:-I, --keyint Maximum GOP size [250]说明:指定两个IDR帧之间的最大间隔,默认250推荐值:默认或者FPS的10倍范例:--keyint 300注:[250]代表默认值为250提示:若想使用默认值,不使用参数即可-i, --min-keyint Minimum GOP size [25]说明:指定两个IDR帧之间的最小间隔,默认25推荐值:默认或者FPS的大小范例:--min-keyint 30问题:如何查看FPS?/zh-CN去上面的网站下载mediainfo查看--scenecut How aggressively to insert extra I-frames [40]说明:指定强制使用IDR帧的阀值,值越大强度越高,默认为40推荐值:默认范例:--scenecut 40--pre-scenecut Faster, less precise scenecut detection.Required and implied by multi-threading.说明:效果同scenecut,速度比scenecut快,但是精度稍低,默认设定为当threads>1时,永远使用--pre-scenecut 推荐值:默认-b, --bframes Number of B-frames between I and P [0]说明:设定I帧与P帧之间的最大B帧数量,范围0~16推荐值:3-6范例:--bframes 3--b-adapt Adaptive B-frame decision method [1]Higher values may lower threading efficiency.- 0: Disabled- 1: Fast- 2: Optimal (slow with high --bframes)说明:B帧自适应方法,默认为1- 0: 关闭- 1: 高速- 2: 最优化(--bframes的值越高速度越慢)推荐值:2范例:--b-adapt 2--b-bias Influences how often B-frames are used [0]说明:影响B帧使用的频繁程度,默认为0推荐值:0范例:--b-bias 0--b-pyramid Keep some B-frames as references说明:允许其它帧参考B帧,默认不使用推荐值:开启范例:--b-pyramid--no-cabac Disable CABAC说明:关闭CABAC,默认不使用-r, --ref Number of reference frames [1]说明:设定参考帧的数量,范围0~16,默认值为1,过大的值可能导致无法硬解,参考以下公式计算良好硬解的最大参考帧最大参考帧数量计算公式:maximum ref = 12288 * 1024 / ( width * height * 1.5)推荐值:3-6范例:--ref 3--no-deblock Disable loop filter说明:关闭deblock filter,默认不使用推荐值:默认范例:--no-deblock-f, --deblock Loop filter AlphaC0 and Beta parameters [0:0]说明:设定deblock filter参数,alpha为Deblocking strength,beta为Deblockingthreshold,值越大deblocking效果越好,画面越干净,但是会损失一些细节并有些许模糊,反之亦然,上下限不要超过-3,3,默认0,0推荐值:默认范例:--deblock 0:0--interlaced Enable pure-interlaced mode说明:隔行编码模式,默认关闭范例:--interlaced——————————————————————————————————————Ratecontrol:压缩比控制:-q, --qp Set QP (0=lossless) [26]说明:固定量化模式,值越小质量越好,默认为26,qp = crf + --qcomp 1推荐值:使用crf,见crf部分范例:--qp 26-B, --bitrate Set bitrate (kbit/s)说明:目标码率模式,生成的视频码率大小为指定的bitrate 的值,一般搭配--pass使用推荐值:720P以下码率为800-2100kbps之间,720P为3-6Mbps,1080P为8-15Mbps以上范例:--bitrate 1000--crf Quality-based VBR (nominal QP) 说明:固定压缩因子模式,值越小质量越好,一般搭配--qcomp使用推荐值:16-26范例:--crf 26--qcomp QP curve compression: 0.0 => CBR, 1.0 => CQP [0.60]说明:压缩曲线,范围为0~1之间,数值越小曲线越平坦,与crf搭配使用,默认为0.6推荐值:默认范例:--qcomp 0.6--vbv-maxrate Max local bitrate (kbit/s) [0]说明:设定VBV模式的最大码率,如果需要硬解必须开启VBV模式,默认为0范例:--vbv-maxrate 50000--vbv-bufsize Enable CBR and set size of the VBV buffer (kbit) [0]说明:设定VBV缓冲区的最大尺寸,其大小一般由硬件设备决定,默认为0范例:--vbv-bufsize 50000--vbv-init Initial VBV bufferoccupancy [0.9]说明:设定VBV缓冲区的初始填充尺寸,默认为0.9范例:--vbv-init 0.9--qpmin Set min QP [10]说明:设定qp的下限,默认为10范例:--qpmin 10--qpmax Set max QP [51]说明:设定qp的上限,默认为51范例:--qpmax 51--qpstep Set max QP step [4]说明:设定qp的最大步长,默认为4范例:--qpstep 4--ratetol Allowed variance of average bitrate [1.0]说明:允许最终码率偏离指定平均码率的百分比,只在1pass 中起作用,默认为1.0范例:--ratetol 1.0--ipratio QP factor between I and P [1.40]说明:设定I帧相对于P帧的量化比推荐值:默认范例:--ipratio 1.40--pbratio QP factor between P and B [1.30]说明:设定P帧相对于B帧的量化比推荐值:默认范例:--ipratio 1.30--chroma-qp-offset QP difference between chroma and luma [0]说明:chroma 与luma 的QP差异值,这个值会随着--psy-rd的使用自动调整为-2推荐值:默认范例:--chroma-qp-offset 0--aq-mode AQ method [1]- 0: Disabled- 1: Variance AQ (complexity mask)说明:自适应量化方法,可以改善某些场景过于模糊等问题,默认开启- 0: 关闭- 1: 可变AQ推荐值:默认范例:--aq-mode 1--aq-strength Reduces blocking and blurring in flat andtextured areas. [1.0]- 0.5: weak AQ- 1.5: strong AQ说明:指定AQ的强度,减小低细节宏块的量化值,默认1.0 - 0.5: 较弱的AQ- 1.5: 较强的AQ推荐值:默认范例:--aq-strength 1.0-p, --pass Enable multipass ratecontrol- 1: First pass, creates stats file- 2: Last pass, does not overwrite stats file- 3: Nth pass, overwrites stats file说明:多重压缩模式,1 pass 或N pass生成stats文件,2pass调用生成的stats文件对压缩进行优化,更合理的分配码率,一般没必要进行N pass- 1: 第1 pass,生成stats文件- 2: 最终pass,不覆盖stats文件- 3: 第N pass,覆盖stats文件推荐值:2范例:--pass 2--stats Filename for 2 pass stats["x264_2pass.log"]说明:指定stats文件名,默认为"x264_2pass.log"推荐值:默认范例:--stats "x264_2pass.log"--cplxblur Reduce fluctuations in QP (before curve compression) [20.0]说明:减小QP的波动(在曲线压缩以前),范围0~999推荐值:默认范例:--cplxblur 20--qblur Reduce fluctuations in QP (after curve compression) [0.5]说明:减小QP的波动(在曲线压缩之后),范围0~99推荐值:默认范例:--qblur 0.5--zones //... Tweak the bitrate of someregions of the videoEach zone is of the form,,where is eitherq= (force QP)or b= (bitrate multiplier)说明:调整视频中某一范围内的码率每个区域已以下形式出现,,为下面的任意一个q= (强制QP)或b= (指定bitrate)范例:--zone 0,1000,qp=30/30000,32000,b=0.5--qpfile Force frametypes and QPs说明:强制指定帧类型与QP推荐值:默认Analysis:分析:-A, --partitions Partitions to consider["p8x8,b8x8,i8x8,i4x4"]- p8x8, p4x4, b8x8, i8x8, i4x4- none, all(p4x4 requires p8x8. i8x8 requires --8x8dct.)说明:宏块分割方式,默认["p8x8,b8x8,i8x8,i4x4"]- p8x8, p4x4, b8x8, i8x8, i4x4- none, all(p4x4 需要p8x8. i8x8 需要--8x8dct.)推荐值:默认范例:--partitions "p8x8,b8x8,i8x8,i4x4"--direct Direct MV prediction mode ["spatial"]- none, spatial, temporal, auto说明:Direct预测方法,默认"spatial"- none, spatial, temporal, auto推荐值:"auto"范例:--direct "auto"--direct-8x8 Direct prediction size [1] - 0: 4x4- 1: 8x8- -1: smallest possible according to level说明:Direct预测大小,默认为-1- 0: 4x4- 1: 8x8- -1: 根据Level确定一个最小值范例:--direct 1-w, --weightb Weighted prediction forB-frames说明:允许对B帧进行加权预测范例:--weightb--me Integer pixel motion estimation method ["hex"]- dia: diamond search, radius 1 (fast)- hex: hexagonal search, radius 2- umh: uneven multi-hexagon search- esa: exhaustive search- tesa: hadamard exhaustive search (slow)说明:全像素动态预测方法,越往下精度越高,速度越慢,默认"hex"- dia: 菱形搜索, 半径1 (高速)- hex: 六边形搜索, 半径2- umh: 不规则多边形搜索- esa: 全面搜索- tesa: hadamard变换全面搜索(最慢)推荐值:"umh"范例:--me "umh"--merange Maximum motion vector search range [16]说明:最大动态矢量搜索范围,结合--me使用,对于dia与hex,允许的范围为4~16,umh以上可以超过16,值越大编码速度越慢,默认为16范例:--merange 16--mvrange Maximum motion vector length [-1 (auto)]说明:最大动态矢量长度推荐值:默认范例:--mvrange -1 --mvrange-thread Minimum buffer between threads [-1 (auto)]说明:线程之间的最小缓冲区大小推荐值:默认范例:--mvrange-thread -1 -m, --subme Subpixel motion estimation and mode decision [6]- 0: fullpel only (not recommended)- 1: SAD mode decision, one qpel iteration- 2: SATD mode decision- 3-5: Progressively more qpel- 6: RD mode decision for I/P-frames- 7: RD mode decision for all frames- 8: RD refinement for I/P-frames- 9: RD refinement for all frames说明:子像素动态预测模式策略,值越大效果越好,速度越慢,默认6- 0: 仅fullpel (不推荐)- 1: SAD模式策略, 1 qpel迭代- 2: SATD模式策略- 3-5: 依次qpel增加- 6: I/P-帧RD模式策略- 7: 所有帧RD模式策略- 8: I/P-帧RD refinement模式策略- 9: 所有帧RD refinement模式策略推荐值:6以上范例:--subme 7--psy-rd Strength of psychovisual optimization ["1.0:0.0"]#1: RD (requires subme>=6)#2: Trellis (requires trellis, experimental)说明:视觉优化,--psy-rd 1.0:0.0 代表#1为1.0,#2为0.0,#2还在测试阶段,默认1.0:0.0#1: RD (需要subme>=6)#2: Trellis (需要trellis, 测试阶段)推荐值:#1 (0~1.0),#2 0.0范例:--psy-rd 1.0:0.0--mixed-refs Decide references on a per partition basis说明:对每个宏块区进行参考帧判断,开启后可以提升质量,但会降低速度推荐值:开启范例:--mixed-refs--no-chroma-me Ignore chroma in motion estimation说明:在动态预测中忽略chroma推荐值:默认范例:--no-chroma-me-8, --8x8dct Adaptive spatial transform size说明:自适应空间变换大小推荐值:使用范例:--8x8dct-t, --trellis Trellis RD quantization. Requires CABAC. [0]- 0: disabled- 1: enabled only on the final encode of a MB- 2: enabled on all mode decisions说明:Trllis RD量化.需要CABAC,值越大速度越慢,默认0- 0:关闭- 1:基于宏块- 2:在所有模式策略中使用推荐值:1范例:--trellis 1--no-fast-pskip Disables early SKIP detection on P-frames说明:关闭早期的P帧快速检测,开启可以提升质量,但会减低一些速度,默认不使用推荐值:使用范例:--no-fast-pskip--no-dct-decimate Disables coefficientthresholding on P-frames说明:关闭P帧的系数阀值,默认不使用推荐值:默认范例:--no-dct-decimate--nr Noise reduction [0]说明:降噪,默认0推荐值:默认范例:--nr 0--deadzone-inter Set the size of the inter luma quantization deadzone [21]--deadzone-intra Set the size of the intra luma quantization deadzone [11]Deadzones should be in the range 0 - 32.说明:设定inter/intra luma deadzone 量化值的大小,范围0 - 32推荐值:默认范例:--deadzone-inter 21 --deadzone-intra 11--cqm Preset quant matrices ["flat"]- jvt, flat说明:预设量化矩阵- jvt, flat推荐值:默认范例:--cqm "flat"--cqmfile Read custom quant matricesfrom a JM-compatible fileOverrides any other --cqm* options.说明:读取自定义JM兼容的量化矩阵文件,无视任何以--cqm开头的参数范例:--cqm "mycqm"--cqm4 Set all 4x4 quant matrices Takes a comma-separated list of 16 integers.说明:设定所有4x4量化矩阵,它是一张以逗号分割的16个整数的表范例:--cqm"16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16"--cqm8 Set all 8x8 quant matricesTakes a comma-separated list of 64 integers.说明:设定所有8x8量化矩阵,它是一张以逗号分割的64个整数的表范例:参考--cqm4--cqm4i, --cqm4p, --cqm8i, --cqm8pSet both luma and chroma quant matrices说明:设定luma与chroma的量化矩阵范例:参考--cqm4--cqm4iy, --cqm4ic, --cqm4py, --cqm4pc Set individual quant matrices说明:单独设定量化矩阵范例:参考--cqm4Video Usability Info (Annex E):The VUI settings are not used by the encoder but aremerely suggestions tothe playback equipment. See doc/vui.txt for details. Use at your own risk.视频可用性信息:VUI设置在编码的时候不会用到,它仅仅作用于回放设备。
x264使用示例(初学者使用)
int main(int argc, char** argv)
{
int iResult = 0;
x264_t* pX264Handle = NULL;
//* 获取整个流的PPS和SPS,不需要可以不调用.
iResult = x264_encoder_headers(pX264Handle, &pNals, &iNal);
assert(iResult >= 0);
//* PPS SPS 总共只有36B,如何解析出来呢?
for (int i = 0; i < iNal; ++i)
//* 编码需要的参数.
iNal = 0;
pNals = NULL;
x264_picture_t* pPicIn = new x264_picture_t;
x264_picture_t* pPicOut = new x264_picture_t;
x264_picture_init(pPicOut);
iResult = x264_encoder_encode(pX264Handle, &pNals, &iNal, pPicIn, pPicOut);
if (0 == iResult)
{
std::cout<<"编码成功,但被缓存了."<<std::endl;
}else
if(iResult < 0)
x264_param_t* pX264Param = new x264_param_t;
x264实时编码的码率控制--一个简单的QP调节方法
x264实时编码的码率控制--一个简单的QP调节方法x264实时编码的码率控制一个简单的QP调节方法在用x264做实时视频,由于用在智能手机上,计算能力有限,网络带宽有限,故设计了一个简单的新的码率控制算法,效果还不错,与大家分享。
一般做实时视频,x264作者推荐用vbv-CBR模式,这样来稳定码流,适应带宽。
但对于嵌入式系统,CBR模式计算量较大。
CBR模式需要进行前期的半精度SATD值计算,以得到图像复杂度,进而得到预计的bits(这一SATD还用在slice type的选择,实际这个计算过程的函数就叫slice_type_decision,在lookaheand_get_frame中);通过预计bits与期望bits的比较得到qscale,进而得到本编码帧的QP。
当然若用上mb_tree,aq_mode 还更复杂。
这一前期的计算过程大致占整个计算量的12%-20%(根据参数的不同),但若略去这步,使用固定QP,码率波动较大。
现设计了一个新的模式,利用帧间的相似性,根据上一帧编码的实际bits与期望bits的差,来调节QP(帧级调整)。
实现上的思路也很简单,利用CQP模式的壳,在每帧编码前再次调节QP。
需要采用参数如下:--bframes 0 不要B帧对于嵌入式,手机等系统,建议采用:--scenecut 0---(不需额外增加i 帧,由于实时不需b帧,故一个GOP组中,只有一个IDR 帧及其余的P帧);--subme 1 1/4精度的SAD值--no-8x8dct (这个是high profile, 不需要,同样可加快编码,节省码流)--partition none 不要划分(可提高编码速度,节省码流,psnr基本不变)其余参数可参见,x264 --preset-veryfast的参数配置;好了接下来是帧级的码流控制,即调节QP;1. 在x264参数中添加新码率控制的参数(get_opt函数),如:--newqp2. 这个newqp与CQP,可以起使用。
X264参考手册
X264参考⼿册艺搜简介基本语法:x264 [options]-o outfile infile注意与ffmpeg的输⼊输出⽂件位置恰好相反:ffmpeg[options][[infile options]-i infile]... {[outfile options] outfile}…[]输⼊x264.exe -- NUL C:\input.avs x264 -- /dev/null ~/input.y4m当输⼊视频是原始YUV时,还必须指明分辨率。
你可能也要使⽤--来指定帧率:x264.exe -- NUL -- 25 -- 1280x720 D:\input.yuv x264 -- /dev/null -- 30000/1001 -- 640x480 ~/input.yuv[]预设值Presets为了减少使⽤者花费时间和精⼒在命令⾏上⽽设计的⼀套系统。
[]profile默认值: not setLimit the profile of the output stream. If you specify a profile, it overrides all other settings, so if you use it, you will be guaranteed a compatible stream. If you set this option, you cannot use lossless encoding (-- 0 or -- 0).You should set this if you know your playback device only supports a certain profile. Most decoders support High profile, so there's no need to set this.Values available: baseline, main, high, high10, high422, high444.限制输出流的profile。
【翻译】x264参数介绍(一、帧类型和码率控制)陈钢的博客
【翻译】x264参数介绍(⼀、帧类型和码率控制)陈钢的博客输⼊⽤1个绝对路径定义输⼊⽂件(或者2个,rawYUV⽂件)。
如下例:x264.exe -o NUL C:input.avsx264 -o /dev/null ~/input.y4m如果输⼊⽂件是rawYUV格式的,还要把分辨率⼀并输⼊。
如果开启了⽐特率控制,还需要输⼊帧率。
如下例:x264.exe -o NUL –fps 25 D:input.yuv 1280?720x264 -o /dev/null –fps 30000/1001 ~/input.yuv 640?480预设值预设值是x264在r1177版本增加的⼀个⽅便的命令⾏选项。
可以⽤x264.exe –fullhelp查看所有的命令⾏帮助。
profile默认:⽆说明:限制输出⽂件的profile。
这个参数将覆盖其它所有值,此选项能保证输出profile兼容的视频流。
如果使⽤了这个选项,将不能进⾏⽆损压缩(qp 0 or crf 0)。
可选:baseline,main,high建议:不设置。
除⾮解码环境只⽀持main或者baseline profile的解码。
preset默认:medium⼀些在压缩效率和运算时间中平衡的预设值。
如果指定了⼀个预设值,它会在其它选项⽣效前⽣效。
可选:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo.建议:可接受的最慢的值tune默认:⽆说明:在上⼀个选项基础上进⼀步优化输⼊。
如果定义了⼀个tune值,它将在preset之后,其它选项之前⽣效。
可选:film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency and touhou.建议:根据输⼊选择。
x264运动估计
x264运动估计理论知识:两帧之间的物体运动是平移运动,位移量不是很很大,所以会以块作为单位分配运动矢量,在运动估计中采用了大量的参考帧预测来提高精度,当前的待编码块可以在缓存内的所有重建帧中寻找最优的匹配块进行运动补偿,以便很好的去除时间域的冗余度。
为每一个块寻求一个运动矢量MV,并进行运动补偿预测编码。
在每个分割区域中都有其对应的运动矢量,并对运动矢量以及块的选择方式进行编码和传输。
运动估计ME所表达的运动矢量MV,其研究的内容就是如何加速,有效的获得足够精确的mv,并且把前一帧所得的运动信息通过运动补偿MC来进行变换,量化编码,最后输出。
缩写含义:me得到的是mV预测得到的是mvp差值是mvdMV:运动向量,参考帧中相对于当前帧的偏移MVp:参考运动向量MVD:两个向量间的差别提高运动估计算法的效率的主要技术有:初始搜索点的选择,匹配准则,和运动搜索策略。
1.运动估计初始点的搜索:1)直接选择参考帧对应块的中心位置,这种方法简单,但容易陷入局部最优点,如果初始的步长太大,而原点(指待搜索块的中心点在参考帧中的相同位置的对应点)不是最优点时候,可能使快速搜索跳出原点周围的区域,而去搜索较远的点,导致搜索方向的不确定性,陷入局部最优。
2)选择预测的起点,以预测点作为搜索的起点,x264采用的将运动估计矢量和参考帧的左边,上边和右上边的MB的中值MV作为起点进行ME。
2. 匹配准则,x264中所采用的匹配准则是SAD,SA TD. SAD 即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。
SA TD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。
因此,不用率失真最优化时,可将其作为模式选择的依据。
一般帧内要对所有的模式进行检测,帧内预测选用SA TD.在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。
X264编码器设置参数(节选)
X264编码器设置参数(节选)第一个“main”设置编码主要参数:PS:1pass 即仅编码一次,2pass 则为编码两次,3、4…pass 以此类推single pass-Lossless 1pass 无损,生成文件比较大,跟AVI 无损类似。
如非必要,不推荐。
single pass-quantizer-based(CQP) 1pass 恒定量化值,每一类帧采用相同的量化值来量化(停用弹性量化),使得全片的质量大体相近。
速度较CRF 模式更快一点,通常不推荐这个模式。
single pass-ratefactor-based(CRF) 1pass 恒定速率系数,对于体积没有要求的压制,对于相同的视觉品质,CRF 比QP 输出的档案更小,如果只是1pass 的话推荐选用这个模式。
Single pass-bitrate-based(ABR) 1pass 平均比特率,平均码率压制,一次成形。
码率的分配来自即时验算。
通常不推荐这个模式。
Multipass-1st pass 多层渲染?(⊙o⊙)…Multipass-1st pass(fast)多层渲染(快速)Multipass-Nth pass 多层XX?不懂Nth 是啥,反正也用不到。
以上三个貌似是这样选择“Multipass-1st pass ”或“Multipass-1st pass(fast)”执行第一次渲染,之后选择“Multipass-Nth pass”导入“. 264.stats”数据文件,执行第二次渲染,也就是所谓的2pass,话说x264vfw 的2pass 如此弱智?折腾两次···共同期待高手来解疑答惑吧。
选择single pass-ratefactor-based(CRF)与single pass-quantizer-based(CQP)这两种模式下面会有一个调节选项Quantizer/Quality 即为量化值,该数值越小画质越高、码率越高、文件体积越大,默认值为23片源好的话可以把该值加大,但最好不要低于15 或超过28。
x264编码 教程
MP4介绍与基本AVC编码(x264)教程首先简单介绍一下MPEG是什么:MPEG是Motion Picture Expert Group的缩写,简单讲就是个行业里的组织,专门对数字内容做出业界规范的组织。
其实从MPEG1开始我们就广泛认识到这个组织和他们的标准了。
VCD就是其中最主要的代表。
在当时亚洲国家VCD格式十分流行,如果没记错VCD这个具体的格式是从日本而来的,并遵守MPEG1规格。
之后便是MPEG2,具体代表是DVD。
知道现在都是主流数码格式。
说道这里大家应该开始明白MPEG这个组织其实他的责任就是推广每一代新的数字媒体规范或是规格,而不是实际的产品。
换句白话就是说,政府来规定符合什么样标准的汽车可以上路,然后各个汽车公司按照这个具体的标准来制作自己的汽车,通过政府规定的汽车才可以上路。
张三李四都可以开发自己符合mpeg规格的codec和container(这个是什么我之后会解释),并且理论上拿到别人同样按照这个规格开发的产品上照样可以工作。
具体例子就好比制作DVD的方法千千万万,好莱坞用来做大片,个人也可以把自家拍的DV刻成DVD。
理论上讲都可以在放在任何DVD机里播放(这里不考虑个别不兼容问题)。
这也是为什么明明XVID编码的dvdrip大家用ffdshow也可以照样看。
所以说这就是规格统一的好处!!说了这么多转入正题:我们要讨论的MP4格式。
从名字就可以看出来她是高于MPEG1、2的新一代数字媒体格式(本人到现在还不知道为什么没有3直接从2跳到4了,知道达人请在后面的帖子里补充)现在就具体介绍一下MP4的具体规格:(很多内容来源与,英文好的朋友我强烈建议去那里看看,消费层用户里面那里是很权威的)- ISO 14496-1 (Systems) - 户动界面(有点像DVD里的菜单)- ISO 14496-2 (Video) - ASP(Advanced Simple Profile)就是其中一种,代表产品有Xvid,Divx5等等。
FFmpeg-X264-编码参数
FFmpeg X264编码参数1.目录1.码率控制 (1)2.X264的preset和tune (2)3.编码延时建议 (2)4.ffmpeg编码参数和x264参数对照 (3)5.x264参数说明 (6)2.码率控制X264提供三种码率控制的方式:bitrate, qp, crf。
这三种方式是互斥的,使用时设置其中之一即可。
(1)bitratex264会尝试把给定的位元率作为整体平均值来编码。
这意味着最终编码文件的大小是已知的,但最终的品质未知。
此选项通常与-pass(两阶段编码)一起使用。
注意,ffmpeg中设置bitrate的具体参数为bit_rate,单位是bits/s(x264里面对应参数i_bitrate 的单位则是kbits/s, 1kbits为1000bits而非1024bits).(2)qp使用qp选项时,表示P帧的量化值为qp。
I帧和B帧的量化值则是从--ipratio和--pbratio中取得。
可使用默认参数,也可自己设定。
使用qp模式,即固定量化值,意味着停用弹性量化(aq_mode)。
当qp为0时,为无损编码。
(3)crf固定位元率系数,C onstant R ate f actor,可用的值从1到51,越小编码质量越好,码率越高。
一般使用16到24,可以为浮点。
(crf 并不是恒定质量的方式,同一片子同一crf值,其他参数不同可能码率和质量差较大,不同的片子之间就更没有可比性了)此模式把某个“质量”作为编码目标,根据片子质量自动分配码率的vbr(Variable Bit Rate 动态比特率)。
X264中构想是让crf n提供与qp n相当的视觉品质,但编码文件更小一些。
CRF是借由降低“较不重要”帧的品质来达到此目的。
在此情况下,“较不重要”是指在复杂或高动态场景的帧,其品质不是很耗费位元数就是不易察觉,所以会提高它们的量化值。
从这些帧里所节省下来的位元数被重新分配到可以更有效利用的帧。
X264参数设定详细解释
X264参数设定详细解释x264 core:65 r1074M b6bb3d4Syntax: x264 [options] -o outfile infile [widthxheight]语法(命令行写法):x264 [参数] -o 输出文件名输入文件名[宽x高]范例:x264 --crf 26 --ref 3 --mixed-refs --bframes 3 --b-adapt 2 --b-pyramid --weightb --deblock -1:-1 --trellis 2 --partitions all --8x8dct --me umh --threads auto --thread-input --aud --progress --no-psnr --no-ssim -o output.mp4 input.avs 720x480 Infile can be raw YUV 4:2:0 (in which case resolution is required),or YUV4MPEG 4:2:0 (*.y4m),or AVI or Avisynth if compiled with AVIS support (yes).输入文件可以是RAW YUV 4:2:0(在某些情况下分辨率是必需的)或者YUV4MPEG 4:2:0 (*.y4m)或者AVI 或Avisynth(后面的yes说明支持AVS输入)Outfile type is selected by filename:.264 -> Raw bytestream.mkv -> Matroska.mp4 -> MP4 if compiled with GPAC support (yes)输出文件类型由输出文件名指定:.264 -> Raw 格式.mkv -> MKV格式.MP4 -> MP4格式(yes说明支持MP4输出)Options:可选参数:-h, --help List the more commonly used options --longhelp List all options-h, --help 显示常用参数--longhelp 显示全部参数注:-h,--help代表-h与--help两者都可以,-h是简化写法举个例子:x264 -h与x264 --help两者效果等价——————————————————————————————————————Frame-type options:帧-类型选项:-I, --keyint Maximum GOP size [250]说明:指定两个IDR帧之间的最大间隔,默认250推荐值:默认或者FPS的10倍范例:--keyint 300注:[250]代表默认值为250提示:若想使用默认值,不使用参数即可-i, --min-keyint Minimum GOP size [25]说明:指定两个IDR帧之间的最小间隔,默认25推荐值:默认或者FPS的大小范例:--min-keyint 30问题:如何查看FPS?/zh-CN去上面的网站下载mediainfo查看--scenecut How aggressively to insert extra I-frames [40]说明:指定强制使用IDR帧的阀值,值越大强度越高,默认为40推荐值:默认范例:--scenecut 40--pre-scenecut Faster, less precise scenecut detection.Required and implied by multi-threading.说明:效果同scenecut,速度比scenecut快,但是精度稍低,默认设定为当threads>1时,永远使用--pre-scenecut 推荐值:默认-b, --bframes Number of B-frames between I and P [0]说明:设定I帧与P帧之间的最大B帧数量,范围0~16推荐值:3-6范例:--bframes 3--b-adapt Adaptive B-frame decision method [1]Higher values may lower threading efficiency.- 0: Disabled- 1: Fast- 2: Optimal (slow with high --bframes)说明:B帧自适应方法,默认为1- 0: 关闭- 1: 高速- 2: 最优化(--bframes的值越高速度越慢)推荐值:2范例:--b-adapt 2--b-bias Influences how often B-frames are used [0]说明:影响B帧使用的频繁程度,默认为0推荐值:0范例:--b-bias 0--b-pyramid Keep some B-frames as references说明:允许其它帧参考B帧,默认不使用推荐值:开启范例:--b-pyramid--no-cabac Disable CABAC说明:关闭CABAC,默认不使用-r, --ref Number of reference frames [1]说明:设定参考帧的数量,范围0~16,默认值为1,过大的值可能导致无法硬解,参考以下公式计算良好硬解的最大参考帧最大参考帧数量计算公式:maximum ref = 12288 * 1024 / ( width * height * 1.5)推荐值:3-6范例:--ref 3--no-deblock Disable loop filter说明:关闭deblock filter,默认不使用推荐值:默认范例:--no-deblock-f, --deblock Loop filter AlphaC0 and Beta parameters [0:0]说明:设定deblock filter参数,alpha为Deblocking strength,beta为Deblockingthreshold,值越大deblocking效果越好,画面越干净,但是会损失一些细节并有些许模糊,反之亦然,上下限不要超过-3,3,默认0,0推荐值:默认范例:--deblock 0:0--interlaced Enable pure-interlaced mode说明:隔行编码模式,默认关闭范例:--interlaced——————————————————————————————————————Ratecontrol:压缩比控制:-q, --qp Set QP (0=lossless) [26]说明:固定量化模式,值越小质量越好,默认为26,qp = crf + --qcomp 1推荐值:使用crf,见crf部分范例:--qp 26-B, --bitrate Set bitrate (kbit/s)说明:目标码率模式,生成的视频码率大小为指定的bitrate 的值,一般搭配--pass使用推荐值:720P以下码率为800-2100kbps之间,720P为3-6Mbps,1080P为8-15Mbps以上范例:--bitrate 1000--crf Quality-based VBR (nominal QP) 说明:固定压缩因子模式,值越小质量越好,一般搭配--qcomp使用推荐值:16-26范例:--crf 26--qcomp QP curve compression: 0.0 => CBR, 1.0 => CQP [0.60]说明:压缩曲线,范围为0~1之间,数值越小曲线越平坦,与crf搭配使用,默认为0.6推荐值:默认范例:--qcomp 0.6--vbv-maxrate Max local bitrate (kbit/s) [0]说明:设定VBV模式的最大码率,如果需要硬解必须开启VBV模式,默认为0范例:--vbv-maxrate 50000--vbv-bufsize Enable CBR and set size of the VBV buffer (kbit) [0]说明:设定VBV缓冲区的最大尺寸,其大小一般由硬件设备决定,默认为0范例:--vbv-bufsize 50000--vbv-init Initial VBV bufferoccupancy [0.9]说明:设定VBV缓冲区的初始填充尺寸,默认为0.9范例:--vbv-init 0.9--qpmin Set min QP [10]说明:设定qp的下限,默认为10范例:--qpmin 10--qpmax Set max QP [51]说明:设定qp的上限,默认为51范例:--qpmax 51--qpstep Set max QP step [4]说明:设定qp的最大步长,默认为4范例:--qpstep 4--ratetol Allowed variance of average bitrate [1.0]说明:允许最终码率偏离指定平均码率的百分比,只在1pass 中起作用,默认为1.0范例:--ratetol 1.0--ipratio QP factor between I and P [1.40]说明:设定I帧相对于P帧的量化比推荐值:默认范例:--ipratio 1.40--pbratio QP factor between P and B [1.30]说明:设定P帧相对于B帧的量化比推荐值:默认范例:--ipratio 1.30--chroma-qp-offset QP difference between chroma and luma [0]说明:chroma 与luma 的QP差异值,这个值会随着--psy-rd的使用自动调整为-2推荐值:默认范例:--chroma-qp-offset 0--aq-mode AQ method [1]- 0: Disabled- 1: Variance AQ (complexity mask)说明:自适应量化方法,可以改善某些场景过于模糊等问题,默认开启- 0: 关闭- 1: 可变AQ推荐值:默认范例:--aq-mode 1--aq-strength Reduces blocking and blurring in flat andtextured areas. [1.0]- 0.5: weak AQ- 1.5: strong AQ说明:指定AQ的强度,减小低细节宏块的量化值,默认1.0 - 0.5: 较弱的AQ- 1.5: 较强的AQ推荐值:默认范例:--aq-strength 1.0-p, --pass Enable multipass ratecontrol- 1: First pass, creates stats file- 2: Last pass, does not overwrite stats file- 3: Nth pass, overwrites stats file说明:多重压缩模式,1 pass 或N pass生成stats文件,2pass调用生成的stats文件对压缩进行优化,更合理的分配码率,一般没必要进行N pass- 1: 第1 pass,生成stats文件- 2: 最终pass,不覆盖stats文件- 3: 第N pass,覆盖stats文件推荐值:2范例:--pass 2--stats Filename for 2 pass stats["x264_2pass.log"]说明:指定stats文件名,默认为"x264_2pass.log"推荐值:默认范例:--stats "x264_2pass.log"--cplxblur Reduce fluctuations in QP (before curve compression) [20.0]说明:减小QP的波动(在曲线压缩以前),范围0~999推荐值:默认范例:--cplxblur 20--qblur Reduce fluctuations in QP (after curve compression) [0.5]说明:减小QP的波动(在曲线压缩之后),范围0~99推荐值:默认范例:--qblur 0.5--zones //... Tweak the bitrate of someregions of the videoEach zone is of the form,,where is eitherq= (force QP)or b= (bitrate multiplier)说明:调整视频中某一范围内的码率每个区域已以下形式出现,,为下面的任意一个q= (强制QP)或b= (指定bitrate)范例:--zone 0,1000,qp=30/30000,32000,b=0.5--qpfile Force frametypes and QPs说明:强制指定帧类型与QP推荐值:默认Analysis:分析:-A, --partitions Partitions to consider["p8x8,b8x8,i8x8,i4x4"]- p8x8, p4x4, b8x8, i8x8, i4x4- none, all(p4x4 requires p8x8. i8x8 requires --8x8dct.)说明:宏块分割方式,默认["p8x8,b8x8,i8x8,i4x4"]- p8x8, p4x4, b8x8, i8x8, i4x4- none, all(p4x4 需要p8x8. i8x8 需要--8x8dct.)推荐值:默认范例:--partitions "p8x8,b8x8,i8x8,i4x4"--direct Direct MV prediction mode ["spatial"]- none, spatial, temporal, auto说明:Direct预测方法,默认"spatial"- none, spatial, temporal, auto推荐值:"auto"范例:--direct "auto"--direct-8x8 Direct prediction size [1] - 0: 4x4- 1: 8x8- -1: smallest possible according to level说明:Direct预测大小,默认为-1- 0: 4x4- 1: 8x8- -1: 根据Level确定一个最小值范例:--direct 1-w, --weightb Weighted prediction forB-frames说明:允许对B帧进行加权预测范例:--weightb--me Integer pixel motion estimation method ["hex"]- dia: diamond search, radius 1 (fast)- hex: hexagonal search, radius 2- umh: uneven multi-hexagon search- esa: exhaustive search- tesa: hadamard exhaustive search (slow)说明:全像素动态预测方法,越往下精度越高,速度越慢,默认"hex"- dia: 菱形搜索, 半径1 (高速)- hex: 六边形搜索, 半径2- umh: 不规则多边形搜索- esa: 全面搜索- tesa: hadamard变换全面搜索(最慢)推荐值:"umh"范例:--me "umh"--merange Maximum motion vector search range [16]说明:最大动态矢量搜索范围,结合--me使用,对于dia与hex,允许的范围为4~16,umh以上可以超过16,值越大编码速度越慢,默认为16范例:--merange 16--mvrange Maximum motion vector length [-1 (auto)]说明:最大动态矢量长度推荐值:默认范例:--mvrange -1 --mvrange-thread Minimum buffer between threads [-1 (auto)]说明:线程之间的最小缓冲区大小推荐值:默认范例:--mvrange-thread -1 -m, --subme Subpixel motion estimation and mode decision [6]- 0: fullpel only (not recommended)- 1: SAD mode decision, one qpel iteration- 2: SATD mode decision- 3-5: Progressively more qpel- 6: RD mode decision for I/P-frames- 7: RD mode decision for all frames- 8: RD refinement for I/P-frames- 9: RD refinement for all frames说明:子像素动态预测模式策略,值越大效果越好,速度越慢,默认6- 0: 仅fullpel (不推荐)- 1: SAD模式策略, 1 qpel迭代- 2: SATD模式策略- 3-5: 依次qpel增加- 6: I/P-帧RD模式策略- 7: 所有帧RD模式策略- 8: I/P-帧RD refinement模式策略- 9: 所有帧RD refinement模式策略推荐值:6以上范例:--subme 7--psy-rd Strength of psychovisual optimization ["1.0:0.0"]#1: RD (requires subme>=6)#2: Trellis (requires trellis, experimental)说明:视觉优化,--psy-rd 1.0:0.0 代表#1为1.0,#2为0.0,#2还在测试阶段,默认1.0:0.0#1: RD (需要subme>=6)#2: Trellis (需要trellis, 测试阶段)推荐值:#1 (0~1.0),#2 0.0范例:--psy-rd 1.0:0.0--mixed-refs Decide references on a per partition basis说明:对每个宏块区进行参考帧判断,开启后可以提升质量,但会降低速度推荐值:开启范例:--mixed-refs--no-chroma-me Ignore chroma in motion estimation说明:在动态预测中忽略chroma推荐值:默认范例:--no-chroma-me-8, --8x8dct Adaptive spatial transform size说明:自适应空间变换大小推荐值:使用范例:--8x8dct-t, --trellis Trellis RD quantization. Requires CABAC. [0]- 0: disabled- 1: enabled only on the final encode of a MB- 2: enabled on all mode decisions说明:Trllis RD量化.需要CABAC,值越大速度越慢,默认0- 0:关闭- 1:基于宏块- 2:在所有模式策略中使用推荐值:1范例:--trellis 1--no-fast-pskip Disables early SKIP detection on P-frames说明:关闭早期的P帧快速检测,开启可以提升质量,但会减低一些速度,默认不使用推荐值:使用范例:--no-fast-pskip--no-dct-decimate Disables coefficientthresholding on P-frames说明:关闭P帧的系数阀值,默认不使用推荐值:默认范例:--no-dct-decimate--nr Noise reduction [0]说明:降噪,默认0推荐值:默认范例:--nr 0--deadzone-inter Set the size of the inter luma quantization deadzone [21]--deadzone-intra Set the size of the intra luma quantization deadzone [11]Deadzones should be in the range 0 - 32.说明:设定inter/intra luma deadzone 量化值的大小,范围0 - 32推荐值:默认范例:--deadzone-inter 21 --deadzone-intra 11--cqm Preset quant matrices ["flat"]- jvt, flat说明:预设量化矩阵- jvt, flat推荐值:默认范例:--cqm "flat"--cqmfile Read custom quant matricesfrom a JM-compatible fileOverrides any other --cqm* options.说明:读取自定义JM兼容的量化矩阵文件,无视任何以--cqm开头的参数范例:--cqm "mycqm"--cqm4 Set all 4x4 quant matrices Takes a comma-separated list of 16 integers.说明:设定所有4x4量化矩阵,它是一张以逗号分割的16个整数的表范例:--cqm"16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16"--cqm8 Set all 8x8 quant matricesTakes a comma-separated list of 64 integers.说明:设定所有8x8量化矩阵,它是一张以逗号分割的64个整数的表范例:参考--cqm4--cqm4i, --cqm4p, --cqm8i, --cqm8pSet both luma and chroma quant matrices说明:设定luma与chroma的量化矩阵范例:参考--cqm4--cqm4iy, --cqm4ic, --cqm4py, --cqm4pc Set individual quant matrices说明:单独设定量化矩阵范例:参考--cqm4Video Usability Info (Annex E):The VUI settings are not used by the encoder but aremerely suggestions tothe playback equipment. See doc/vui.txt for details. Use at your own risk.视频可用性信息:VUI设置在编码的时候不会用到,它仅仅作用于回放设备。
【转】关于x264的笔记整理
【转】关于x264的笔记整理关于x264的笔记整理来源:[]2010年05月26日当初做x264优化时,1个人在摸索,一点儿点在改进,也记载下了一些东西,现在看来,有的至关琐碎,并且也没多大价值,然而这也是自己当初的一种经历,以后事情了,估计就再不会接触H.264了,现在写下来,或者许能对刚入门的人有点帮助吧。
2008-01-16 9:011.将所有的X264_LOG用LOG_printf代替,去掉common.c中的x264_log,log_default2.所有的fprintf()即对文件的操作应该去掉3.去掉信噪比的计较,因为在解码端也可得到在common.c中param->analyse.b_psnr = 0; //是否使用信噪比4.设置set_en.c中的sps->b_vui = 0;表示vui信息不呈现在码流中sps->b_frame_mbs_only = 1;表示采用所有图像均帧编码5.屏蔽掉:CAVLC_EN.C中的else if( i_mb_type == B_8x8 ),else if( i_mb_type!= B_DIRECT ),else if( i_mb_type == B_DIRECT ),else if( i_mb_type == B_8x8 )6.去掉common.h中的CHECKED_MALLOC中的if(!var)...(即检查分配内存成功与否)7.屏蔽掉ratecontrol_en.c中的x264_ratecontrol_new中的if( h->param.rc.i_rc_method == X264_RC_CRF)..和/* Load stat file and init 2passalgo */if( h->param.rc.b_stat_read )...8.去掉slicetype_decision_en.c中的if( h->param.rc.b_stat_read ) {...}和void x264_slicetype_analyse( x264_t *h )函数,ratecontrol_en.c 中的x264_ratecontrol_slice_type函数9.去掉ratecontrol_en.c中的update_vbv函数中的if( rcc->buffer_fill < 0 &&!rcc->b_2pass )...,rate_estimate_qscale中的if( rcc->b_2pass )..init_pass2(){...}函数10.去掉encoder_en.c中的x264_validate_levels( h )语句和set_en.c中对应的函数以上有一些修改涉及到检查参数的不错性,是因为在保证参数不错性的环境下这些语句是可以去除的2008-01-16 14:431.去掉if( h->param.rc.b_stat_read )开首的语句2.去掉assert()语句3.将CCS中的程序中的fprintf(...)全部去掉,(因为涉及到文件的操作,使用USB口传输很耗时)4.去掉exit(-1)之类报告程序纰缪的函数5.去掉encoder_en中的#ifdef DEBUG_MB_TYPE...#endif之间的语句6.去掉common.c中的x264_param_parse()函数7.去掉analyse_en.c中的static const int i_mb_b_cost_table[19]类似的数组(B帧用到的),以及以if( h->sh.i_type == SLICE_TYPE_B )...开首的语句2008-01-16 19:331.去掉analyse_en.c中的x264_mb_analyse_inter_direct(),x264_mb_analyse_inter_b16x16(),x264_mb_analyse_inter_b8x8,x264_mb_analyse_inter_b16x8,x264_mb_analyse_inter_b8x16()等5个函数,这5个函数是用来进行B帧帧间预测的,不需要用到2.去掉macroblock.c中的if( h->sh.i_type == SLICE_TYPE_B && h->param.b_cabac )...3.去掉所有以if( h->sh.i_type == SLICE_TYPE_B )..开首的语句4.去掉以if( h->param.analyse.b_psnr )...开首计较PSNR的语句5.将以for( i_list = 0; i_list < (h->sh.i_type == SLICE_TYPE_B ?2 : 1 );i_list++ )的轮回去掉,因为不使用P帧只执行一次,不需轮回但需加入i_list = 0;置初值6将#ifdef _BS_H#warning FIXME Multiple inclusion of bs.h#else#define _BS_H改为:#ifndef _BS_H#define _BS_H7.analyse_en.c中的x264_mb_analyse_b_rd(),refine_bidir()函数去掉8.去掉cavlc_en.c中的uint8_t mb_type_b_to_golomb[3][9]和sub_mb_type_b_to_golomb[13]数组9.去掉common.c中的parse_enum(),parse_cqm(),atobool()函数但愿:将encoder_en.c中的if( h->param.rc.psz_stat_out )h->param.rc.psz_stat_out = strdup( h->param.rc.psz_stat_out );如许就不需要自己定义的strdup函数了2008-01-17 9:481.去掉encoder_en.c的x264_encoder_encode()函数中的两个没有用到的变量:i_mb_i和i_mb_p(在CCS编译时的正告提醒这两个变量定义但未被使用,其它有类似的正告也能够考虑去掉)2.去掉frame.c中的x264_frame_new()函数中的以fail:标号开首的三句话(在程序中不会挪用)去掉macroblock.c中的x264_macroblock_cache_init()函数中的以fail:标号开首的两句话3.pridect.c中的UNUNSED变量该怎样处理?(CCS中正告说没有使用,但直接删除在VC下会报错!)4.去掉所有以#ifdef HAVE_MMXEXT ...#endif的语句5.去掉ratecontrol_en.c中的parse_zones相干的三处代码6.去掉encoder_en.c中的x264_encoder_关上()函数中的x264_ratecontrol_summary( h )函数及在ratecontrol.c中的相应代码(因为在这个函数中挪用了if(rc->b_abr)...;7.去掉ratecontrol_en.c中的与rate_estimate_qscale()和get_diff_limited_q()有关的函数8.去掉x264.c中的strtable_lookup()函数,与/* update status line (up to 1000times per input file) */有关的语句*******************1.考虑将ratecontrol_en.h中的声明的函数在程序中被使用的地方全部替换即删掉ratecontrol_en.c文件,不使用码率控制2.去掉以rc->b_abr,b->2pass判断的语句*******************2008-01-17 19:531.去掉ratecontrol_en.c中的get_qscale()和clip_qscale()函数2.去掉encoder_en.c中的关于x264_psnr()的宏及挪用它的函数(不计较信噪比)ratecontrol_en.c中的挪用:1.Searchellong for ''x264_ratecontrol_start''...F:\H.264\youhua 264Vc\encoder_en.c(1350): x264_ratecontrol_start( h,i_slice_type, h->fenc->i_qpplus1 );2.Searchellong for ''x264_ratecontrol_new''...F:\H.264\youhua 264Vc\encoder_en.c(617): if( x264_ratecontrol_new( h) < 0 )3.Searchellong for ''x264_ratecontrol_delete''...F:\H.264\youhua 264Vc\encoder_en.c(1842): x264_ratecontrol_delete( h);4.Searchellong for ''x264_ratecontrol_threads_start''...F:\H.264\youhua 264Vc\encoder_en.c(1124):x264_ratecontrol_threads_start( h );F:\H.264\youhua 264Vc\encoder_en.c(1148):x264_ratecontrol_threads_start( h );5.Searchellong for ''x264_ratecontrol_slice_type''...F:\H.264\youhua 264Vc\slicetype_decision_en.c(381 ):x264_ratecontrol_slice_type( h, h->frames.next[i]->i_frame );(已经被去掉)2008-01-17 20:376.Searchellong for ''x264_ratecontrol_mb''...F:\H.264\youhua 264Vc\encoder_en.c(1074):x264_ratecontrol_mb(h, bs_pos(&h->out.bs) - mb_spos);7.earchellong for ''x264_ratecontrol_qp''...F:\H.264\youhua 264Vc\analyse_en.c(1950): x264_mb_analyse_init( h,&analysis, x264_ratecontrol_qp( h ) );F:\H.264\youhua 264Vc\encoder_en.c(1351): i_global_qp =x264_ratecontrol_qp( h );8.Searchellong for ''x264_ratecontrol_end''...F:\H.264\youhua 264Vc\encoder_en.c(1541): x264_ratecontrol_end( h,i_frame_size * 8 );2008-01-19 9:171.修改x264.c中的Encode_frame()和Encode()函数,修改本来程序中的编码一帧,写一帧到输出文件为编码所有的帧完成后再一次写入到输出文件中(此处给存放输出文件的缓冲只分配了1M巨细)2008-01-20 17:231.在编译选项中添加-k,-mw,可以天生反馈文件信息(.asm)2008-01-22 20:33修改X264.C中的main函数,为输入的文件分配1个缓冲,p_readYUV,5M巨细.先将YUV文件读入到这个缓冲中,然后在编码时每一次读取YU的V分量只需要使用MEMCPY从内存中复制对应的数值即可.两天时间,终于快解决这个输入缓冲的问题!如许做仍然在CCS中仍然是将PC上的YUV 文件通过USB口读取到EVM的SDRAM中,速度仍然很慢,今后要是能使用收集传输应该会快很多,但现在主要是作优化,只要与PC通信的这块可以或者许不占入编码时间就大好了.主要代码如下:/* raw 420 yuv file operation */int open_file_yuv( char *psz_filename, hnd_t *p_handle,x264_param_t*p_param ){....//获得文件的长度fseek(h->fh,0,SEEK_END);i_file_length =ftell(h->fh);fseek(h->fh,0,SEEK_SET);//读取YUV文件fread(p_readYUV,1,i_file_length,h->fh);...}int read_frame_yuv( x264_picture_t *p_pic, hnd_t handle, int i_frame ){yuv_input_t *h = handle;/* if( i_frame != h->next_frame )if( fseek( h->fh, (uint64_t)i_frame * h->width * h->height * 3 /2, SEEK_SET ) )return -1;*//* if( fread( p_pic->img.plane[0], 1, h->width * h->height,h->fh ) <= 0|| fread( p_pic->img.plane[1], 1, h->width * h->height / 4,h->fh ) <= 0|| fread( p_pic->img.plane[2], 1, h->width * h->height / 4,h->fh ) <= 0 )return -1;*///从内存中复制数值memcpy(p_pic->img.plane[0], p_readYUVBuffer , h->width *h->height);memcpy(p_pic->img.plane[1], p_readYUVBuffer+h->width * h->height , h->width * h->height/ 4);memcpy(p_pic->img.plane[2], p_readYUVBuffer +h->width *h->height+ h->width * h->height/ 4, h->width * h->height/ 4);p_readYUVBuffer=p_readYUVBuffer +h->width * h->height+ h->width * h->height/ 4+ h->width * h->height/ 4;h->next_frame = i_frame+1;return 0;}在CCS中的char 换成uint8_t2008-01-23 15:29修改DSP/BIOS,将BIOS的对象分配到IRAM中,将BIOS需要的STACK分配在DDR2FORHEAP中,1.此时在p_readYUVBuffer=x264_malloc(0x500000);分配5M的输入缓冲时占了较长时间(估计有10分钟了)修改COMMON.C中的X264_malloc,将buf = (uint8_t *) malloc( i_size + 15 +sizeof( void ** ) +sizeof( int ) );改为:buf=(uint8_t *)MEM_calloc(DDR2forHeap, i_size + 15 +sizeof( void ** ) +sizeof( int ),0); (使用DSP/BIOS提供的MEM分配函数)2008-01-24 21:011.下午将fread从CCS中读到的数值,用CCS的DATA->SAVE把对应的foreman01.yuv文件生存为DATA格式的foreman01.dat,以后要作测试时,直接使用DATA-->LOAD将其导入到SRAM中即可2.调试时呈现问题:在编码第一帧后又返回到了主函数,如许一直在反复编码一帧!不知道是不是因为将main()和smain()函数放在同1个x264.c文件里面的缘故?是不是main()函数必须单独作1个文件?在log_printf.pjt工程里证明不是因为必须在1个文件里的问题3.以上呈现程序跑飞的缘故原由有多是因为TSK0的任务堆栈过小(默许是1024),在DSP/BIOS里改为了(10000)4.是在encoder_en.c中的x264_slice_write函数中又跑到主函数中去的有多是因为文件操作的缘故原由?2008-02-20 15:471.关于用CCS的DATA->SAVE把对应的foreman01.yuv文件生存为DATA格式的foreman01.dat,以后要作测试时,直接使用DATA-->LOAD将其导入到SRAM中,在CCS中使用VIEW-MEMORY查看内存中的数的读的方法:如DAT文件如下1651 1 85000010 0 11fb80 0xFFC9280A0xFEFEFEF70xFEFEFEFE0xFEFEFEFE0xFEFEFEFE0xFEFEFEFE0xFEFEFEFE0xFEFEFEFE0xFEFEFEFE0xFEFEFEFE0xFEFEFEFE0xE9FEFFFD ....................在SRAM中0x8500 0010存放第1个数0xFFC9280A,第二个数的0xFEFEFEF7的地址为0x8500 0010 + 4*(2-1)=0x8500 0014,第12个数0xE9FEFFFD的地址为0x8500 0010+4*(C-1)=0x8500 003C;最后1个数(第1178496个数)的地址为0x8500 0010 + 4*(11fb80-1)=0x8547 ee0c;(1178496转换为十六进制为0x11fb80);即第n个数的存放地址为0x8500 0010+4*(n(十六进制)-1);2008-02-22 10:21将所有的fseek换成lseek(/dv_rss.asp?s=xhtml&boardid=20&id=118797)仍不克不及解决问题2008-02-22 15:071.尝试方法:恢复1.17号的X264.C文件,即还是采用fopen,fread,从PC上读一帧编码后再从PC上读另一帧,看是否正常使用DATA-LOAD的备份文件为:复件⑷ x264.c在使用DATA-LOAD的程序中似乎可以不需要open_file_yuv..使用类似的程序在VC下可以正常编码..2008-02-22 21:53问题得到解决:将ccs中的macroblock.c用F:\H.264\youhua 264Vc目次下的macroblock.c文件替换,就能够正常编码了可见当时对这两个文件没有同步更新导致1个跨越年度的纰缪!!但天生的文件有800多kb,2008-02-25 16:27将DSP/BIOS中的MEM重新分配,使p_writeBuffer与p_readBuffer不指向同一块内存,天生的文件大为缩小,只有132KB,但是编码30帧的速度仍然需时近5分钟2008-02-26 19:56使用BUILD OPTION:-g -k -o3 -fr"$(Proj_dir)\Debug" -d"_DEBUG" -d"__X264__" -mw -mv6400+ --mem_model:data=far速度30帧约莫需要1分钟对于fps的计较仍未清楚,clock()两次运行同样的程序得到的时间竟然不同!2008-02-27 21:20仍然在研究使用何种方法来获得程序运行的时间,clock()只有用load6x()时才较精确,CLK_getltime()是保举的用法,不过要引入间断新建1个事情(在F:\DSP\CCS\CLK)专门用来测试CLK_getltime()的用法,发明:1.只有用timer0时,定时器间断才能步入,2.使用Profile菜单中的clock->view看钟表时,根据DSP/BIOS中的CLK manager中的Specify input clock rate来,得到的clock不同,默许这项是选中的,27MHZ时得到的cycle数比不选中时(594MHZ)时少的多,这有可能也是采用clock()不精确的缘故原由2008-02-28 9:05跟昨天一样的程序,同样的DSP/BIOS配置,昨天可以用CLK_getltime()获取时间,今天为啥子就返回的是0了1.将dsp264_3.pjt的DSP/BIOS的CLK manager入选中为timer0在x264.c的encode函数中将计较fps,需获得起头时间改为:i_start=CLK_getltime();i_end=CLK_getltime();调试程序时测得i_start=15 ,i_end=55462 (单位ms),fps=31(帧)/i_end-i_start=0.56(帧/秒) 与实际观测附近2008-02-28 19:001.删除mdate.c及相干的X264_mdate()宏,使用CLK_getltime()获取时间(删除common.h中的int64_t x264_mdate( void );encoder_en.c中的#define TIMER_START( d ) \...宏,和encoder_en.c中的挪用了TIMER_START()和TIMER_STOP的宏的行(这在VC上可以成功))2.变量储存类型调解:在VC中long和int 都是定义成32位,(见MSDN)而在CCS中long定义成40位,是以将CCS中的long换成int在VC中同步更新4.去掉if __x264__..else语句5.在x264.c中的encode函数中加入double fps,然而程序运行时却发明fps一直都是未定义变量,对x264.c去掉-O3编译选项,即可认出fps,有多是O3选项优化时将这句代码删掉了...,若去掉O3选项,编码速度很慢!将double fps设为全局变量,可以正常计较,前两天在测试clock()和CLK_getltime(),今天晚上就在测试这个fps的计较了,期间犯过将ms转换为s乘1000的初级纰缪...真是效率低!2008-02-29 11:001.加入-pm和-pm op0和-pm op2 -pm -op3优化选项编译,成果程序又反复编译第一帧了...2.加入-pm -op1优化选项,呈现纰缪:[Linking...] "C:\CCStudio_v3.3\C6000\cgtools\bin\cl6x" -@"Debug.lkf"<Linking>undefined first referencedsymbol in file--------- ----------------_smain F:\\H.264\\dsp264_3\\Debug\\dsp264_3cfg.obj>> error: symbol referencing errors - ''./Debug/dsp264_3.out'' not built在int smain()函数前加入:#pragma FUNC_EXT_CALLED (smain);BUILD无纰缪,但仍然程序反复编译第一帧2008-03-01 10:231.使用-k -o3 -fr"$(Proj_dir)\Debug" -d"_DEBUG" -mt -mw -mv6400+ --mem_model:data=far选项,编码速度为0.60fps2.-k -pm -op0 -o3 -fr"$(Proj_dir)\Debug" -d"_DEBUG" -mt -mw -mv6400+ --mem_model:data=far ...0.46fps,foreman01.264文件>157KB昨天使用-pm -op0选项不成功有多是因为不克不及加之-g选项2008-03-01 15:50参考:F:\H.264\移植\g宋扬-基于TMS320DM642DSP的H_264编码器优化与设计.nh1.项目级优化:使用-o3 -k -mt -mw2008-03-02 11:051.参考F:\H.264\移植\gH_264视频编码技术研究及其在TI_DSPDM642上的使成为事实.nh的<<3.5.3节对X264帧间预测模式选择算法的改进>>修改帧间预测算法,在X264VC中的analyse_en.c中修改,主要是屏蔽了voidx264_macroblock_analyse( x264_t *h )函数中if( analysis.b_mbrd ){/* refine later */}else if( i_partition == D_16x16 ){// x264_me_refine_qpel( h, &analysis.l0.me16x16 ); 与此类似的1/4像素精度搜索i_cost = analysis.l0.me16x16.cost;}最近算法还是不克不及删除!因为这些就是在在选择了最优预测模式后的分像素精度搜索 2008-03-06 14:511.去掉VC版本中pixel.c中void x264_pixel_init()关于PSNR的计较:INIT( ssd,),INIT( sad_x3, );在dsp264_3.pjt中作相应修改2008-03-07 9:001.去掉VC...pixel.c中pixel_sa8d_wxh()...及与sa8d相干的语句,在CCS中亦作相应修改2008-03-12 10:43根据CCS中函数结构和挪用约定,对于x264_pixel_sad_16x16之类的static int name( uint8_t *pix1, int i_stride_pix1, \uint8_t *pix2, int i_stride_pix2 )函数,在传递参数时前四个参数分别是A4,B4,A6,B6,将这些函数形参前后挨次改为static int name( uint8_t *pix1,uint8_t *pix2,int i_stride_pix1,inti_stride_pix2 ) 似乎更利于CCS的并行运行.因为对于pix1,pix2分别是参考宏块,分别采用A4,B4,作为寄存器挪用,可以减少一次T通道的使用(但有可能会增长X的使用了)先在VC中更改形参的次序,以"h->pixf.sad"为关键字搜索,修改如下地方:F:\H.264\youhua 264Vc\me_en.c(52): /*int cost = h->pixf.sad[i_pixel](m->p_fenc[0], FENC_STRIDE,\&p_fref[(my)*m->i_stride[0]+(mx)], m->i_stride[0] )\+ BITS_MVD(mx,my);\*/修改为:int cost = h->pixf.sad[i_pixel]( m->p_fenc[0],&p_fref[(my)*m->i_stride[0]+(mx)],\FENC_STRIDE, m->i_stride[0] )\+ BITS_MVD(mx,my);\ 即交换第二个和第三个形参的位置.以下修改类似F:\H.264\youhua 264Vc\me_en.c(62): int cost = h->pixf.sad[i_pixel](m->p_fenc[0], FENC_STRIDE, src, stride ) \F:\H.264\youhua 264Vc\me_en.c(70): h->pixf.sad_x3[i_pixel]( m->p_fenc[0],\F:\H.264\youhua 264Vc\me_en.c(83): h->pixf.sad_x4[i_pixel]( m->p_fenc[0],\F:\H.264\youhua 264Vc\me_en.c(101): h->pixf.sad_x4[i_pixel]( m->p_fenc[0],\F:\H.264\youhua 264Vc\me_en.c(468): const int enc_dc = h->pixf.sad[i_pixel]( m->p_fenc[0], FENC_STRIDE, zero, 16 );F:\H.264\youhua 264Vc\me_en.c(544): int cost = h->pixf.sad[i_pixel](m->p_fenc[0], FENC_STRIDE, src, stride ) \F:\H.264\youhua 264Vc\me_en.c(622): h->pixf.sad_x4[i_pixel]( m->p_fenc[0], src0, src1, src2, src3, stride, costs );修改了:me_en.c中的#define COST_MV( mx, my )\,#define COST_MV_PRED( mx,my ) \,const int enc_dc = h->pixf.sad[i_pixel]( m->p_fenc[0], zero, FENC_STRIDE,16 );#define COST_MV_SAD( mx, my ) \和pixel.c中的static int name( uint8_t *pix1, uint8_t *pix2, \int i_stride_pix1, int i_stride_pix2 )及SAD_x3和SAD_x4中的参数挨次和pixel.h中,添加typedef int (*x264_pixel_sad_t) ( uint8_t *, uint8_t *,int, int );及将x264_pixel_function_t结构体中的x264_pixel_cmp_t sad[7];改为:x264_pixel_sad_t sad[7];作以上修改后,release版速度只有8.94fps,不知是不是重启后速度会快些以此修改dsp264_3中对应的文件,将原有文件作备份(后缀名后加08311)2008-03-13 9:021.经昨日修改然后,在X264_PIXEL_sad_16x16线性汇编中的软件流水信息显示的是ii= 3 Schedule found with 5 iterations in parallel.C中的...是ii = 4 Schedule found with 4 iterations in parallel比未经修改的速度应该有提升,然而程序运行总出错:编译一帧后即停止运行2.经昨日修改的VC今天重启电脑运行,速度可以到达15.74fps,是以昨日所作修改对程序不会造成影响2008-03-15 20:131.田晓东-基于TMS320DM642的H_264视频编码.kdh4.4节,储存器的高度策略,有讲到分配的程序举例,和SAD16X8的线性汇编2008-03-16 9:501.g王澎-H_264视频编码器在DSP平台上的移植和优化.kdh5.4.1节短整型J无论是在精度还是范围上都能餍足需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
----
@cd /d "%~dp0"
x264 -p2 --stat "XXX.stat" -B XXXX [option] -o "%~dpn1_p2.mp4" "%~1"
@pause
注意一般pass 1 都加上--slow-firstpass这个参数。
pass 1压完看下视频是否满足自己要求,不满意就继续
输入:
x264支持输入的文件类型有raw yuv、y4m、avs和任何可以由ffms或lavf打开的文件。raw yuv会用在64位的x264里。有ffms/lavf打开的片子会自动正确的处理vfr问题。avs和ffms/lavf输入不需要指定片子的分辨率。
输出:
x264可以输出没有封装的H.264视频流,扩展名是.264;matroska视频,扩展名是.mkv;flash视频,扩展名是.flv;mp4视频,扩展名是.mp4。mkv、mp4和flv可以是vfr的。
除了2pass,还有多pass模式,在之前分析的基础上再继续分析,理论上会使码率分配更加合理,但实际上2pass已经足够了。
--bitrate 1000 (以1000kbps码率为例)
>x264 --bitrate 1000 --pass 1 --tune animation --preset slower --stats "1pass.stats" -o NUL input.avs
ssim:为提高ssim做了优化的参数;
fastdecode:可以快速解码的参数;
zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。
码率控制
视频的码率直接影响到了片子的编码质量。要想效果好,码率足够是最重要的必要条件之一。但是想实现更好的效果和控制文件的体积(码率)之间始终是一对矛盾。这就需要我们通过实践,在强大的编码器的帮助下总结出合适的码率,实现尽量好的效果。
使用介绍
命令行界面的x264
我们下载到的x264.exe是一个命令行工具,不需要安装,随便放在哪里都能运行。双击x264.exe只能看到打开了一个黑色的窗口里在刷着什么,然后就没了。x264.exe需要在命令行里输入命令,没有GUI。
不可否认有GUI的工具用来很方便,更容易上手,比如用的最广泛的MeGUI,此外还有ripbot、staxrip等GUI。doom9上有都是各种GUI,一一试过来看看自己喜欢什么。MeGUI可以自动更新编码常用的软件,作为自动下载的工具倒是不错。本文主要讲解命令行参数,GUI也是调用同一个x264,因此都用对应的选项。
一般1pass输出的比较常见设置为null,也就是不输出1pass的视频,只出stats,跑出码率曲线,看看码率分布,方便2pass进行精确判断。
1pass时候默认以ref=1,no-8x8dct,subme=2,me=dia,partition i4x4这样的极低参数跑的,如果希望1pass加强参数的话使用--slow-firstpass这个参数
最近一直用Crf压片,但码率很难控制,看到有1Pass CRF然后2Pass Bitrate的压制方法,但苦于找不到具体步骤,还请大侠们多多指教。
是不是官方的X264编码器不能实现呢?是不是Megui无法直接用这样压制只有命令行呢?
置顶的那个自动1pass crf,2pass 获取1pass的码率进行abr的脚本你没看到么..
实际命令实例:
>x264 --crf 22 --profile main --tune animation --preset medium --b-pyramid none -o psp.264 ep01.avs
调用x264编码当前目录下的"ep01.avs"文件,输出"psp.264"。
2pass-abr
x264.exe --pass 2 --stats "xxx.stats" --bitrate xxxx 中间参数省略 --output "你输出的最终成品" "输入文件"
附注:1pass和2pass不要求严格参数严格相同,所以说如果是为了跑出2pass文件的话可以使用低参数跑1pass以提高速度。不过一定要注意的是会影响到帧类型的一些选项(小白不知道怎么表述大概说一下,菊苣们勿拍)是要求1pass和2pass严格一致的,比如b帧数量,weightp,b-adapt,p-pyramid,keyint和scenecut要求一致,rc-lookahead不一样貌似不会报错但是会2pass的值会无视你的设定和1pass一样(貌似)
此外,还有短参数模式。这是为了简化某些常用参数名设计的。一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。注意此时这个字母区分大小写。
要查看x264的帮助,输入x264 --help。输入x264 --longhelp查看更详细的帮助,--fullhelp是查看全部帮助
基本用法
x264.exe的用法是,在命令行里输入形如
>x264 [--参数名 参数值 ...] --output 输出文件 输入文件
其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号。
>"D:\encoder tools\x264.exe" --crf 18 --tune touhou --preset slower -I 24 -o "D:\touhou\out.mkv" "D:\touhou\th9\rec.avi"
这个例子中,x264.exe、和输入文件都不在当前目录下,也不输出到当前路径,就要写完整的路径,如果有空格就需要在完整的路径左右加上引号。
x264通过输出文件的扩展名判断输出文件类型。[1]
preset和tune系统
x264的参数繁多,开发者为了方便使用者、简化输入和提出编码建议,设计了一套快速调用参数的系统。如果没有特别的需要,请尽量使用preset和tune系统。这套开发者推荐的参数比各种道听途说的参数更合理。
在使用了preset和tune以后,依然可以指定里面已经有的参数。手动指定的参数会覆盖preset和tune里的参数。
crf+aq效果很好。但精确控制码率很困难,最好用2pass模式,1st pass crf,2nd pass bitrate
直接1pass crf+2pass bitrate吧
如何进行1Pass CRF然后2Pass Bitrate,貌似没有人发过教程
由 gamma6256 ? 2011-06-26 8:51
命令行的crf+abr分开跑2pass,简单说就是,先命令行进入x264.exe所在的目录,然后按照如下的写法写
1pass-crf
x264.exe --pass 1 --stats "xxx.stats" --crf xx 省略中间的参数 --output "你要输出的文件(通常喜欢null)" "你要输入的文件(通常是avs)"
x264有4种码率控制方式,分别是1pass bitrate、crf、qp和2pass bitrate。其中2pass bitrate包含npass bitrate。
1pass bitrate和qp(恒定量化值)一般不推荐使用。
crf
--crf 23 (默认)
一种根据片子质量自动分配码率的vbr码率控制方式。一遍编码,如果对码率没要求请尽量使用crf模式。
官方x264命令行肯定可以;megui我记得也可以的,不过当时只会Automatic 2pass,关键也是分2次不同的任务queue进去分开压即可
命令行分2次压即可
代码: 全选
@cd /d "%~dp0"
x264 -p1 --stat "XXX.stat" --crf XX [option] -o "%~dpn1_p1.mp4" "%~1"
--tune
通过--tune的参数值指定片子的类型,是和视觉优化的参数,或有特别的情况。
--tune的值有
film:电影、真人类型;
animation:动画;
grain:需要保留大量的grain时用;
stillimage:静态图像编码时使用;
psnr:为提高psnr做了优化的参数;
可用的值从1到51,越小编码质量越好,码率越高。一般使用16到24,可以为浮点。
crf并不是恒定质量的方式,同一片子同一crf值,其他参数不同可能码率和质量能差比较大,不同的片子之间就更没有可比性了。
2pass bitrate
这种方式可以精确的得到想要的平均码率,2pass代表需要做2次编码,第一遍编码x264先分析全片,得到一个stats文件和一个mbtree文件(默认使用mbtree)。第二遍编码以这两个文件作参考分配合理的码率。需要特定的码率(或文件大小)一定要用2pass(或多pass
假如,不论你压什么片子,都给一样的码率,这显然是不合理的。
那么究竟要给多少码率是合理的呢?
这显然我们说了不算,是编码器说了算。
x264给了我们一个比较好的得到合理码率的途径,即crf模式
所以1pass用crf模式跑,是为了得到固定crf值下的码率以及1pass的stats文件
附注2:如果输入是avs的话,1pass和2pass的avs允许不完全一致(一般来说应该是只要没有改动帧率和帧数就ok),换句话说可以在1pass的时候使用一些不怎么疼的滤镜提高出stats的速度,2pass的时候换EP滤镜出片这种(EP滤镜啥的完全就是AMD的杯具啊泪目。。