王骏的博客
编程、网络技术点滴...

公告

逐渐将VC知识库的博客迁移到这里!

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

程序员博客   首页  新随笔  订阅  管理  登录 
 
王骏的博客 阅读(3641) 评论(4)
原文:http://hi.baidu.com/weili8607/blog/item/31ffd6179c2c764220a4e979.html/cmtid/30181200bdfc6dda277fb5ee

去年9月份接手了关于无线视频传输的项目,我主要负责H.264部分。由于H.264采用了分层设计、多模式运动估计、改进的帧内预测等技术,显著提高了预测精度,从而获得比其他标准好得多的压缩性能。然而H.264获得优越性能的代价是大幅度增加计算复杂度。而对于我们使用的ARM9,处理能力有限,所以选用X264来进行视频的处理压缩

    网上自由组织联合开发的兼容264标准码流的编码器,创始人是一个法国人。X264最大的特点在于其出发点是为了H.264的实用性。与JM相比,X264并没有完整的对H.264标准给与实现,而是舍去了一些对编码性能贡献很小但计算复杂度极高的新特性,如多参考帧、帧间预测中不必要的块模式等技术。从而计算复杂度降低,编码效率却并没有明显降低。码流兼容H.264。在实用的系统中,比如比较普遍的在DSP芯片上实现H.264,大多是移植X264代码。

    到09年12月份,我所进行的X264工作,已经实现了在开发板、Linux系统、Windows系统下的工作,即在这三个环境下都可以进行对yuv格式的视频压缩,输出.264的压缩视频文件。将x264对应环境的可执行文件移植到相应的环境中,根据相应的参数运行即可。具体实现步骤如下。(另外,x264不止支持yuv的视频输入和.264的输出,同时还可以支持RAW/y4m/avi/avs的输入和mkv/mp4的输出,具体看其参数解释)

ps:中间经过一个寒假也没什么其它进展,目前正忙着整个系统的统一和各个部分代码的联调,x264中详细的算法部分也没时间详细研究。

1.在开发板上实现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-gcc 3.4.1.tar.bz2拷贝到Linux系统下,如我拷到了/WeiLi目录下。—>解压,tar –jxvf arm-linux-gcc 3.4.1.tar.bz2。—>将解压文件中的arm文件夹拷贝到/usr/local下,cp –rv arm /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-gcc 3.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; return np;


(4)编译程序,将x264-snapshot 20070920-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-gcc 3.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.yuv 352x288,其中目录下要有源文件foreman_part_qcif_444.yuv然后运行之后在目录下就会生成out.264压缩文件。

2.在Linux系统下实现X264

       准备:Linux系统、x264-snapshot 20070920-2245版程序

对于Linux系统下实现X264要比在开发板上实现简单,所需要修改的程序与在开发板上实现X264实现步骤中的第三步一样,然后在Linux系统下./configure—>make之后便生成Linux系统下的X264可执行文件。因为CC=gcc默认为gcc编译器,即是针对PC机的。而gcc编译工具在装Linux系统时可以选上。(也需要在PC机上装nasm,下个rpm包安装一下就行)

3.在Windows系统下实现X264

      准备:编译环境:Windows系统

      工具:Microsoft Visual Studio 2003

                建议使用2003,而不要使用visual stdio 6.0,如果使用6.0要打很多的补丁,并且可能还会出现很多其它问题。

      程序:x264-snapshot 20070920-2245版

实现步骤:

(1)安装Windows操作系统和Microsoft Visual Studio 2003编译器。并且将nasm拷入C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin下。
(2)修改程序。在使用_strtok_r的函数前加入

#ifndef strtok_r

#define strtok_r(str,delim,save) strtok(str,delim)

#endif

(3)编译程序,生成X264.exe文件。在cmd中运行,运行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.yuv 352x288,其中目录下要有源文件foreman_part_qcif_444.yuv然后运行之后在目录下就会生成out.264压缩文件。

需要此x264程序,中间用到的补丁、安装程序如nasm,又或一些其它资料的,可留下email索取。

附:H.264算法简介

20033月,ITU-T/ISO正式公布了H.264视频压缩标准。与H.263MPEG-4相比,在同样质量下,其数码率能降低一半左右,即在同样码率下,其信噪比明显提高。这样一来,H.264标准在国际上受到了广泛地重视和欢迎,被人们称为新一代视频编码标准。

H.264提供比H.263MPEG-4更高的压缩性能,使图像的数据量减少50%,有利于用有限的空间存储更多的图像数据;更好地支持网络传输,引入面向对象数据包的编码有利于将数据打包在网络中传输,支持流媒体服务应用;具有强的抗误码特性,以适应在噪声干扰大、丢包率高的无线信道中传输;对不同应用的时延要求具有灵活的适应性;编码和解码的复杂度具有可扩展性,支持编码和解码复杂度的不等分配和扩展。H.264的这种优异的压缩性能和良好的网络亲和性,很好地迎合了我们所需要的实时视频通信。所以H.264广泛的应用于视频监控、会议电视、可视电话、远程医疗、远程教学、视频点播、数字电视广播、数字视频存储等等各领域。

H. 264 之所以具有如此高的压缩性能和良好的网络亲和性,主要是因为采用了下面的改进技术:1)自适应8 × 8 4 × 4 整数变换。2)多种模式的空间域帧内预测。3)高效的帧间预测。包括多模式运动估计、高精度的运动估计、多参考帧预测、加权预测。4)高效的熵编码。5)自适应去方块滤波。6)其他一些改进。如采用SPSI帧自适应码率调整;按功能进行分层;采用块间滤波器提高性能;通过FMO技术提高了错误恢复能力。


评论列表
刘阳
re: X264的调试与移植(转)
我最近接手了一项在windows平台上封装编码器的工作,使用的是FFMpeg,可惜在压缩H264格式视频时有内存泄露,准备把这一块用 x264 来实现,对x264程序,中间用到的补丁、安装程序比如nasm,及其它资料很感兴趣,我的e-mail: XianLiuYang@hotmail.com
谢谢你!!
KIT
re: X264的调试与移植(转)
我最近也接手了关于无线视频传输的项目,用的平台是S3C2440,我也用了楼主的方法,但当我在开发板上执行x264时,用了三分钟才压缩三秒的YUV格式档,因此不能进行近实时的播放,不知道那麽出错,可以把相关资料发一份给我参考学习一下吗?
alexkit818@yahoo.com.hk
谢谢
allen
re: X264的调试与移植(转)
你好,我是在Windows系统下实现X264
libx264可以编译成功,编译x264项目报link错误:
libx264.lib(encoder.obj) : error LNK2019: 无法解析的外部符号 _x264_stack_align ,该符号在函数 _x264_slices_write 中被引用
libx264.lib(cpu.obj) : error LNK2019: 无法解析的外部符号 _x264_cpu_cpuid ,该符号在函数 _x264_cpu_detect 中被引用
bin/x264.exe : fatal error LNK1120: 125 个无法解析的外部命令
请指教。我的mail:allen0508@sina.com
Chu
Wham bam thank you, ma'am, my qusoniets are answered!

发表评论
切换编辑模式