X264最大的特点在于其出发点是为了H.264的实用性。与JM相比,X264并没有完整的对H.264标准给与实现,而是舍去了一些对编码性能贡献很小但计算复杂度极高的新特性,如多参考帧、帧间预测中不必要的块模式等技术。从而计算复杂度降低,编码效率却并没有明显降低。码流兼容H.264。在实用
的系统中,比如比较普遍的在DSP芯片上实现H.264,大多是移植X264代码。
- 在Windows系统下实现X264
工具:Microsoft Visual Studio2005
而不要使用visualstdio 6.0,如果使用6.0要打很多的补丁,并且可能还会出现很多其它问题。
程序:x264_i386版
实现步骤:
(1)首先就是nasm不能编译的问题,解决如下:
下载nasm
http://www.nasm.us/pub/nasm/releasebuilds/2.09.08/win32/nasm-2.09.08-win32.zi
解压,并且将nasm拷入D:ProgramFilesMicrosoft Visual Studio 8VCin下。
(2)中间还pthread.h的报错,参考我另一篇
运行x264中用到的pthread.h文件及相关问题
(3)编译程序,生成X264.exe文件。
输出文件在bin目录下现 bin/x264.exe
(4)在cmd中运行,转到此目录下运行
x264 --no-cabac -o e:4cif est.264 e:4cifforeman.4cf704x576
x264 --no-cabac -o . est.264 e:4cifforeman.4cf 704x576
x264 --no-cabac -o D: est.264D:x264-060601uildwin32inforeman.yuv 176x144
其中目录下要有源文件foreman_dec.4cf然后运行之后在目录下就会生成test.264压缩文件。
(5)要在vs上面运行的话
项目->属性 点击: 配置属性->调试
在命令参数一栏输入:--no-cabac -o e:4cif est.264e:4cifforeman.4cf 704x576
x264 --no-cabac -o D: est.264D:x264-060601uildwin32inforeman.yuv 176x144
确定后 按F5开始执行
2.在Linux系统下实现X264
准备:Linux系统、x264-snapshot 20070920-2245版程序
(1) PC机上装nasm 解决开始运行的问题
make时提示 Found no assembler
Minimum version is yasm-0.6.2
If you really want to compile without asm, configure with--disable-asm.
少了linux下的汇编器,安装个yasm就OK啦,下载地址:
我下载的是:
http://www.tortall.net/projects/yasm/wiki/Download yasm-1.1.0.tar.gz
美国官网:
http://www.nasm.us/ nasm-0.98.39.tar.bz2
解压,进入解压包
./configure
make
make install
(2)
然后在Linux系统下
#./configure
#make 之后便生成Linux系统下的X264可执行文件,文件名为:x264
(3)运行
./x264 mo-da_qcif.yuv176x144 -o test.264
./x264 foreman.4cf 704x576 -otest.264
3.在开发板上实现X264
准备:编译环境:Linux系统
工具:arm-linux-gcc 3.4.1
程序:x264-snapshot 20070920-2245版
实现步骤:
(1)安装编译环境Linux系统,我是在Windows上安装的虚拟机,然后在虚拟机之上安装的Linux系统。(在虚拟机下的Linux系统中注意,使用Linux与Windows的共享文件夹时,若要对解压文件进行解压,要将解压的文件拷贝到虚拟机linux系统下,而不要在共享文件夹中进行解压,否则解压不成功。
(2)安装交叉编译器arm-linux-gcc 3.4.1,其安装过程:将arm-linux-gcc3.4.1.tar.bz2拷贝到Linux系统下,如我拷到了/WeiLi目录下。—>解压,tar–jxvf arm-linux-gcc3.4.1.tar.bz2。—>将解压文件中的arm文件夹拷贝到/usr/local下,cp –rvarm/usr/local。—>修改环境变量,即将arm-linux-gcc编译器指定为3.4.1,gedit/root/.bashrc,在/root/.bashrc这个文件的最后一行添加上命令:
export PATH=$PATH:/usr/local/arm/3.4.1/bin。arm-linux-gcc3.4.1便安装完毕,就可以使用此交叉编译器了。
注意:对于我们的开发板,配套使用的编译器是armv4l-unknown-linux-gcc,经我通过简单的hello.c程序测试,用arm-linux-gcc编译出的可执行程序在实验台上也能正确运行,所以arm-linux-gcc和armv4l-unknown-linux-gcc在一定程度上可以通用,可能只是版本问题。
(3)修改X264程序,首先对程序进行一些地方的修改,否则会出现关于cpu_set_t的错误,关于cpu_set_t的以下那段代码是关于计算CPU内核数的代码,所以将np=1(我们所使用的计算机都是单核)直接返回,而没有用它的计算,#elif defined(SYS_LINUX) unsigned int bit; int np; cpu_set_t p_aff;memset( &p_aff, 0, sizeof(p_aff));sched_getaffinity(
0, sizeof(p_aff), &p_aff);for( np = 0;bit = 0; bit < sizeof(p_aff); bit++);np += (((uint8_t *)&p_aff)[bit / 8]>> (bit % 8)) &1;return np;改成了:#elif defined(SYS_LINUX) int np;np=1; returnnp;
(4)编译程序,将x264-snapshot20070920-2245拷贝到Linux系统下,(在虚拟机的共享文件夹下也可以)。./configure--host=arm-linux。—>修改config.mak文件,将其中的CC=gcc,AS=yasm修改成CC=arm-linux-gcc,AS=arm-linux-as。—>make。之后便生成了可执行文件X264。
注意:此处的X264程序一定要是未被其它编译器编译过的程序,即如果此X264是被gcc或者其它编译器编译过后的程序,再使用arm-linux-gcc3.4.1编译,会出现collect2错误。
(5)将生成的可执行文件x264移植到开发板上,运行x264 --qp 18--keyint 240 --min-keyint 24 --ref 3 --mixed-refs --no-fast-pskip--bframes 3 --b-pyramid --b-rdo --bime --weightb --trellis 1--analyse all --8x8dct --threads 3 --thread-input --progress--no-dct-decimate
–o out.264 foreman_part_qcif_444.yuv352x288,其中目录下要有源文件foreman_part_qcif_444.yuv然后运行之后在目录下就会生成out.264压缩文件。
参考:
http://blog.vckbase.com/wangjun/archive/2010/08/02/43939.html