1. 程式人生 > >基於RTP和Android的視訊傳輸的研究實現方法

基於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