【x265】x265编码器参数配置

x265相关:
【x265】x265编码器参数配置
【x265】预测模块的简单分析—帧内预测
【x265】预测模块的简单分析—帧间预测
【x265】码率控制模块的简单分析—块级码控工具(AQ和cuTree)
【x265】码率控制模块的简单分析—帧级码控模式(CQP、CRF和ABR)

在熟悉编码器过程中,一个比较有效的方法是了解其配置参数,根据其配置参数就可以知道编码器使用了哪些工具,从中筛选出重要的工具重点看看。本文记录一下x265编码器中的配置参数

x265编码器代码获取:x265下载

1. 默认配置

默认配置函数x265_param_default()位于common\param.cpp中,如下所示

void x265_param_default(x265_param* param)
{
#ifdef SVT_HEVC
    EB_H265_ENC_CONFIGURATION* svtParam = (EB_H265_ENC_CONFIGURATION*)param->svtHevcParam;
#endif

    memset(param, 0, sizeof(x265_param));

    /* Applying default values to all elements in the param structure */
    param->cpuid = X265_NS::cpu_detect(false);
    param->bEnableWavefront = 1;		// 波前下倾的编码方式(并行编码),编码损失小于1%
    param->frameNumThreads = 0;			// 帧级编码线程数(1到16),可能影响运动搜索

    param->logLevel = X265_LOG_INFO;
    param->csvLogLevel = 0;				// csv日志级别
    param->csvfn = NULL;
    param->rc.lambdaFileName = NULL;	// 码控的lambda文件,可以用来覆盖默认的x265_lambda_tab
    param->bLogCuStats = 0;				// 分析记录CU(已弃用)
    param->decodedPictureHashSEI = 0;	// 为重建帧生成SEI信息,可以用来检查重建帧是否匹配(似乎是调试功能)

    /* Quality Measurement Metrics */
    param->bEnablePsnr = 0;				// 是否计算PSNR
    param->bEnableSsim = 0;				// 是否计算SSIM

    /* Source specifications */
    param->internalBitDepth = X265_DEPTH;	// 内部计算时的位宽
    param->sourceBitDepth = 8;				// 输入源的位宽
    param->internalCsp = X265_CSP_I420;		// 内部pic的color space ,默认为I420
    param->levelIdc = 0; //Auto-detect level,最低解码器要求级别。默认为0,表示由编码器自动检测
    param->uhdBluray = 0;					// 启用UHD蓝光兼容支持
    param->bHighTier = 1; //Allow high tier by default,如果指定了levelIdc(非零),这个标志将区分Main(0)和High(1)层。默认为Main层(0)
    param->interlaceMode = 0;				// 源图片的交错类型。0 -渐进式图片(默认)。1 -顶部字段优先,2 -底部字段优先
    param->bField = 0;						// 允许场编码
    param->bAnnexB = 1;						// 是否按照AnnexB的格式生成start code或length
    param->bRepeatHeaders = 0;				// 表示每个关键帧是否输出VPS, SPS和PPS报头的标志
    param->bEnableAccessUnitDelimiters = 0;	// 指示编码器是否应在每个访问单元的开始处发出访问单元分隔符NAL的标志
	// SEI相关功能
    param->bEmitHRDSEI = 0;					// 启用缓冲周期SEI和图片定时SEI
    param->bEmitInfoSEI = 1;				// 启用带有描述编码器版本、构建信息和参数的流标头的用户数据SEI的输出
    param->bEmitHDRSEI = 0; /*Deprecated*/
    param->bEmitHDR10SEI = 0;				// 使能发送包含HDR10特定参数的HDR10 SEI报文。当指定了max-cll、max-fall或master显示信息时自动启用
    param->bEmitIDRRecoverySEI = 0;			// 启用恢复点SEI的输出

    /* CU definitions */
    param->maxCUSize = 64;					// 最大CU尺寸
    param->minCUSize = 8;					// 最小CU尺寸
    param->tuQTMaxInterDepth = 1;			// TU的额外深度允许递归到QT之外,用于帧间编码
    param->tuQTMaxIntraDepth = 1;			// TU的额外深度允许递归到QT之外,用于帧内编码
    param->maxTUSize = 32;					// 最大的TU尺寸

    /* Coding Structure */
    param->keyframeMin = 0;					// 最小关键帧距离
    param->keyframeMax = 250;				// 最大关键帧距离
    param->gopLookahead = 0;				// 提前查找最佳的gop结构
    param->bOpenGOP = 1;					// 是否启用开放式gop(I slice不一定是IDR)
    param->bframes = 4;						// 最大连续的b帧数量
    param->lookaheadDepth = 20;				// lookahead队列的长度
    param->bFrameAdaptive = X265_B_ADAPT_TRELLIS;	// B帧的自适应选择方式
    param->bBPyramid = 1;					// 是否使用双向预测的金字塔结构
    param->scenecutThreshold = 40; /* Magic number pulled in from x264 */ // 场景切换的阈值(超过这个阈值就认为发生了场景切换)
    param->edgeTransitionThreshold = 0.03;	// 边缘过渡阈值(超过这个阈值则认为这个像素是边缘过渡点)
    param->bHistBasedSceneCut = 0;			// 启用基于直方图的场景检测算法来检测场景
    param->lookaheadSlices = 8;				// 使用多少个工作线程来分析每帧的cost
    param->lookaheadThreads = 0;			// lookahead线程数
    param->scenecutBias = 5.0;				// 场景切换敏感度,减小scenecutBias的值会使得编码器对场景切换不那么敏感
    param->radl = 0;						// IDR前允许的RADL图片数量
    param->chunkStart = 0;					 
    param->chunkEnd = 0;
    param->bEnableHRDConcatFlag = 0;
    param->bEnableFades = 0;
    param->bEnableSceneCutAwareQp = 0;		// 在速率控制pass2算法中增加QP来减少场景切换前后场景窗口内intra cost使用比特数
    param->scenecutWindow = 500;
    param->refQpDelta = 5;
    param->nonRefQpDelta = param->refQpDelta + (SLICE_TYPE_DELTA * param->refQpDelta);

    /* Intra Coding Tools */
    param->bEnableConstrainedIntra = 0;		// 启用受限的帧内预测。这会导致对已经进行帧间预测的输入样本进行帧内预测
    param->bEnableStrongIntraSmoothing = 1;	// 为参考样本平坦的32x32区块启用强帧内平滑
    param->bEnableFastIntra = 0;			// 使用快速搜索方法去寻找最佳的intra模式
    param->bEnableSplitRdSkip = 0;			// 当划分CU的RDCost总和大于不划分CU的rdcost时,启用跳过划分rd分析的功能

    /* Inter Coding tools */
    param->searchMethod = X265_HEX_SEARCH;	// 帧间搜索方式(默认为六边形搜索)
    param->subpelRefine = 2;				// 亚像素运动估计级别(默认为2,即1/4像素)
    param->searchRange = 57;				// 搜索范围
    param->maxNumMergeCand = 3;				// merge模式中候选列表的最大数量
    param->limitReferences = 1;				// 用于运动搜索的参考帧数量
    param->limitModes = 0;					// 用于控制编码过程中的模式数量
    param->bEnableWeightedPred = 1;			// 启用P帧的加权预测功能
    param->bEnableWeightedBiPred = 0;		// 启用B帧的加权预测功能
    param->bEnableEarlySkip = 1;			// 启用early skip来跳过一些模式决策
    param->recursionSkipMode = 1;			// 启用early CU size决策,从而跳过深层次划分
    param->edgeVarThreshold = 0.05f;		// 边缘检测的阈值
    param->bEnableAMP = 0;					// 启用不对称运动预测
    param->bEnableRectInter = 0;			// 启用矩形运动预测分区
    param->rdLevel = 3;						// 在模式和深度决策期间执行的速率失真优化的level
    param->rdoqLevel = 0;					// 控制RDQO的level
    param->bEnableSignHiding = 1;			// 运动矢量的符号隐藏
    param->bEnableTransformSkip = 0;		// 变换跳过模式(不进行DCT变换)
    param->bEnableTSkipFast = 0;			// 允许快速决策,决策的对象为是否要进行变换跳过模式
    param->maxNumReferences = 3;			// P帧或B帧前向参考队列中最大帧数(范围为1到16)
    param->bEnableTemporalMvp = 1;			// Temporal MVP
    param->bEnableHME = 0;					// 多层级运动估计
    param->hmeSearchMethod[0] = X265_HEX_SEARCH;
    param->hmeSearchMethod[1] = param->hmeSearchMethod[2] = X265_UMH_SEARCH;
    param->hmeRange[0] = 16;
    param->hmeRange[1] = 32;
    param->hmeRange[2] = 48;
    param->bSourceReferenceEstimation = 0;
    param->limitTU = 0;
    param->dynamicRd = 0;

    /* Loop Filter */
    param->bEnableLoopFilter = 1;	// 环路滤波

    /* SAO Loop Filter */
    param->bEnableSAO = 1;			// SAO滤波
    param->bSaoNonDeblocked = 0;
    param->bLimitSAO = 0;
    param->selectiveSAO = 0;

    /* Coding Quality */
    param->cbQpOffset = 0;			// Cb分量的Qp offset
    param->crQpOffset = 0;			// Cr分量的Qp offset
    param->rdPenalty = 0;			// Rate和Distortion之间的惩罚项,penalty增加,视频质量增加而编码比特增加;penalty减小,视频质量降低而编码比特也减小
    param->psyRd = 2.0;				// psy表示心理视觉,这里基于主观质量来调控Rd
    param->psyRdoq = 0.0;			// 基于主观质量调控Rdoq
    param->analysisReuseMode = 0; /*DEPRECATED*/
    param->analysisMultiPassRefine = 0;		// 通过多步细化分析来优化编码设置
    param->analysisMultiPassDistortion = 0;	// 多通道失真分析,以优化编码质量和性能
	param->analysisReuseFileName = NULL;	// 重分析文件名
    param->analysisSave = NULL;				// 存储每帧的分析信息
    param->analysisLoad = NULL;				// 读取信息
    param->bIntraInBFrames = 1;				// 控制B帧是否允许进行帧内预测编码
    param->bLossless = 0;					// 无损模式
    param->bCULossless = 0;					// CU级无损模式(相对于Lossless而言,性能影响较小)
    param->bEnableTemporalSubLayers = 0;	// TemporalSubLayers
    param->bEnableRdRefine = 0;				// 允许Rd的Refine
    param->bMultiPassOptRPS = 0;			// 多边编码优化
    param->bSsimRd = 0;						// SSIM相关的比特率控制

    /* Rate control options */
    param->rc.vbvMaxBitrate = 0;			// VBV Buffer max rate
    param->rc.vbvBufferSize = 0;			// VBV Buffer size (kilobits)
    param->rc.vbvBufferInit = 0.9;			// VBV Buffer初始比例(开始编码之前)
    param->vbvBufferEnd = 0;				// VBV Buffer的结束阈值
    param->vbvEndFrameAdjust = 0;			// 调整VBV缓冲区结束帧的大小
    param->minVbvFullness = 50;				// VBV Buffer最小水量(至少达到50%)
    param->maxVbvFullness = 80;				// VBV Buffer最大水量(不超过80%)
    param->rc.rfConstant = 28;				// crf参数,用于计算拉格朗日乘数
    param->rc.bitrate = 0;					// 码率
    param->rc.qCompress = 0.6;				// qCompress的强度(增大qcompress,提高压缩率但降低视频质量)
    param->rc.ipFactor = 1.4f;				// I帧到P帧的QP Offset
    param->rc.pbFactor = 1.3f;				// P帧到B帧的QP Offset
    param->rc.qpStep = 4;					// 帧之间最大的QP差值
    param->rc.rateControlMode = X265_RC_CRF;	// 默认使用的码控模式
    param->rc.qp = 32;							// Base QP
    param->rc.aqMode = X265_AQ_AUTO_VARIANCE;	// AQ模式
    param->rc.hevcAq = 0;					// 是否启用hevcAQ
    param->rc.qgSize = 32;					// 量化群组的大小(Quantization Group)
    param->rc.aqStrength = 1.0;				// AQ强度
    param->rc.qpAdaptationRange = 1.0;		// QP的自适应调整范围
    param->rc.cuTree = 1;					// 启用CUTree速率控制。这样可以跟踪在帧间临时传播的cu,并为这些cu分配更多的bit
    param->rc.rfConstantMax = 0;			// 在CRF模式下,最大CRF的值
    param->rc.rfConstantMin = 0;			// 在CRF模式下,最小CRF的值
    param->rc.bStatRead = 0;				// 在multi-pass模式下,允许读取stat文件
    param->rc.bStatWrite = 0;				// 在multi-pass模式下,允许写入stat文件
    param->rc.statFileName = NULL;			// 在multi-pass模式下,写入或读取的stat文件
    param->rc.complexityBlur = 20;			// 时域的复杂度模糊
    param->rc.qblur = 0.5;					// 时域的模糊量化
    param->rc.zoneCount = 0;				
    param->rc.zonefileCount = 0;
    param->rc.zones = NULL;
    param->rc.bEnableSlowFirstPass = 1;	
    param->rc.bStrictCbr = 0;				// 启用更严格的条件来检查CBR模式下的比特率偏差(可能会牺牲质量来维持比特率稳定)
    param->rc.bEnableGrain = 0;				// 启用或禁用颗粒(噪声)效果,以改善视频的视觉感官
    param->rc.qpMin = 0;					// 最小QP值
    param->rc.qpMax = QP_MAX_MAX;			// 最大QP值
    param->rc.bEnableConstVbv = 0;			// 是否使用固定的VBV
    param->bResetZoneConfig = 1;
    param->reconfigWindowSize = 0;
    param->decoderVbvMaxRate = 0;
    param->bliveVBV2pass = 0;

    /* Video Usability Information (VUI) */
    param->vui.aspectRatioIdc = 0;
    param->vui.sarWidth = 0;	// sample ratio width
    param->vui.sarHeight = 0;
    param->vui.bEnableOverscanAppropriateFlag = 0;
    param->vui.bEnableVideoSignalTypePresentFlag = 0;
    param->vui.videoFormat = 5;
    param->vui.bEnableVideoFullRangeFlag = 0;
    param->vui.bEnableColorDescriptionPresentFlag = 0;
    param->vui.colorPrimaries = 2;
    param->vui.transferCharacteristics = 2;
    param->vui.matrixCoeffs = 2;
    param->vui.bEnableChromaLocInfoPresentFlag = 0;
    param->vui.chromaSampleLocTypeTopField = 0;
    param->vui.chromaSampleLocTypeBottomField = 0;
    param->vui.bEnableDefaultDisplayWindowFlag = 0;
    param->vui.defDispWinLeftOffset = 0;
    param->vui.defDispWinRightOffset = 0;
    param->vui.defDispWinTopOffset = 0;
    param->vui.defDispWinBottomOffset = 0;
    param->maxCLL = 0;
    param->maxFALL = 0;
    param->minLuma = 0;
    param->maxLuma = PIXEL_MAX;
    param->log2MaxPocLsb = 8;
    param->maxSlices = 1;

    /*Conformance window*/
    param->confWinRightOffset = 0;
    param->confWinBottomOffset = 0;

    param->bEmitVUITimingInfo   = 1;
    param->bEmitVUIHRDInfo      = 1;
    param->bOptQpPPS            = 0;
    param->bOptRefListLengthPPS = 0;
    param->bOptCUDeltaQP        = 0;
    param->bAQMotion = 0;
    param->bHDROpt = 0; /*DEPRECATED*/
    param->bHDR10Opt = 0;
    param->analysisReuseLevel = 0;  /*DEPRECATED*/
    param->analysisSaveReuseLevel = 0;
    param->analysisLoadReuseLevel = 0;
    param->toneMapFile = NULL;
    param->bDhdr10opt = 0;
    param->dolbyProfile = 0;
    param->bCTUInfo = 0;
    param->bUseRcStats = 0;
    param->scaleFactor = 0;
    param->intraRefine = 0;
    param->interRefine = 0;
    param->bDynamicRefine = 0;
    param->mvRefine = 1;
    param->ctuDistortionRefine = 0;
    param->bUseAnalysisFile = 1;
    param->csvfpt = NULL;
    param->forceFlush = 0;
    param->bDisableLookahead = 0;
    param->bCopyPicToFrame = 1;
    param->maxAUSizeFactor = 1;
    param->naluFile = NULL;

    /* DCT Approximations */
    param->bLowPassDct = 0;
    param->bAnalysisType = 0;
    param->bSingleSeiNal = 0;

    /* SEI messages */
    param->preferredTransferCharacteristics = -1;
    param->pictureStructure = -1;
    param->bEmitCLL = 1;

    param->bEnableFrameDuplication = 0;
    param->dupThreshold = 70;

    /* SVT Hevc Encoder specific params */
    param->bEnableSvtHevc = 0;
    param->svtHevcParam = NULL;

#ifdef SVT_HEVC
    param->svtHevcParam = svtParam;
    svt_param_default(param);
#endif
}

2. 档位配置(preset & tune)

档位配置函数x265_param_default_preset()位于common\param.cpp中,主要有三个步骤:
(1)配置默认参数(x265_param_default)
(2)配置preset
(3)配置tune

int x265_param_default_preset(x265_param* param, const char* preset, const char* tune)
{
#if EXPORT_C_API
	// 1. 配置默认参数
    ::x265_param_default(param); 
#else
    X265_NS::x265_param_default(param);
#endif
	// 2. 配置preset
    if (preset)
    {
        char *end;
        int i = strtol(preset, &end, 10);
        if (*end == 0 && i >= 0 && i < (int)(sizeof(x265_preset_names) / sizeof(*x265_preset_names) - 1))
            preset = x265_preset_names[i];

        if (!strcmp(preset, "ultrafast"))
        {
            param->maxNumMergeCand = 2;
            param->bIntraInBFrames = 0;
            param->lookaheadDepth = 5;
            param->scenecutThreshold = 0; // disable lookahead
            param->maxCUSize = 32;			// 减小了CU尺寸
            param->minCUSize = 16;
            param->bframes = 3;
            param->bFrameAdaptive = 0;
            param->subpelRefine = 0;
            param->searchMethod = X265_DIA_SEARCH;
            param->bEnableSAO = 0;
            param->bEnableSignHiding = 0;
            param->bEnableWeightedPred = 0;
            param->rdLevel = 2;
            param->maxNumReferences = 1;
            param->limitReferences = 0;
            param->rc.aqStrength = 0.0;
            param->rc.aqMode = X265_AQ_NONE;
            param->rc.hevcAq = 0;
            param->rc.qgSize = 32;
            param->bEnableFastIntra = 1;
        }
        else if (!strcmp(preset, "superfast"))
        {
            param->maxNumMergeCand = 2;
            param->bIntraInBFrames = 0;
            param->lookaheadDepth = 10;
            param->maxCUSize = 32;
            param->bframes = 3;
            param->bFrameAdaptive = 0;
            param->subpelRefine = 1;
            param->bEnableWeightedPred = 0;
            param->rdLevel = 2;
            param->maxNumReferences = 1;
            param->limitReferences = 0;
            param->rc.aqStrength = 0.0;
            param->rc.aqMode = X265_AQ_NONE;
            param->rc.hevcAq = 0;
            param->rc.qgSize = 32;
            param->bEnableSAO = 0;
            param->bEnableFastIntra = 1;
        }
        else if (!strcmp(preset, "veryfast"))
        {
            param->maxNumMergeCand = 2;
            param->limitReferences = 3;
            param->bIntraInBFrames = 0;
            param->lookaheadDepth = 15;
            param->bFrameAdaptive = 0;
            param->subpelRefine = 1;
            param->rdLevel = 2;
            param->maxNumReferences = 2;
            param->rc.qgSize = 32;
            param->bEnableFastIntra = 1;
        }
        else if (!strcmp(preset, "faster"))
        {
            param->maxNumMergeCand = 2;
            param->limitReferences = 3;
            param->bIntraInBFrames = 0;
            param->lookaheadDepth = 15;
            param->bFrameAdaptive = 0;
            param->rdLevel = 2;
            param->maxNumReferences = 2;
            param->bEnableFastIntra = 1;
        }
        else if (!strcmp(preset, "fast"))
        {
            param->maxNumMergeCand = 2;
            param->limitReferences = 3;
            param->bEnableEarlySkip = 0;
            param->bIntraInBFrames = 0;
            param->lookaheadDepth = 15;
            param->bFrameAdaptive = 0;
            param->rdLevel = 2;
            param->maxNumReferences = 3;
            param->bEnableFastIntra = 1;
        }
        else if (!strcmp(preset, "medium"))
        {
            /* defaults */
            // 前面进行默认配置时,就是medium配置
        }
        else if (!strcmp(preset, "slow"))
        {
            param->limitReferences = 3;
            param->bEnableEarlySkip = 0;
            param->bIntraInBFrames = 0;
            param->bEnableRectInter = 1;
            param->lookaheadDepth = 25;
            param->rdLevel = 4;
            param->rdoqLevel = 2;
            param->psyRdoq = 1.0;
            param->subpelRefine = 3;
            param->searchMethod = X265_STAR_SEARCH;
            param->maxNumReferences = 4;
            param->limitModes = 1;
            param->lookaheadSlices = 4; // limit parallelism as already enough work exists
        }
        else if (!strcmp(preset, "slower"))
        {
            param->bEnableEarlySkip = 0;
            param->bEnableWeightedBiPred = 1;
            param->bEnableAMP = 1;
            param->bEnableRectInter = 1;
            param->lookaheadDepth = 40;
            param->bframes = 8;
            param->tuQTMaxInterDepth = 3;
            param->tuQTMaxIntraDepth = 3;
            param->rdLevel = 6;
            param->rdoqLevel = 2;
            param->psyRdoq = 1.0;
            param->subpelRefine = 4;
            param->maxNumMergeCand = 4;
            param->searchMethod = X265_STAR_SEARCH;
            param->maxNumReferences = 5;
            param->limitModes = 1;
            param->lookaheadSlices = 0; // disabled for best quality
            param->limitTU = 4;
        }
        else if (!strcmp(preset, "veryslow"))
        {
            param->bEnableEarlySkip = 0;
            param->bEnableWeightedBiPred = 1;
            param->bEnableAMP = 1;
            param->bEnableRectInter = 1;
            param->lookaheadDepth = 40;
            param->bframes = 8;
            param->tuQTMaxInterDepth = 3;
            param->tuQTMaxIntraDepth = 3;
            param->rdLevel = 6;
            param->rdoqLevel = 2;
            param->psyRdoq = 1.0;
            param->subpelRefine = 4;
            param->maxNumMergeCand = 5;
            param->searchMethod = X265_STAR_SEARCH;
            param->maxNumReferences = 5;
            param->limitReferences = 0;
            param->limitModes = 0;
            param->lookaheadSlices = 0; // disabled for best quality
            param->limitTU = 0;
        }
        else if (!strcmp(preset, "placebo"))
        {
            param->bEnableEarlySkip = 0;
            param->bEnableWeightedBiPred = 1;
            param->bEnableAMP = 1;
            param->bEnableRectInter = 1;
            param->lookaheadDepth = 60;
            param->searchRange = 92;
            param->bframes = 8;
            param->tuQTMaxInterDepth = 4;
            param->tuQTMaxIntraDepth = 4;
            param->rdLevel = 6;
            param->rdoqLevel = 2;
            param->psyRdoq = 1.0;
            param->subpelRefine = 5;
            param->maxNumMergeCand = 5;
            param->searchMethod = X265_STAR_SEARCH;
            param->bEnableTransformSkip = 1;
            param->recursionSkipMode = 0;
            param->maxNumReferences = 5;
            param->limitReferences = 0;
            param->lookaheadSlices = 0; // disabled for best quality
            // TODO: optimized esa
        }
        else
            return -1;
    }
    // 3. 配置tune
    if (tune)
    {
        if (!strcmp(tune, "psnr"))
        {
            param->rc.aqStrength = 0.0;
            param->psyRd = 0.0;
            param->psyRdoq = 0.0;
        }
        else if (!strcmp(tune, "ssim"))
        {
            param->rc.aqMode = X265_AQ_AUTO_VARIANCE;
            param->psyRd = 0.0;
            param->psyRdoq = 0.0;
        }
        else if (!strcmp(tune, "fastdecode") ||
                 !strcmp(tune, "fast-decode"))
        {
        	// 快速解码模式
        	// 不允许进行滤波和加权预测,节省时间
            param->bEnableLoopFilter = 0;
            param->bEnableSAO = 0;
            param->bEnableWeightedPred = 0;
            param->bEnableWeightedBiPred = 0;
            param->bIntraInBFrames = 0;
        }
        else if (!strcmp(tune, "zerolatency") ||
                 !strcmp(tune, "zero-latency"))
        {
        	// 零延时模式
            param->bFrameAdaptive = 0;
            param->bframes = 0;				// 不使用B帧
            param->lookaheadDepth = 0;		// lookaheadDepth限制
            param->scenecutThreshold = 0;	// 不进行场景切换
            param->bHistBasedSceneCut = 0;
            param->rc.cuTree = 0;			// 不进行CUTree码控,因为涉及到了视频内容变化快慢
            param->frameNumThreads = 1;
        }
        else if (!strcmp(tune, "grain"))	// 添加颗粒噪声,能够改善视觉质感
        {
            param->rc.ipFactor = 1.1;
            param->rc.pbFactor = 1.0;
            param->rc.cuTree = 0;
            param->rc.aqMode = 0;
            param->rc.hevcAq = 0;
            param->rc.qpStep = 1;
            param->rc.bEnableGrain = 1;
            param->recursionSkipMode = 0;
            param->psyRd = 4.0;
            param->psyRdoq = 10.0;
            param->bEnableSAO = 0;
            param->rc.bEnableConstVbv = 1;
        }
        else if (!strcmp(tune, "animation"))	// 优化动画内容的编码效率
        {
        	// 动画内容的特点是具有高色彩饱和度和大量平缓无纹理区域
            param->bframes = (param->bframes + 2) >= param->lookaheadDepth? param->bframes : param->bframes + 2;
            param->psyRd = 0.4;	// 设置主观的Rd调控
            param->rc.aqStrength = 0.4;
            param->deblockingFilterBetaOffset = 1;
            param->deblockingFilterTCOffset = 1;
        }
        else if (!strcmp(tune, "vmaf"))  /*Adding vmaf for x265 + SVT-HEVC integration support*/
        {
            /*vmaf is under development, currently x265 won't support vmaf*/
        }
        else
            return -1;
    }

#ifdef SVT_HEVC
    if (svt_set_preset(param, preset))
        return -1;
#endif

    return 0;
}

从配置项来看,x265需要熟悉的模块包括:
(1)编码块大小的改动
x265编码块的最大尺寸为64,最小尺寸为8

(2)帧内预测和帧间预测
相对比于x264而言,x265增加了帧内预测模式,也增加了帧间预测的工具,例如更高精度的运动补偿,AMVP和Merge Candidate List

(3)变换量化
x265使用了TU这一变换块,使得变换过程更加高效,量化工具也有变化

(4)滤波
新增SAO滤波

针对于这些模块,后续再逐一记录

Open Source (GPL) H.265/HEVC video encoder 下载网址:https://bitbucket.org/multicoreware/x265/src x265 developer wiki To compile x265 you must first install Mercurial (or TortoiseHg on Windows) and CMake. Then follow these easy steps: (for the most definitive instructions, consult our build README) Linux Instructions # ubuntu packages: $ sudo apt-get install mercurial cmake cmake-curses-gui build-essential yasm # Note: if the packaged yasm is older than 1.2, you must download yasm-1.2 and build it $ hg clone https://bitbucket.org/multicoreware/x265 $ cd x265/build/linux $ ./make-Makefiles.bash $ make Windows (Visual Studio) Instructions $ hg clone https://bitbucket.org/multicoreware/x265 Then run make-solutions.bat in the build\ folder that corresponds to your favorite compiler, configure your build options, click 'configure', click 'generate', then close cmake-gui. You will be rewarded with an x265.sln file. Also see cmake documentation. Intel Compiler Instructions On Windows, you should open an Intel Compiler command prompt and within it run one of the make-makefiles.bat scripts in build/icl32 or build/icl64, then run nmake. On Linux, you can tell cmake to build Makefiles for icpc directly. This requires you to have configured Intel's compiler environment (by sourcing the appropriate shell script). For example: $ source /opt/intel/composer_xe_2013/bin/compilervars.sh intel64 $ cd repos/x265/build/linux $ export CXX=icpc $ export CC=icc $ ./make-Makefiles $ make Command line interface The Makefile/solution builds a static encoder.lib library and a standalone x265 executable that aims to be similar to x264 in its command line interface. Running without arguments shows you the command line help. Info Mission Statement Road Map TODO HOWTO add a new encoder performance primitive HOWTO Contribute patches to x265 HOWTO cross compile from Linux to Windows Coding Style Helpful links
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值