張陽 吳朝霞
摘要:該文介紹了在基于Android的樓宇可視對講應(yīng)用程序中,保存對講視頻的意義和工作原理。并提出了將FFmpeg解決方案移植到Android系統(tǒng)中來,以完成對視頻信息的編碼和解碼工作。該文主要分析了FFmepg的源代碼和特點,講述了如何將FFmepg中的有用部分移植到Android平臺上,并通過JNI技術(shù)實tKAndroid應(yīng)用層的調(diào)用,最終完成音視頻的編碼和解碼工作。
關(guān)鍵詞:Android;可視對講;FFmpeg;視頻編解碼
1概述
在基于Android的樓宇可視對講應(yīng)用程序中,出于安保需求,室內(nèi)機需要將單元門口機訪客的視頻信息保存并提交到管理中心機。如果保存未進行壓縮過的音視頻原碼,則需要耗費大量的存儲空間,也不利于視頻文件的網(wǎng)絡(luò)傳輸。而Android的類庫并沒有提供符合我們需求的視頻編碼功能,所以必須使用第三方解決方案來完成。而FFmpeg由于其高效、可移植,并且是完全免費的音視頻流處理方案,成為了本文完成音視頻編解碼工作的首選。
2FFmpeg簡介
FFmpeg是一個開源免費跨平臺的視頻和音頻流方案,屬于自由軟件,采用LGPL或GPL許可證(依據(jù)開發(fā)人員選擇的組件)。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec。我們使用音視頻編碼是為了完成視頻通話記錄的音視頻編碼以方便保存。由于Android應(yīng)用開發(fā)沒有現(xiàn)成的音視頻編碼工具,我們只能使用cygwin+cdt+ndk的開發(fā)環(huán)境,編寫自己的音視頻編碼動態(tài)鏈接庫,F(xiàn)Fmpeg為我們提供了高效的音視頻編碼方法。
3視頻播放與實時編碼方案
在室內(nèi)機和單元門口機建立通信連接后,單元門口機通過其攝像頭和麥克風(fēng)捕獲訪客的音視頻信息,視頻信息為連續(xù)的jpeg圖像,音頻信息為PCM音頻原碼。接收到音視頻信息后,室內(nèi)機一邊向用戶播放實時視頻,一邊將其編碼為MP4視頻文件。音頻編碼為aac,音頻位率:128kb/s。視頻編碼為mpeg4,視頻位率為1200kb/s,視頻尺寸為:320*180。通話結(jié)束后,室內(nèi)機將MP4文件上傳到管理中心機保存。其中音視頻編碼功能就是將FFmepg移植到Android平臺下來實現(xiàn)的。通過An—droid底層C/C++驅(qū)動開發(fā)工具,將FFmpeg和自己的C語言代碼編譯成為后綴名為“.so”的動態(tài)鏈接庫文件,添加到Android應(yīng)用程序項目中,供應(yīng)用層Java代碼調(diào)用。實時可視對講與音視頻編碼流程如圖1所示。
4FFmpeg的JNI驅(qū)動開發(fā)
本文采用cygwin+CDT+NDK的開發(fā)環(huán)境進行Android動態(tài)鏈接庫開發(fā)。NDK提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C++)的動態(tài)庫,并能自動將so文件和java應(yīng)用一起打包成apk。要注意的是,因為cygwin是在Windows上模擬Linux的控制臺環(huán)境,所以對于訪問文件的路徑是不能帶有空格和中文的。所以ndk的解壓后存放的路徑必須不能包括空格或中文,比如這種“D:\rogram Files\android-ndk-windows”在cygwin是不能識別成功的。FFmpeg源代碼可以在其官網(wǎng)上免費下載,本文使用的是ffmpeg-0.8.1,F(xiàn)Fmpeg的功能非常強大,幾乎所有的音視頻主流編解碼方式都可以實現(xiàn),而且代碼效率非常的高,并且全部原碼由C語言編寫,可以非常方便的移植到An-dorid平臺下。
此外,編寫Android動態(tài)鏈接庫需要使用JNI技術(shù)。C語言和Java之間有很多差別,比如基本數(shù)據(jù)類型就有很大差別,Java有類和對象的概念,而C沒有。想要Java調(diào)用C編寫的方法,需要JNI作為橋梁,JNI的主要作用就是規(guī)定了如何用Java調(diào)用C方法,c訪問Java調(diào)用者傳遞的形式參數(shù)等等相互操作。根據(jù)JNI規(guī)定,我們需要自己編寫的源文件“avjni.c”,用來向下實現(xiàn)對FFmpeg的調(diào)用,向上提供Android應(yīng)用層調(diào)用的接口函數(shù)。其中編譯腳本Android.mk如下所示: