Android平台上H.264视频前端模块的研究

2012-09-04 02:04许建东
关键词:分片编码传输

许建东,彭 宏

(浙江省通信网应用技术研究重点实验室,浙江杭州310023)

0 引言

随着3G网络的不断普及,人们已经不再仅仅满足2G网络中的声音,图像等多媒体体验,大量的视频应用应运而生。如Android平台上常见的视频应用有:视频通话;视频上传分享;视频点播观看;视频监控等各种丰富生活的应用[1]。然而,尽管3G网络在上下行速度上相较于2G网络提升了许多,但未经压缩过的视频数据所需带宽比3G网络能够提供的带宽还是大很多。因此将原始的视频数据直接进行传输是不现实的。为了使现有的网络带宽支持视频传输,视频数据在传输前一般都要进行压缩编码处理。本文中所采用的H.264编码所具有的高效压缩比,高图像质量,良好网络适应性等优点将为视频应用带来更好的用户体验。本文介绍的H.264编码的视频前端模块,可以很方便地嵌入到各种视频应用中。

1 模块分析

H.264视频前端模块完成的功能描述如下:

(1)采集手机终端摄像头所获取的视频数据。通过android.hardware.Camera类来控制摄像头设备,摄像头采集视频时的参数可以通过Camera对象的getParameters()函数来得到一个android.hardware.Camera.Parameters对象设置;

(2)将视频数据送入编码库进行编码。编码库提供的编码参数包括:视频宽度,视频高度,帧率。本文的开发环境虽然为Android平台,但是考虑到视频编解码的效率问题,因此编码具体是由C语言实现的,通过搭建NDK环境,可以很方便地在Android平台上实现C语言代码的利用;

(3)最终将得到的编码结果分片,以便在网络中传输。最终得到的H.264视频编码信息即NAL(网络抽象层),往往是比3G网络的MTU(网络传输最大包大小)大很多的,因此,发送视频数据之前,应该进行数据分片操作,将每个发送的包控制在MTU大小之下。

模块的整个示意图如图1所示。

图1 模块示意图

整个模块最终得到的结果是可以直接作为负载传输的数据。但是考虑到视频数据流大,数据传输质量难以保证,因此视频数据往往不会以裸数据的形式进行传输,比较常见的方法是利用RTP(实时传输协议)来进行封装之后再进行传输。经过分片之后的数据即可直接作为RTP负载,进行实时视频流传输。

2 NDK配置

本地开发包(Native Development Kit,DNK)提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,使开发者能够最大程度的源码再利用[2]。在开发有关音视频编解码的应用中,使用C/C++的编解码代码,往往比使用Java来进行编解码能够带来更好的性能。使用要求:(1)一套交叉编译工具(编译器,连接器等),可以产生本地的ARM二进制文件在Linux,OS X和Windows操作系统运用,推荐使用Cygwin;(2)一套系统头符合于Android平台支持的稳定本地API列表。Android SDK版本需要在1.5以上。

使用NDK生成一个可以在Android平台上调用的动态库.SO如下步骤:(1)下载Windows版本NDK,解压即可。下载安装Cygwin,可以通过gcc-v与make-v分别查看gcc与makeflie编译工具是否安装正常;(2)配置Cygwin。找到Cygwin的安装目录下的home文件夹,将home文件夹中的.bash_profile文件用文本编辑器打开,添加上ANDROID_NDK_ROOT=/cygdrive/NDK目录export ANDROID_NDK_ROOT。其中NDK目录根据自己解压的NDK目录设置;(3)在NDK中新建一个项目并且写好这个项目的makefile文件,使用Cygwin进入这个项目目录,执行ndk-build即可生成动态库.SO文件。

3 采集压缩分片

由模块分析可知,整个模块主要分为3个功能模块:采集模块;压缩模块;分片模块。3个模块完成各自不同的功能,同时最大限度的保证整个模块的实用性。

3.1 采集压缩模块

这部分完成Android终端视频数据的获取以及压缩工作。视频数据的获取工作可以根据Google提供的Android API来完成。为保证模块的实用性,压缩过程中需要保证参数集的确定。

参数集是H.264标准引入的一个新概念。H.264取消了序列层和图像层,而将原本包含于上述两层的信息游离出来并放入参数集中。序列和图像头信息是非常关键的信息,它们对后续的解码工作至关重要[4]。参数集序列分为序列参数集和图像参数集。序列参数集包括一个视频序列的所有信息,如帧数、参考帧数目、解码图像尺寸等;图像参数集包括一个图像的所有分片的相关信息,如片组数目、熵编码模式选择标识、初始量化参数、去方块滤波系数调整标识等[4]。因此,在编码端控制好参数集可以为后续的解码工作提供反馈调节。解码端可以通过发送参数集数据来调整编码端的编码质量。

3.2 分片模块

最大传输包(Maximum Transmission Unit,MTU)。即网络上传送的最大数据包,单位为字节。

大部分网络设备的MTU都是1 500。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。因此,设置合理的MTU值对于实时系统,如实时监控系统,实时通话系统,将会有很大的影响。考虑到H.264在Android上的应用大多是会有传输过程,本文为了提高实用性,加上了传输前必须做的分片处理。根据实际统计,一个完整的NAL通常在4-7k字节左右,而以太网等网络的MTU为1 500字节。因此无法一次发送整个NAL数据。根据多次实践,本文系统将MTU的值确定在1 000到1 100之间时,系统的丢包率比较理想。

3.3 测试结果

本文采用的测试环境为Android系统2.3的HTC wildfire机型,cpu为600Mhz。压缩分辨率为qcif(177×144),压缩帧率可以在10-12帧之间。测试画面如图2所示,右下角小图为压缩之后的视频。

4 结束语

本文提出的H.264前端采集压缩分片模块高度集成了H.264视频流应用的前端工作,可以非常方便,快速地嵌入到所开发的整套系统中。并且为了提高实用性,在实现过程中保留了参数集选项,同时考虑了实际发送过程中的分包处理,具有很大的实际意义。

图2 测试压缩图

[1]杨鑫,牛建伟,胡建平.一种基于H.264的智能手机监控系统的设计与实现[J].微电子学与计算机,2006,23(9):118-119.

[2]吕雪.基于网络的视频监控系统研究[J].国外建材科技,2006,27(2):64-65.

[3]公磊,周聪.基于Android的移动终端应用程序的开发与研究[J].计算机与现代化,2008,12(8)86-89.

[4]杨伟伟.基于H.264的移动视频监控系统的设计与实现[D].杭州:浙江工业大学,2011:28-29.

[5]杨志文.Google Android程序设计指南[M].北京:电子工业出版社,2009:4-6.

猜你喜欢
分片编码传输
上下分片與詞的時空佈局
基于SAR-SIFT和快速稀疏编码的合成孔径雷达图像配准
混合型随机微分方程的传输不等式
牵引8K超高清传输时代 FIBBR Pure38K
分片光滑边值问题的再生核方法
CDN存量MP4视频播放优化方法
《全元诗》未编码疑难字考辨十五则
子带编码在图像压缩编码中的应用
基于模糊二分查找的帧分片算法设计与实现
Genome and healthcare