基于RTP和Android的视频传输的研究实现方法

1.安徽大学计算机科学与技术学院,安徽合肥230039;2.安徽大学计算智能与信号处理教育部重点实验室,安徽合肥230039;3.安徽大学软件学院,安徽合肥230039) 
中国论文网 http://www.xzbu.com/8/view-2388338.htm
  摘要:该论文以Android移动设备视频通信的实现为背景,详细介绍了如何为Android系统搭建开发环境,以及Android程序开发的一般方法,并在此基础上实现了Wifi网络的视频实时传输,为Android系统平台的视频实时传输提供了一种实现方式,为后续的研究和开发工作提供参考。 
  关键词:Android;RTP;视频;实时传输;移动设备开发 
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)04-0903-03 
  Research and Achieve of Video Transmission Based on RTP and Android 
  SUN Song-yuan1,2,WU Jian-guo2,3 
  (1. School of Computer Science and Technology, Anhui University, Hefei 230039, China;2. Key Laboratory of Intelligent Computing & Signal Processing of Ministry of Education, Anhui University, Hefei 230039, China;3. School of Software Engineering, Anhui University, Hefei 230039, China) 
  Abstract:This paper is to demonstrate making use of Android platform to develop a video communication software. Also, the way how to build the environment for Android development and how to develop software on Android is introduced in this paper. Further more, it also demonstrates how to develop the real-time video transmission software implementing on Android which supply a reference for the fol? low-up research and development. 
  Key words: android; RTP; video; realtime transmission; portable device’s software development 
  Android是Google公司2007年发布的一个手机操作系统。Android采用了开源的Linux操作系统,底层使用了访问硬件速度最快的C语言,应用层采用了简单而强大的Java语言[1]。Android实现了全部开源,这使得硬件厂商以及软件开发人员可以分别根据自身的需求进行功能上的扩展和裁剪以及应用层软件的不断更新开发。 
  目前,随着视频采集和无线实时传输技术的不断成熟和完善,视频通信在普通PC上的开发已不是难题了,但是手机平台的视频通话对系统多方面性能的要求较高,移动手持设备硬件环境的限制导致了系统的开发远不及在PC上的开发方便;并且硬件环境和操作系统的差异也使得PC上开发的程序无法直接移植到便携设备上。因此,本文针对这一问题,使用Android手机作为系统前端开发硬件,详细介绍了在该移动手持设备上进行程序开发的方法,实现视频通信。 
   1 Android及其开发环境 
  1.1 Android简介 
  Android是Google公司推出的手机操作系统。Android构建了一种新型的移动电话开发模式,一种全开放的移动电话开发模式。Android移动电话不但可以支持第三方应用,而且移动电话本身也是开放的。目前,国内对Android手机平台的视频开发尚处起始阶段,开发成果很少,本文在Android系统上进行视频实时传输的研究开发尚属先例。 
  1.2交叉编译环境的搭建 
  Android手机操作系统依赖Linux2.6内核,Linux内核同时也作为硬件和软件之间的硬件抽象层。 
  本文选用Eclipse和Android SDK搭建该开发环境。首先,下载Eclipse 3.7以上版本、android sdk,要求已安装JDK。其次,在Eclipse中安装ADT插件。第三,安装SDK,更新SDK。第四,使用android sdk的SDKManager创建AVD。做好以上工作,即可在Eclipse中创建Android项目工程。 
   1.3 Android NDK开发 
  Android NDK是配合Android SDK的工具,用来编译应用的原生代码。它只能与Android SDK配合使用。NDK允许开发者使用原生代码(C或C++)实现应用的一部分,它只是Android SDK的一个补充[2]。NDK提供的资源有: 
  1)将C和C++源代码生成原生代码库的工具和文件; 
  2)将原生库嵌入apk文件的方法; 
  3)兼容1.5版本以上的原生系统头文件和库 
  4)文档,示例和指引。 
  Android NDK支持ARMv5TE及其指令集,提供稳定的C库头文件,JNI接口和其他的库。由于Android是基于Linux的操作系统,处理器是ARM的,所以在windows下需要一个交叉编译器编译原生代码。本文选择Cygwin编译一个交叉编译环境。 
  安装好Cygwin后,运行Cygwin,修改/home/username下的.bash_profile文件,在文件尾部添加NDK路径,重启Cygwin进入NDK目录下的build文件下,运行”/host-setup.sh”命令即可完成交叉编译环境搭建。 
  Android NDK开发是使用JNI调用本地的方法或者库来将Java程序和Native程序结合起来。Android NDK开发一般步骤如下3: 
  1)JNI接口设计; 
  2)使用C\C++实现本地方法; 
  3)生成动态链接库; 
  4)将动态链接库复制到Java工程,运行Java程序。 
  Android中使用SO文件形式来存放本地库文件。要将C代码编译成.so文件需要使用Android.mk编译脚本,它主要用来指定要编译的so文件所包含的内容。SO文件中包含的都是模块,每个模块既可以是静态库也可以是动态链接库,只有动态链接库被安装进应用程序包后,静态库才能被动态链接库使用。Android.mk编译脚本放在C工程目录,主要的一些参数说明如下: 
  LOCAL_PATH:=$(call my-dir) 
  LOCAL_PATH表示此时位于工程目录的根目录中,(call my-dir)的功能由编译器提供,被用来返回当前目录地址。 
  Include $(CLEAR_VARS) 
  CLEAR_VARS变量由编译系统提供,该功能会清理掉除LOCAL_PATH外所有以LOCAL_开头的内容。 
  LOCAL_MODULE变量用于指定模块名。 
  LOCAL_SRC_FILES变量用于指定被编译并聚合到同一模块中的C\C++源文件。 
  编写好Android.mk脚本后,启动Cygwin,进入NDK根目录使用make命令即可编译C\C++代码生成SO文件。将编译生成的.so文件拷贝至Java工程目录即可被Java工程调用。 
  2 Android上视频无线实时传输的实现 
   2.1系统设计 
  本程序利用Android手机自带的摄像头作为视频采集设备,对获得视频数据进行编码,然后采用RTP协议在无线网络中传输至对方Android手机。由于网络方面以及Android自身的系统原因,实时视频传输时采用TCP协议在后台运行。工作流程如下: 
   
  图1数据流程图 
  2.2实时视频传输的实现方法 
  实时视频的传输首先需要获取摄像头设备资源。Android中提供了丰富的设备资源供开发者使用,这些设备资源的调用是通过Android提供的函数接口实现,由于Android系统的开源特性,开发者也可以自己编写设备驱动程序和其他固件程序实现特定的功能需求。 
  获取到摄像头设备资源,接下来就是从摄像头获取每一帧数据。Android系统提供了实现此项功能的函数onPreviewFrame。但是在Android2.2版本以前的Android系统对获取的每一帧数据的编码解码均需要开发者自己编写代码实现,Android2.2版本以后的Android系统提供了常用的视频格式(3GP、MP4、H263和H264)的编码解码的实现。 
  Android提供了常见媒体的编码、解码机制,可以非常容易的集成音视频和图片等多媒体文件到应用程序中。Android对常用媒体格式提供了支持,支持的图片格式有JPEG、GIF、PNG和BMP,支持的音频格式有3GP、MP3和WAV,支持的视频格式有3GP、MP4、H263和H264。Android2.2之前的版本是开发者自己对摄像头获取的数据编写编码程序,系统没有自带的编码程序,而Android2.2 则是对从摄像头获取的数据采用YUV编码[3]。 
  H264编码具有良好的压缩性能,在视屏质量、压缩效率和数据包回复丢失方面都有很好的性能,能以较低的数据速率传送,更适合窄带传输。但是H264格式的视频Android目前的版本只支持解码,不支持该格式的编码[4]。为了采用H264编码方式传输数据需要使用Java的jni技术[5],通过使用C/C++编写H264编码函数。为了在Android中使用C/C++的代码,必须使用Android NDK对C/ C++源码进行编译[6]生成库文件供Android调用实现对数据进行H264格式的编码。 
  获取到一帧数据并实现编码即可进行传输。本文使用的是TCP套接字传输每一帧数据,Android手机接收端监听连接端口接收Android手机发送端发送来的数据,对接收到的数据使用Android系统提供的解码程序进行解码播放即可。 
  以上介绍的只是单向的传输,双向传输只要在视频通信的两端都实现上述传输即可。考虑到Android系统的特性――应用程序主线程长时间运行网络连接传输数据可能会造成应用程序报错或不响应,实时视频传输的功能使用线程在系统后台进行传输实现。2.3视频传输的主要代码分析 
  实现视频数据采集功能的主要代码如下: 
  mCamera = Camera.open(); //获取设备的Camera 
  Camera.Parameters p = mCamera.getParameters();//获取摄像头参数 
  p.setPreviewSize(352, 288); //设置预览窗口大小 
  mCamera.setPreviewCallback(new H264Encoder(352, 288));//装载回调函数引用从摄像头取来的每一帧数据mCamera.setParameters(p); //设置摄像头服务//调用onPreviewFrame接口获取摄像头的每一帧数据public void onPreviewFrame(byte[] data, Camera camera) { 
  int result=CompressBuffer(encoder,-1,data,data.length,h264Buff); //CompressBuffer函数将获得的数据压缩成H264格式 
  if (result>0) 
  raf.write(h264Buff, 0, result);//raf为RandAccessFile的实例,此处将获取的编码后数据写入到SDCard中 
  } 
  //CompressBuffer为JNI调用,其中的主要代码如下 
  jint Java_h264_com_H264Encoder_CompressBuffer(JNIEnv* env, jobject thiz,jlong handle,jint type,jbyteArray in, jint insize,jbyteAr? 
  ray out)//JNI中函数CompressBuffer的定义 
  en->picture->i_type = X264_TYPE_AUTO; //编码memcpy(pTmpOut, en->nal[i].p_payload, en->nal[i].i_payload);//将编码后的数据拷贝输出 
  接收端监听Socket连接的端口接收数据并使用Android自带的H264解码程序软件解码。 
  3.3 RTP协议及使用 
  RTP(Real-time Transport Protocol)针对多媒体数据流的一种传输协议。工作于一对一或一对多的传输情况,它可以建立在底层的面向连接和非连接的传输协议上,一般使用UDP协议进行传输。一个RTP会话包括传给某个指定目的地对(一个网络地址和一对RTP/RTCP端口构成)的所有通信量,可能包括多个发送方;而从同一个同步源发出的RTP分组序列称为流,一个RTP会话可能包含多个RTP流。RTP数据包由12个字节的固定包头和不定长的负载组成,RTP数据包格式如下图2。 
   
  图2MPEG-4视频流的RTP数据包的格式 
  与RTP密切相关的是RTCP,当应用程序开始一个RTP会话时,会使用两个端口,一个给RTP,一个给RTCP,两者是密不可分且配合使用的。RTCP可以为传送RTP数据的QoS提供反馈,如丢包率、延时抖动等,以此来判断网络的状况。 
  3结束语 
  基于RTP协议的视频通信开发在Android平台上已经愈来愈受到业界的重视,本文是对Android2.3版本之前的Android系统实现视频通话的一个解决方案实现。解决了Android2.3版本以前的Android系统使用H264编码的视频录制的问题。可以通过Wifi网络,使用Socket进行点对点的视频通信。然而对于Android与其他视频服务器的配合使用以及多人视频通信现在还在研究中,也是下一步工作的主要内容。难点是视频服务器端的开发、Android客户端与视频服务器端的连接通信以及多人视频通信的多线程的并发控制。 
  参考文献: 
  [1]郭宏志.Android应用开发详解[M].北京:电子工业出版社, 2010,6. 
  [2]韩超,梁泉.Android系统原理及开发要点详解[M].北京:电子工业出版社,2010,1. 
  [3]杨丰盛.Android应用开发揭密[M].北京:机械工业出版社, 2010,1. 
  [4] Shawn Van Every. Pro Android Media[M]. Apress,2010,10. 
  [5] James Steele, Nelson To. The Android Developers’Cookbook[M]. Addison-Wesley,2010,10. 
  [6] Satya Komatineni, Dave MacLean, Sayed Y. Hashimi . Pro Android 3[M].Apress,2010,12,15. 
  [7]卢曦,刘德明,朱积砚.RTP协议在嵌入式网络处理器中的实际与实现[J].计算机与数字工程,2006,34(11):16-29.[8] Schulzrinne H,,Casner S,Frederick R,et al.RFC 3550 RTP: A transport protocol for real-time applications[S].2003. 
  [9]宋冉昕,谢维波,基于Android平台的实时自适应音频传输技术及其实现[J].电脑知识与技术,2011(4).

转载请注明来源。原文地址: http://www.xzbu.com/8/view-2388338.htm

你可能感兴趣的:(Java,Android)