X264的编译与使用

X264的编译

        X264的编译很久都没弄好(2013.1),现在专门写一篇学习X264的编译。

x264的编译步骤如下:

# 搭建mingw+msys环境,详见:http://blog.csdn.net/evsqiezi/article/details/8958308。

# 安装yasm,执行dnf install -y  yasm(或者wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz,再make,make install)。

# 安装pkg-config,下载源码(如pkgconfig-0.17.2),执行./configure;make;make check;make。

# 下载X264,地址为:http://www.videolan.org/developers/x264.html,并解压。

# 打开mysys,进入x264目录,执行

 ./configure --enable-shared  --prefix=/usr/local/x264 

make

make install

        可以在/usr/local/264下找到生成的文件。

测试X264.exe

x264 [--参数名 参数值 ...] --output 输出文件 输入文件
  其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号。
  此外,还有短参数模式。这是为了简化某些常用参数名设计的。一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。注意此时这个字母区分大小写。

测试编码的例子: x264.exe --crf 24 --input-res 352x288 -o "1.264" "stefan_cif.yuv"

如何设置视频关键帧I帧间隔问题
刚开始我只使用-g命令,设置GOP长度,编码后,发现I帧间隔长度并不是我想要的,后来我通过以下命令问题解决了:
-keyint_min 60 -g 60 -sc_threshold 0
其中-keyint_min为最小关键帧间隔,我这里设置为60帧;-sc_threshold这个命令会根据视频的运动场景,自动为你添加额外的I帧,所以会导致你编出来的视频关键帧间隔不是你设置的长度,这是只要将它设为0。
设置码率
-b 就是平均码率,不用-b就是变码率,-maxrate,-minrate可以限制峰值。
-maxrate bitrate设置最大视频码率容忍度
-minrate bitreate 设置最小视频码率容忍度
设置定码率 ffmpeg -i l.mp4 -c:v libx264 -x264-params "nal-hrd=cbr" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M  -acodec mp2    output.ts 

或    ffmpeg -i l.mp4 -nal-hrd cbr  -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M  -acodec mp2    output.ts
不过,ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize
-bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好)
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate -maxrate就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4

FFmpeg option

  x264 option
-g –keyint
-b –bitrate
-bufsize –vbv-bufsize
-maxrate –vbv-maxrate
-pass <1,2,3> –pass
-crf –crf
-cqp –qp
-bf –bframes
-coder <0,1> –no-cabac
-bframebias –b-bias
-keyint_min –min-keyint
-sc_threshold –scenecut
-deblockalpha -deblockbeta –deblock
-qmin –qpmin
-qmax –qpmax
-qdiff –qpstep
-qcomp –qcomp
-qblur –qblur
-complexityblur –cplxblur
-refs –ref
-directpred –direct
-me_method –me
-me_range –merange
-subq –subme
-bidir_refine <0,1> –bime
-trellis <0,1,2> –trellis
-nr –nr
-level –level
-bt –ratetol = -bt / -b
-rc_init_occupancy –vbv-init = -rc_init_occupancy / -bufsize
-i_qfactor –ipratio = 1 / -i_qfactor
-b_qfactor –pbratio
-chromaoffset –chroma-qp-offset
-rc_eq –rc_eq
-threads –threads
-cmp <-chroma/+chroma> –no-chroma-me
-partitions –partitions
+parti8×8 i8×8
+parti4×4 i4×4
+partp8×8 p8×8
+partp4×4 p4×4
+partb8×8 b8×8
-flags  
-loop/+loop –no-deblock/–deblock
-psnr/+psnr –no-psnr/nothing
-flags2  
+bpyramid –b-pyramid
+wpred –weightb
+brdo –b-rdo 我这里的ffmpeg已经不能用这个了
+mixed_refs –mixed-refs
+dct8×8 –8×8dct
-fastpskip/+fastpskip –no-fast-pskip
+aud –aud

 

常用参数如下:
bframes:
-bf frames 使用frames个B 帧,支持mpeg1,mpeg2,mpeg4(即如果-bf 2的话,在两个非b帧中间隔的b帧数目为2,即IBBPBBPBBP结构)
b-pyramid
默认:normal
说明:允许B帧作为参照帧。如果关闭,那么只有I帧和P帧才能作为参照帧。可以作为参照帧的B帧的量化参数会介于P帧和普通B帧之间。只在–b-frames设置大于等于2时此选项才生效。如果是在为蓝光光盘编码,请使用none或者strict。
none —— 不允许B帧作为参照帧;
strict —— 一个图像组内只允许一个B帧参照帧,这是蓝光编码强制要求的标准;
normal —— 任意使用B帧参照帧;

-B, --bitrate      Set bitrate (kbit/s)
默认:无
说明:三种可选的码率控制方法(bitrate, CQP,CRF)之一。设置x264使用固定目标比特率模式。固定目标比特率意味着最终文件的大小是可知的,但是目标的质量是不可知的。x264会试图让最终文件的整体码率与给定的码率相等。参数的量纲为Kbits/sec,x264程序里面1K是1000,而不是1024。
通常这个选项和–pass选项配合进行2趟编码。在网络流媒体应用中选择这个方法。
这个选项和 –qp和–crf是互斥的,三者只能选一个,选择的顺序是 bitrate > QP > CRF。
参见:–qp, –crf, –ratetol, –pass, –stats

crf:
一种根据片子质量自动分配码率的vbr码率控制方式
CRF(Constant Rate Factor): 范围 0-51: 0是编码毫无丢失信息, 23 is 默认, 51 是最差的情况。相对合理的区间是18-28。值越大,压缩效率越高,但也意味着信息丢失越严重,输出图像质量越差。
一般编码,如果对码率没要求请尽量使用crf模式。可用的值从1到51,越小编码质量越好,码率越高。一般使用16到24,可以为浮点。crf并不是恒定质量的方式,同一片子同一crf值,其他参数不同可能码率和质量能差比较大,不同的片子之间就更没有可比性了。

input-res:
输入文件的分辨率,格式为宽x高。
keyint
默认:250
说明:设置x264输出中最大的IDR帧(亦称关键帧)间距。
IDR帧是视频流的“分隔符”,所有帧都不可以使用越过关键帧的帧作为参考帧。IDR帧是I帧的一种,所以它们也不参照其它帧。这意味着它们可以作为视频的搜索(seek)点。
通过这个设置可以设置IDR帧的最大间隔帧数(亦称最大图像组长度)。较大的值将导致IDR帧减少(会用占用空间更少的P帧和B帧取代),也就同时减弱了参照帧选择的限制。较小的值导致减少搜索一个随机帧所需的平均时间。
建议:默认值(fps的10倍)对大多数视频都很好。如果在为蓝光、广播、直播流或者其它什么专业流编码,也许会需要更小的图像组长度(一般等于fps)。
参见:min-keyint, scenecut, intra-refresh
min-keyint
默认:auto(keyint/10)
说明:参见keyint的说明。过小的keyint范围会导致产生“错误的”IDR帧(比如说,一个闪屏场景,参见上一篇blog)。此选项限制了IDR帧之间的最小距离。
建议:默认,或者与fps相等
参见:keyint, scenecut
no-cabac
默认:无
说明:关闭CABAC (Context Adaptive Binary Arithmetic Coder)压缩,使用较为低效的CAVLC (Context Adaptive Variable Length Coder)。这两者在压缩效率和解码效率上有10%-20%的差别。
no-deblock
默认:无
说明:完全关闭内置去块滤镜。不推荐使用。
参见: –deblock

o:
输出文件,x264可以输出没有封装的H.264视频流,扩展名是.264;matroska视频,扩展名是.mkv;flash视频,扩展名是.flv;mp4视频,扩展名是.mp4。mkv、mp4和flv可以是vfr的。x264通过输出文件的扩展名判断输出文件类型。

x264支持输入的文件类型有raw yuv、y4m、avs和任何可以由ffms或lavf打开的文件。raw yuv会用在64位的x264里。有ffms/lavf打开的片子会自动正确的处理vfr问题。avs和ffms/lavf输入不需要指定片子的分辨率。
ref
默认:3
说明:控制DPB (Decoded Picture Buffer)的大小。可以在0-16之间选择。简单地说,就是设置P帧可以选择它之前的多少帧作为参照帧(B帧的值要小1-2,取决于那个B帧能不能作为参照)。最小可以选择值1,只参照自己前面的那帧。
注意H.264标准限制了每个level可以参照的帧的数量。如果选择level4.1,1080p最大选4,720p最大选9。
参照: –b-pyramid, –no-mixed-refs, –level

slices
默认:0
说明:设置每帧的分片数,强制使用矩形分片。(会被–slice-max-size 或 –slice-max-mbs选项覆盖)
如果是在为蓝光光盘编码,设置为4。如果不是,不要使用这个选项,除非你确定你需要它。
参见:–slice-max-size, –slice-max-mbs
slice-max-size
默认:0
说明:设置每个分块包括NAL头的最大大小(bytes)。 (目前与 –interlaced选项不兼容)
参见:–slices
slice-max-mbs
默认:0
说明:设置每个分块包含的最大宏块数量。 (目前与 –interlaced选项不兼容)
参见:–slices
ffmpeg
-top   top=1/bottom=0/auto=-1 field first
 ‘0, tff’
    顶场 (top field) 优先。
  ‘1, bff’
    底场 (bottom field) 优先.
  ‘-1, auto’
    启用场奇偶的自订检测。
  该默认值是 auto。 如果该交错是未知或者编码器没有汇出此讯息则 tff 将被假定。
tff
说明:开启隔行编码并设置上半场在前。x264的隔行编码使用MBAFF,因此效率不如逐行扫描。所以,仅在需要在隔行显示的设备上显示时才开启这个选项(或是送给x264之前无法进行反隔行扫描)。这个选项会触发 –pic-struct开启。
bff
说明:开启隔行编码并设置下半场在前。更多信息同–tff。 progressive就是逐行的,Interlaced就是隔行的。

interlaced mode ("P" for "progressive", "T" for top field first, "B" for bottom field first)

  隔行扫描模式("P"代表逐行,“T”代表上场优先,“B”代表下场优先)
qp
默认:无
说明:三种可选的码率控制方法之一。设置x264使用固定量化参数模式。给定的数量将被作为P帧的量化参数,I帧和B帧的量化参数由–ipratio and –pbratio参数进一步算出。QP模式适用固定的量化参数,这意味着最终的文件大小是不可知的(可以通过一些其他方法预测)。设置为0将产出无损的输出。相同视觉质量时,QP模式产出的文件比crf模式大。QP模式将关闭自适应量化器,因为它是固定QP的。
这个选项和 –bitrate和–crf是互斥的,三者只能选一个,它们背后的原理可以看这篇文章http://blog.yikuyiku.com/index.php/archives/1901。
一般而言crf都能代替QP模式,不过QP因为完全不需要预测所以它会运行地更快些。
参见:–bitrate, –crf, –ipratio, –pbratio
qpmin
默认:10
说明:设置x264可以使用的最小量化器。量化参数越小,输出越接近输入。使用某些值时,x264的输出可以和输入看起来完全一样,虽然其实并不是精确相同的,通常就够了没有必要使用更多比特在宏块上了。
如果开启了自适应量化器(默认开启),则不鼓励提高qpmin的值,那样可能会降低帧的平坦部分的质量。
参见:–qpmax, –ipratio
qpmax
默认:51
说明:qpmin的反面,设置x264可以使用的最大量化器。默认值51是H.264标准中的最大值,质量非常低。默认值51其实相当于没有设置 qpmax。如果你想控制x264输出的最低品质,也许你想要把这个值调低一点(调到30-40最低了),但一般而言不推荐调节这个值。参见:–qpmin, –pbratio, –crf-max
qpstep
默认:4
说明:设置2帧间量化器最大的可变值。
编码算法:
partitions
默认:’p8x8,b8x8,i8x8,i4x4′
说明:H.264在压缩前会被切分为16×16大小的宏块。这些块可被进一步切分成更小的块,利用此参数,可以控制不同的帧类型(I、P、B)开启更细的帧切分(8×8、4×4),具体参数如下:
I帧:i8x8、i4x4;
P帧:p8x8(会同时开启p16x8和p8x16)、p4x4(会同时开启p8x4和p4x8);
B帧:b8x8(会同时开启b16x8和b8x16);
另外,也可以设置为’none’和’all’。一般而言,开启p4x4不会带来多少的质量提升,而且它极其耗时,是个性价比比较低的选项。
参见:–no-8x8dct
direct
默认:’spatial’
说明:为’direct’类型的运动矢量设定预测模式。有两种可选的模式:spatial(空间预测)和temporal(时间预测)。可以设置为’none’关闭预测,也可以设置为’auto’让x264去选择它认为更好的模式,x264会在编码结束时告诉你它的选择。’auto’最好在2趟编码中使用,但也可以在1趟编码时使用。如果用于2趟编码,x264会在第1趟编吗时同时尝试2种预测模式,然后在第2趟编码时使用它认为较好的那一个。注意,如果第1趟编码时选择了’auto’,那么第2趟编码时也必须设置为’auto’。不然,第2趟编码会使用’temporal’。本选项从不会浪费比特,强烈推荐使用。
建议:’auto’
me
默认:’hex’
说明:设置全局的运动预测方法,有以下5种选择:
dia(四边形搜索) —— 最简单的搜索,从最乐观的情况开始预测,在运动矢量的上下左右分别偏移一个像素对比,选择其中最好的,循环直至找不到更匹配的运动矢量。
hex(六边形搜索) —— 和菱形差不多的策略,不同的是,它在6边形的6个顶点上进行rang-2的搜索,它实现了比dia有效率地多的搜索而几乎不会使用更多的耗时,它是普通编码任务一个很好的选择。
umh(不均匀的多六边形搜索) —— 显著地比hex要慢,但它尝试进行复杂多六边形的搜索,以避免错过那些难以找到的运动矢量。与hex和dia不同的是,merange参数直接任意大小控制umh的搜索半径。
esa(全局搜索) —— 高度优化的全局智能搜索,在最佳预测器的merange范围内进行运动搜索。在全局面进行运动向量的算术对比,虽然计算过程并不慢,但好事仍比umh有显著提升,而且并不会带来太多质量方面的提升。所以,对于日常的编码任务来说,它不是特别有用。
tesa(变换全局搜索) —— 使用一种算法,效果近于对全局的每个运动矢量进行Hadamard 变换比对。搜索方式上和esa很像,但是效果比esa好一点点,耗时也多一点点。
参见:–merange
merange
默认:16
说明:merange控制运动搜索的最大像素范围。对于hex和dia,范围被控制在4-16像素,默认就是16。对于umh和esa,可以超过默认的 16像素进行大范围的运行搜索,这对高分辨率视频和快速运动视频而言很有用。注意,对于umh、esa、tesa,增大merange会显著地增加编码耗时。
参见:–me
mvrange
默认:-1(自动)
说明:设置垂直的运动矢量最大像素值。默认值如下:
level 1/1b —— 64
level 1.1-2.0 —— 128
level 2.1-3.0 —— 256
level 3.1+ —— 512
注意:如果打算手动设置此值,要在上面给出的值的基础上减去0.25(如:–mvrange 127.75),
建议:保持默认
mvrange-thread
默认:-1(自动)
说明:设置线程间运动矢量的缓冲区大小的最小值。不要碰这个选项。
建议:保持默认
sliced-threads
默认: off
开启基于分片的线程。比默认方式质量低、效率低,但是没有编码延迟。
基于分片的最大线程数量公式:MIN( (height+15)/16 / 4, 128 )
建议: Default (off),除非你正在做实时流排序或者低延迟非常重要。

thread-input
默认: Set if threads > 1
在单独线程中解码输入视频用于编码进程。
建议: Default
threads
 默认: auto (基于帧的线程数:1.5 x 逻辑处理器数量,向下舍入取整;基于分片的线程数:1 x 逻辑处理器数量)
 在多核处理器上通过使用开启多线程并行编码以加快速度。质量损失可以忽略不计,除非使用非常多的线程(超过16个)。速度增长和线程的数量近似于线性,直至在视频垂直方向每40px 多于1个线程为止,超过临界点后再增加线程获得的速度增长将大幅下降。
 当前在 x264 内部对线程数量限制为128,实际上你也不会设置这么高。
 建议: Default
 参照: thread-input, sliced-threads
subme
默认:7
说明:设置亚像素估计的复杂度。值越高越好。级别1-5简单控制亚像素的细化力度。级别6给模式决策开启RDO(码率失真优化模式),级别8给运动矢量和帧内预测模式开启RDO。开启RDO会显著增加耗时。
使用小于2的值会开启一个快速的、低质量的预测模式,效果如同设置了一个很小的 –scenecut值。不推荐这样设置。
可使用的值如下:
0 —— fullpel only
1 —— QPel SAD 1 iteration
2 —— QPel SATD 2 iterations
3 —— HPel on MB then QPel
4 —— Always QPel
5 —— Multi QPel + bi-directional motion estimation
6 —— RD on I/P frames
7 —— RD on all frames
8 —— RD refinement on I/P frames
9 —— RD refinement on all frames
10 —— QP-RD (requires –trellis=2, –aq-mode > 0)
建议:保持默认,或设置为更高,除非对速度十分敏感。
no-8x8dct
默认:无
说明:自适应的8×8 DCT会在I帧中开启更智能的自适应8×8的时域变换。开启此选项可以禁用这个特性。(译者按:此选项是将H.264的Profile从High降为Main的重要参数)
建议:保持默认
nr
默认:无
说明:执行快速去噪。以此值为阈值确定噪音,通过在量化前丢失小细节的方式尝试去除噪音。效果可能不如优秀的外部去造滤镜,但它执行地非常快。
建议:保持默认或者设置为100-1000用以去噪。

问题:

没有生成x264.lib

解决方法如下:

        X264更新的比较快,每天都有更新,但算法模块,基本结构是没有多大变化的。x264都是用C语言写的包括C99,但C99语法是在VC中是没法用的(当然有精力可以全部改成C89),生成的.a库是也是没法调用的,如何转化成可用.lib库就比较重要了。

下载工具poxports,版本号0.43(下载地址为:http://download.csdn.net/detail/evsqiezi/7014011)。解压后,得到pexports-0.43\bin\pexports.exe。将pexports.exe复制到C:\Program Files\Microsoft Visual Studio 5\VC\bin目录下(我这里安装的是VS2005,其他找对应版本的bin路径)。打开VS2005命令行工具。输入pexports,发现可用了。命令行进入libx264-142.dll所在的目录。使用如下目录。
pexports libx264-142.dll > libx264-142.def
lib /machine:ix86 /def:libx264-142.def
第一行命令,生成libx264-142.def
第二行命令,生成libx264-142.exp 和 libx264-142.lib
建立一个工程,将头文件,库文件加载到工程,测试代码如下:
#include
#include
#include "stdint.h"  //如果没有,下载地址为:http://download.csdn.net/detail/evsqiezi/7014021
extern "C"
{
#include "x264.h"
#include "x264_config.h"
};
using namespace std;
int main()
{
x264_param_t param;
x264_param_default(¶m);
return 0;
}
编译通过,说明可用。

 

 openh264与x264比较
openh264 是思科实现的开源 H.264 编码,虽然 H.264 需要交纳不菲的专利费用,但是专利费有一个年度上限,思科把 OpenH264 实现的年度专利费交满后, OpenH264 事实上就可以免费自由的使用了。
x264 x264 是一个采用 GPL 授权的视频编码自由软件。 x264 的主要功能在于进行 H.264/MPEG-4 AVC 的视频编码,而不是作为解码器( decoder )之用。
除去费用问题比较来看:
    openh264 CPU 的占用相对 x264 低很多
    openh264 只支持 baseline profile , x264 支持更多 profile

 

你可能感兴趣的:(H264库)