騰訊優測是專業的移動雲測試平臺,提供全面兼容性測試,遠程真機租用等多維度的測試服務,讓測試更簡單!
有人喜歡聽着音樂high起來,有人會隨時隨地觀看熱門電視劇。大多數人都會使用QQ、微信,語音聊天。而郭美美會拍下奢侈品炫耀乾爹。這些咱們再熟悉不過的手機多媒體功能已經融入到生活中,成爲居家旅行必備品。於是不少手機應用都或多或少的涉及到多媒體功能。
一般,手機的多媒體功能包括拍照,錄音,錄像,播放音頻,播放視頻,視頻通話等等。這些功能對硬件的依賴較大,所以不一樣機型不一樣硬件會致使不少適配問題。其中,拍照功能咱們以前已經討論過了,這裏咱們繼續討論其餘多媒體功能和相關的適配問題。
【android多媒體系統】
1.android 多媒體系統結構
Android多媒體系統層次結構
如上圖,android多媒體的C語言庫是media庫,它主要由媒體播放器和媒體記錄器框架組成。media庫向上層經過JNI提供接口,下層經過PacketVideo等實現。
其中,Java類的目錄爲:
frameworks/base/media/java/android/media
Java本地調用部分JNI的目錄爲:
frameworks/base/media/* 這部份內容編譯成爲libmedia_jni.so
基於opencore的多媒體播放器和記錄器的目錄爲:
external/opencore/
多媒體框架的media庫:
frameworks/base/include/media/
frameworks/base/media/libmedia/ 這部份內容被編譯成libmedia.so
多媒體服務:
frameworks/base/media/libmediaplayerservice/ 這部份內容被編譯成libmediaplayerservice.so
其中,framework層是定製rom常常會修改的部分。
2.android各個多媒體功能
Android的多媒體功能主要包括拍照,攝像,錄音和音視頻播放,如下是各功能的調用層次圖。java
圖中,紅色框內的部分是多媒體核心media庫的內容,其中的文件格式處理和編解碼部分是經常出現適配問題的地方。接下來咱們就來討論一下適配問題。
【多媒體功能的適配問題】
衆所周知,多媒體功能的實現主要包括兩個環節:
1.輸入輸出:多媒體數據流的輸入和輸出系統
2.中間處理:編碼,解碼,文件處理
其中,輸入輸出部分主要由硬件抽象層實現,而中間處理部分主要由OpenCore實現。(OpenCore 是PacketVideo公司研發的多媒體框架,它是android多媒體核心。)
在咱們實際收集的多媒體適配問題中,絕大多數是出自第二個環節,編解碼和文件格式問題。另一小部分是奇葩的API問題。這裏咱們重點討論一下編解碼和文件格式問題。
android支持的編解碼及文件格式:
首先,咱們要區分兩個概念就是文件格式和編碼格式,它們不是一回事。文件只是一個容器,而文件裏的音視頻壓縮算法纔是具體的編碼格式。某個格式的文件能夠支持多種編碼格式,同時某個編碼格式能夠被多個文件格式支持。
Android支持的音/視頻編碼方式僅包括:AAC LC、HE-AACv一、AAC ELD、AMR-NB、AMR-WB、PCM/WAVE、H.26三、H.264 AVC、VP8,輸出的視頻格式也只有.3gp、.mp四、
.webm、.mkv,這點在開發中須要注意。尤爲是其中至關一部分格式都是較高版本的SDK才支持的。而3.0之前支持的格式很是有限。如下是android系統支持的格式:·表明支持。android
說到這裏,不少同窗要疑惑了!流行的avi, flv, rmvb格式都不支持麼?的確是這樣的!標準的android系統不支持!那爲何不少手機支持的格式不止上面這些呢?這是廠商定製rom在framework層作了修改,而且配合多媒體處理硬件,拓展的功能。這也是引發適配問題的緣由。
Android設備對於多媒體文件的處理,除了能夠用軟件opencore框架解碼,也能夠用多媒體處理器進行硬件解碼。可是想要實現高效、高清、高保真的播放效果,硬件解碼和硬件加速的效果要遠遠高於軟件解碼。所以手機廠商對多媒體的支持更偏重於在硬件上下功夫。可是不一樣硬件的解碼能力那就五花八門了。好比常見的三星的手機和平板一般支持除去rmvb之外全部的主流格式(包括微軟的wmv等),這主要是由於Real公司受權限制所致。可是國內的「山寨」平板手機一般都具有支持rmvb硬解能力。
【適配問題舉例】
1.編解碼和文件格式問題
(1)錄音問題
錄音功能的API調用以下:
File soundFile = new File(「/mnt/sdcard/sound.amr」);
MediaRecorder mRecord = new MediaRecorder();
mRecord.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mRecord.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
mRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecord.setOutputFile(soundFile.getAbsolutePath());
mRecord.prepare();
mRecord.start();
其中,標註爲紅色的參數是致使問題的參數。這類問題不少見,不少種參數組合都會致使問題。下面列舉出來,給你們提個醒!在使用的時候要特別注意。
組合 AudioSource. OutputFormat. AudioEncoder. 問題機型
1 CAMCORDER AMR_NB AAC sony ST25i
2 DEFAULT AMR_WB AMR_NB sony ST25i
3 DEFAULT MPEG_4 AMR_NB 多款機型
4 MIC AMR_WB DEFAULT 多款機型
5 MIC DEFAULT AMR_WB 多款機型
6 VOICE_CALL MPEG_4 DEFAULT LG P880
7 VOICE_DOWNLINK THREE_GPP DEFAULT 中興U880
8 VOICE_RECOGNITION THREE_GPP DEFAULT 多款機型
9 VOICE_UPLINK THREE_GPP DEFAULT 多款機型
這裏把經常使用的API所支持的格式列出來,供各位開發同窗參考:
(2)播放問題
播放功能的API調用以下:
MediaPlayer mMediaPlayer = MediaPlayer.create(TestApplication.APPLICATION_CONTEXT, R.raw.audio3ga);
mMediaPlayer.start();
或者:
mMediaPlayer = new MediaPlayer();
Resources res = TestApplication.APPLICATION_CONTEXT.getResources();
AssetFileDescriptor aDescriptor = res.openRawResourceFd(R.raw.audio3ga);
FileDescriptor firstParameter = aDescriptor.getFileDescriptor();
long secondParameter = aDescriptor.getStartOffset();
long thirdParameter = aDescriptor.getLength();
mMediaPlayer.setDataSource(firstParameter,secondParameter,thirdParameter);
aDescriptor.close();
mMediaPlayer.prepare();
其中,紅色標註的參數是資源id。若是該id表明的資源文件是某些機型不支持的格式則會出現問題。須要注意的格式是3ga、avi、flv等(請參考上面的表格)。
編解碼及文件格式問題目前並無統一的適配策略,咱們須要知道哪些編解碼和文件格式在哪些機型上會出現問題,進而避免使用。
2.輸入環節
(1)錄像問題
部分手機在開始錄像以後調節焦距會出現crash。由於硬件不支持該操做。問題機型是
天語-T619/索愛-18i/華爲-220t/三星-7500/華爲-y310t/中興n880e(2.3.6)/酷派8022
可行的解決策略是使用try-catch捕捉到crash,再進一步處理。
3.API問題:
(1)多媒體播放有兩種API調用方式,前面已經列出來了。可是實際測試發現,因爲廠商的特殊修改,調用
mediaPlayer=MediaPlayer.create(TestApplication.APPLICATION_CONTEXT, _uri, _holder);建立對象時,會出現問題,只能調用MediaPlayer.setDataSource來避免問題。而實際上create方法底層也會調用setDataSource方法實現功能。出現問題的機型是HTC EVO3D、MOTO ME722。
(2)回調方法不觸發:
調用setRecordPositionUpdateListener方法設置錄音監聽時,不觸發回調方法onPeriodicNotification。這個問題目前沒有有效解決辦法。可是咱們要避免在回調方法裏實現功能。問題機型是三星 s5360。
多媒體,多問題。可是再多的問題也難不倒機智的程序員。大連騰訊優測項目已經收集到不少多媒體的適配問題,而且能夠經過騰訊優測掃描工具檢測出來。歡迎你們體驗使用,而且把你遇到的適配問題分享出來!
_
騰訊優測是專業的移動雲測試平臺,爲應用、遊戲、H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不只在線上平臺提供自動化兼容性測試、雲手機遠程租用與調試、漏洞分析、自動化測試工具Xtest等多種質量檢測工具,更爲VIP客戶配備了專家團隊提供定製化綜合測試解決方案。程序員