`
weiyinchao88
  • 浏览: 1213381 次
文章分类
社区版块
存档分类
最新评论

X264学习笔记(1)

 
阅读更多

X264学习笔记(1)



X264编码流程

参数的初始化

1.opt,param根据输入的参数和标准的规定,进行初始化设置。

Opt的说明如下:

Opt->hin用于给出读入的yuv文件的指针地址

Opt->hout给出了输出的文件的指针地址

Opt->i_seek给出了起始编码帧的帧数,是由编码时的seek命令参数决定的

如:

X264 -seek 10 -o foreman.cif test.264 352x288

i_seek 设为10,表示起始编码的帧为元序列的第十帧

Opt->qpfile按照说明,为qp值文件输入进行定义这种方式的接口,可以通过读入标准的文件格式,对编码时的qp值进行定义。

Param的说明:

typedef struct

{

/* CPU flags */

unsigned int cpu;

int i_threads; /* divide each frame into multiple slices, encode in parallel */线程数,用于多线程并行编码

/* Video Properties */

int i_width; 图像的宽度

int i_height; 图像的高度

int i_csp; /* CSP of encoded bitstream, only i420 supported */ 色彩空间的设置

int i_level_idc; level 值的设置

int i_frame_total; /* number of frames to encode if known, else 0 */ 总共需要编码的帧数,由--frames设置

Vui参数集

struct

{

/* they will be reduced to be 0 < x <= 65535 and prime */

int i_sar_height;

int i_sar_width;

int i_overscan; /* 0=undef, 1=no overscan, 2=overscan */

/* see h264 annex E for the values of the following */

int i_vidformat;

int b_fullrange;

int i_colorprim;

int i_transfer;

int i_colmatrix;

int i_chroma_loc; /* both top & bottom */

} vui;

int i_fps_num;

int i_fps_den;

这两个参数是由fps帧率确定的,赋值的过程见下:

{

float fps;

if( sscanf( value, "%d/%d", &p->i_fps_num, &p->i_fps_den ) == 2 )

;

else if( sscanf( value, "%f", &fps ) )

{

p->i_fps_num = (int)(fps * 1000 + .5);

p->i_fps_den = 1000;

}

else

b_error = 1;

}

Value的值就是fps。

/* Bitstream parameters */

int i_frame_reference; /* Maximum number of reference frames */

int i_keyint_max; /* Force an IDR keyframe at this interval */

int i_keyint_min; /* Scenecuts closer together than this are coded as I, not IDR. */

int i_scenecut_threshold; /* how aggressively to insert extra I frames */

int i_bframe; /* how many b-frame between 2 references pictures */

int b_bframe_adaptive;

int i_bframe_bias;

int b_bframe_pyramid; /* Keep some B-frames as references */

去块滤波器需要的参数

int b_deblocking_filter;

int i_deblocking_filter_alphac0; /* [-6, 6] -6 light filter, 6 strong */

int i_deblocking_filter_beta; /* [-6, 6] idem */

熵编码

int b_cabac;

int i_cabac_init_idc;

量化

int i_cqm_preset;

char *psz_cqm_file; /* JM format */

uint8_t cqm_4iy[16]; /* used only if i_cqm_preset == X264_CQM_CUSTOM */

uint8_t cqm_4ic[16];

uint8_t cqm_4py[16];

uint8_t cqm_4pc[16];

uint8_t cqm_8iy[64];

uint8_t cqm_8py[64];

/* Log */

void (*pf_log)( void *, int i_level, const char *psz, va_list );

void *p_log_private;

int i_log_level;

int b_visualize;

/* Encoder analyser parameters */

struct

{

unsigned int intra; /* intra partitions */

unsigned int inter; /* inter partitions */

int b_transform_8x8;

int b_weighted_bipred; /* implicit weighting for B-frames */

int i_direct_mv_pred; /* spatial vs temporal mv prediction */

int i_chroma_qp_offset;

int i_me_method; /* motion estimation algorithm to use (X264_ME_*) */

int i_me_range; /* integer pixel motion estimation search range (from predicted mv) */

int i_mv_range; /* maximum length of a mv (in pixels) */

int i_subpel_refine; /* subpixel motion estimation quality */

int b_bidir_me; /* jointly optimize both MVs in B-frames */

int b_chroma_me; /* chroma ME for subpel and mode decision in P-frames */

int b_bframe_rdo; /* RD based mode decision for B-frames */

int b_mixed_references; /* allow each mb partition in P-frames to have it's own reference number */

int i_trellis; /* trellis RD quantization */

int b_fast_pskip; /* early SKIP detection on P-frames */

int b_dct_decimate; /* transform coefficient thresholding on P-frames */

int i_noise_reduction; /* adaptive pseudo-deadzone */

int b_psnr; /* Do we compute PSNR stats (save a few % of cpu) */

} analyse;

/* Rate control parameters */

struct

{

int i_rc_method; /* X264_RC_* */

int i_qp_constant; /* 0-51 */

int i_qp_min; /* min allowed QP value */

int i_qp_max; /* max allowed QP value */

int i_qp_step; /* max QP step between frames */

int i_bitrate; 比特率 --bitrate控制

int i_rf_constant; /* 1pass VBR, nominal QP */

float f_rate_tolerance;

int i_vbv_max_bitrate;

int i_vbv_buffer_size;

float f_vbv_buffer_init;

float f_ip_factor;

float f_pb_factor;

/* 2pass */

int b_stat_write; /* Enable stat writing in psz_stat_out */

char *psz_stat_out;

int b_stat_read; /* Read stat from psz_stat_in and use it */

char *psz_stat_in;

/* 2pass params (same as ffmpeg ones) */

char *psz_rc_eq; /* 2 pass rate control equation */

float f_qcompress; /* 0.0 => cbr, 1.0 => constant qp */

float f_qblur; /* temporally blur quants */

float f_complexity_blur; /* temporally blur complexity */

x264_zone_t *zones; /* ratecontrol overrides */

int i_zones; /* sumber of zone_t's */

char *psz_zones; /* alternate method of specifying zones */

} rc;

/* Muxing parameters */

int b_aud; /* generate access unit delimiters */

int b_repeat_headers; /* put SPS/PPS before each keyframe */

int i_sps_id; /* SPS and PPS id number */

} x264_param_t;

分享到:
评论

相关推荐

    x264学习笔记(1)-函数调用流程

    x264学习笔记(1)-函数调用流程 1. x264概述: x264是开源的H.264/MPEG-4 AVC视频编码库,广泛用于编码高清视频。它支持多种操作系统和处理器架构,且具备高度的可配置性。x264实现了标准中的高级特性,如B帧、...

    cocos2d-x学习笔记

    《cocos2d-x学习笔记》 在学习cocos2d-x时,了解其核心组件和工作流程至关重要。AppDelegate是cocos2d-x框架中的一个关键类,它扮演着应用程序入口点的角色,处理应用程序的生命周期事件。让我们深入探讨...

    ffmpeg学习笔记1 编译x264(Win10+android-ndk-r22)生成的arm64-v8a动、静态库

    ffmpeg学习笔记1 编译x264(Win10+android-ndk-r22)生成的arm64-v8a动、静态库 https://blog.csdn.net/aggs1990/article/details/124575758 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者...

    java学习笔记1

    Java学习笔记1 Java学习笔记1是学习Java过程中的笔记,主要记录了Eclipse开发环境中的快捷键使用、编辑功能、查找和调试等知识点。 Eclipse快捷键 Eclipse中有许多快捷键,掌握这些快捷键可以大大提高开发效率。...

    Vue2.X基础学习笔记 md版本

    Vue2.X基础学习笔记 md版本

    Go 学习笔记——雨痕

    Go语言,又称Golang,是一种静态类型的编程语言,由Google开发,于2007年首次对外公布,并在2009年进行了...通过本学习笔记的内容,我们可以对Go语言有一个全面而系统的认识,为深入学习和应用Go语言打下坚实的基础。

    Go 学习笔记 第四版 pdf

    根据提供的信息,我们可以总结出这份文档是关于Go语言学习笔记的部分内容,主要涵盖了Go语言的基础概念、语法结构、数据类型以及并发模型等关键知识点。以下是对这些知识点的详细解析: ### Go语言概述 Go(也称作...

    LabVIEW学习笔记 LabVIEW学习笔记

    ### LabVIEW学习笔记知识点梳理 #### 一、调试技巧与数据监测 - **探针工具**: 在调试过程中,可以通过右键菜单中的`probe`和`custom probe`功能来设置探针,用于实时监测数据流。这有助于理解数据如何在各个节点...

    TMS320C64x学习笔记(1)-(3)合集

    《TMS320C64x学习笔记(1)-(3)合集》是一份针对TMS320C64x DSP(数字信号处理器)的综合学习资源,旨在帮助初学者深入理解和掌握该系列处理器的各个方面。TMS320C64x是由德州仪器(TI)开发的一款高性能、高效率的DSP...

    数论部分学习笔记-by BeiYu

    "数论学习笔记" 数论是数学的一个分支,研究整数和其他整数之间的关系。数论有很多重要的公式和定理,以下是数论学习笔记的一些重要知识点: 一、同余性质 1. 反身性:a≡a(mod m) 2. 对称性:若 a≡b(mod m)...

    Cocos2d-x学习笔记——完全掌握C++ API与游戏项目开发.zip

    本学习笔记旨在帮助开发者全面掌握Cocos2d-x的C++ API以及游戏项目的开发流程。 一、Cocos2d-x框架基础 Cocos2d-x是Cocos2d-x系列的C++版本,它提供了丰富的图形绘制、动画制作、音频播放、物理引擎等功能。Cocos2d...

    c++学习笔记精华版

    ### C++ 学习笔记精华版 #### 一、C++ 语言概述 **1、历史背景** - **C++ 的江湖地位** - Java、C、C++、Python、C# 是当前主流的编程语言之一,而 C++ 在这些语言中以其高效性和灵活性著称。 - **C++ 之父 ...

    perl个人学习笔记

    Perl是一种强大的脚本编程语言,...以上就是Perl学习笔记中涵盖的一些基础概念和操作。继续深入学习,你将能够编写更复杂的Perl脚本,解决各种实际问题。记得实践是学习编程的关键,多做练习,逐步提升你的Perl技能。

    vb6.0 学习笔记

    VB6.0学习笔记 VB6.0是一种功能强大且广泛应用的编程语言,以下是VB6.0学习笔记的重要知识点总结: 编码规则 在VB6.0中,代码不区分大小写,这意味着开发者可以随意使用大写或小写字母编写代码。另外,当一条语句...

    machine learning机器学习学习笔记

    机器学习是人工智能的一个分支,...从学习笔记的内容来看,个人对机器学习的入门知识点掌握较为全面,涵盖了从基本概念到技术应用、以及编程实践的多个方面,对于初学者而言,这些知识可以作为入门机器学习的有益参考。

Global site tag (gtag.js) - Google Analytics