Android多核平台下X264多线程编码的优化与应用

龙源期刊网 http://www.qikan.com.cn

Android多核平台下X264多线程编码的优化与应用

作者:田志伟 张祥新

来源:《电子技术与软件工程》2015年第02期

本文分析的是在arm芯片的android平台下,一种通用的H264视频压缩算法应用。该算法的特点是,多核arm芯片,android平台优化。而H264本来就是比较先进的视频编码算法,具有速度快,压缩倍数大的特点,具有很好的通用性。充分利用Cortex-A9芯片的neon功能提高指令集的优化。

【关键词】android arm X264 Cortex-A9 neon 多核

X264是一个开源的视频算法,算法的时间复杂度和空间复杂度都相对小,开发团队都是资深的视频编码人士,有深刻的视频编码背景。稳定性好,有专业的人在持续的维护和改进该算法,更新网上的开发包。而且经过这么多年的应用和bug修复,得到应用上的实践验证。是一个比较成熟的视频编码算法。移动设备在市场上的火热表现和越来越多的商业应用。而绝大多数设备都是android系统,其内在芯片多数基于arm的,尤其是多核,已近成为大家熟知的一个概念。

本文通过在4核的arm芯片上实现X264的应用和优化,尝试提高多核在实际应用中的效率提高,同时通过arm芯片编译优化,提高X264开源库的效率。进一步提高X264在android移动设备上效率。

1 X264,NEON-ARM,arm多核并发初步介绍 1.1 X264简介

先介绍H264,H.264是ITU(International Telecommunication Unite国际通信联盟)和MPEG(Motion Picture Experts Group运动图像专家组)联合制定的视频编码标准。这个标准的目标是:一是基于高的视频分辨率和高压缩比,改善图象质量;二是能够覆盖所有的低带宽和高带宽的应用,具有很好的网络适应性。

在同等的图像质量条件下,H.264的数据压缩比能比当前DVD系统中使用的MPEG-2高2-3倍,比MPEG-4高1.5-2倍。正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。在MPEG-2需要6Mbps的传输速率匹配时,H.264只需1Mbps-2Mbps的传输速率。

H264标准分为三个不同的档次,分别应用于不同的领域。

龙源期刊网 http://www.qikan.com.cn

1.1.1 基本档次

主要用于视频会议,可视电话,远程医疗,远程教育,视频监控等。 1.1.2 主档次

采用了多项提高图像质量和增加压缩比的技术措施,主要用于消费电子产品。 1.1.3 扩展档次

包含了除自适应算术编码之外的所有H264标准所规定的内容,主要用于各种网络视频流传输,如视频点播。

X264是一个基于H264标准的免费开源的视频实现算法软件包。由法国巴黎中心学校的中心研究所于2004年6月发起,并由许多视频编码爱好者共同完成的项目。广泛应用于视频压缩和格式转换领域,支持x86,power PC,ARM和Ultra SPARC平台。当前的一些视频处理组织,如VLC,FFDSHOW,FFMPEG等,已经将X264集成到其开源项目中。 1.2 NEON-ARM简介

是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction,Multiple Data,单指令、多数据)扩展结构。从智能手机和移动计算设备到HDTV,它已被公认为是多媒体应用领域中最为优越的处理器之一。它采用专门设计,简化了软件在不同平台之间的移植,为类似Dolby Mobile的密集型多媒体应用提供了低能耗和灵活的加速功能。

NEON技术与Cortex-A8和Cortex-A9处理器相结合,已经被许多领先企业广泛采用。越来越多的机构正在IP设计中采用NEON技术,或提供为NEON技术优化的软件,构成了NEON生态系统的一部分。这一生态系统由大量的硅片领导厂商构成,如博通公司、Freescale Semiconductor、Matsush_ita、NEC、NVIDIA、松下、PMC-Sierra、三星电子、ST、TI和东芝美国电子元器件公司,这些公司都获得了Cortex处理器授权,其中提供NEON技术作为选择之一。此外,在这些ARM处理器和多媒体编解码器厂商基础上,构建开发和评测电路板的硬件设计合作伙伴正不断为NEON技术优化编解码器。 1.3 arm多核并发

所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

arm多核并发,其实就是为了在同一个时刻,充分利用所有的cpu,而不是单一的cpu。提高cpu的性能。

龙源期刊网 http://www.qikan.com.cn

2 X264在多核arm芯片下的应用

X264在多核arm芯片下的应用主要包括X264在android环境下的编译和实际测试两方面。编译主要包括X264环境的设置,参数的设置和编译脚本的设置。测试主要对比是否启动arm neon编译优化多是否启动多核并发功能。

实际的编译环境是在windows下利用CYGWIN工具和Google的NDK工具提供的编译器,NDK版本是android-ndk-r8d。然后获取X264的源码,关键点在配置编译脚本。由于是实时视频采集和编码,需要考虑cpu占用和带宽实时性这些要素。 2.1 提高CPU指令集优化

设置如何开启neon:在arm处理下,依然可以通过优化配置达到满意的性能。需要在编译脚本中开启neon指令集优化。具体配置如下:指定使用的交叉编译器,链接头文件和库所在。在./configure后面添加-march=arm7-a-mtune=cortex-a9-mfloat-abi=softfp-mfpu=neon-d__arm_arch_7__-d__arm_arch_7a__,此处,针对armv7-a的CPU打开了neon的优化运行指令。去掉--disable-ASM选项。该选项的意思就是禁止neon的指令。添加--enable-static选项,生成静态链接的库供程序开发使。然后make之后,就可以得到经过neon指令优化的libx264.a的静态库了。生成库之后,需要通过NDK工具生成java能够调用的接口。使用libx264.a和它对应的头文件,然后设置好JNI下的配置文件,ndk-build命令即可生成java环境下可以使用的接口了。即可在android应用开发中如使用普通的java类一样使用x264的算法了。 2.2 开启cpu多核功能

从X264的帮助命令行可以看到,添加—threads项可以调整运行的线程数,可以当我完成X264编译,视图对手头的YUV进行编码时,在双核计算机上测试,只能发挥50%的效率,即使使用-threads.n也无济于事,提示没有打开PTHREAD支持。在ndk的开发环境中查找phread.h和对应的链接库,发现android的ndk虽然有phread.h,但是没有libpthread.a集成到libc.a中去了。修改下X264的configure。然后使用自己项目目录下的sched.h替换原有的sched.h。重新编译即可。

2.3 适应视频实际带宽和实时性

X264编码器的参数有很多,可以根据具体的应用要求进行调整。其中比较重要的一些参数设置关系到带宽和实时性的有:

profile,也就是使用baseline还是main,还是high编码,我们的应用类似视频会议一般设置为baseline即可。可以在视频清晰度和带宽之中取得一个平衡。

图像质量控制,该值越大图像越花,越小越清晰,当然,越清晰,带宽越大。可以自行设置。

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4