Android MediaRecorder自定義解析度 工作這麼久了,確實積累了不少東西,但都是以文檔的形式存在U盤裡的,為什麼不寫博客呢?因為懶啊!!!總感覺博客太難寫了(大概是上學時候寫作文恐懼症 的後遺症吧……),不過現在看看那些積累的有些是自己總結,但也有不少是綜合網上各位大佬的文章提煉出來 ...
Android MediaRecorder自定義解析度
工作這麼久了,確實積累了不少東西,但都是以文檔的形式存在U盤裡的,為什麼不寫博客呢?因為懶啊!!!總感覺博客太難寫了(大概是上學時候寫作文恐懼症 的後遺症吧……),不過現在看看那些積累的有些是自己總結,但也有不少是綜合網上各位大佬的文章提煉出來的,應該和大家一起分享啊!!!所以,從今天起, 寫!博!客!
廢話不多說,第一篇走起!
之前有一個項目,定製的系統,客戶要求一個錄像的功能,還有解析度也有要求,但是後來發現客戶要求的解析度Android預設是不支持的,於是就要自定義 了。註:因為是之前的文檔記錄,現在搬到博客上,不確定會不會有細節上的問題,如果各位朋友不能實現自定義解析度,歡迎反饋!我當時是確實已經實現了 的!!!
該文章的一切都是建立在MTK Android5.1源碼基礎上的修改,其它版本可能會有差異!!!
一、Andoird對於解析度的檢查
用過MediaRecorder的朋友都知道,這個類是可以設置解析度的,我最開始也沒多想就直接設置了客戶要求的,但是錄像後卻發現解析度不對,頓時我 就懵逼了……後來開始查源碼,終於讓我找到了,原來Android在內部進行了解析度的檢查,如果不是支持的解析度,就給你換掉了!!!
具體檢查的文件為:/frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
其中有這麼一個函數:status_t StagefrightRecorder::checkVideoEncoderCapabilities(bool *supportsCameraSourceMetaDataMode)
該函數中有三個位置進行了解析度的檢查:
1、#ifndef ANDROID_DEFAULT_CODE
checkVideoEncoderCapabilitiesEx();(該位置檢查寬高是否在範圍內,不在則更換編碼方式)
#endif
2、clipVideoFrameWidth();(該位置檢查寬度若小於最小值則設為最小值,若大於最大值則設置為最大值)
3、clipVideoFrameHeight();(該位置檢查高度若小於最小值則設為最小值,若大於最大值則設置為最大值)
從上邊可以看出,Android可用的解析度是有一定範圍的,那如果需要的解析度不在這個範圍內怎麼辦呢?彆著急,看下邊!
二、MediaRecorder支持解析度範圍配置
解析度範圍的修改在該文件中進行:/frameworks/av/media/libmedia/MediaProfiles.cpp
以修改H264的解析度範圍為例:
該文件中有這麼一個函數:static int getVideoCapability(int i4VideoFormat, unsigned int *pu4Width, unsigned int *pu4Height,
unsigned int *pu4BitRatem, unsigned int *pu4FrameRate, int slowmotion)
好吧,函數有點長……但是註意函數的參數,pu4Width以及pu4Height是兩個指針,而這兩個指針就將存放解析度寬高的上限!(該函數的調用也 在本文件中,有興趣的可以自己跟蹤看一下我就不廢話了),在getVideoCapability函數中又一個switch是匹配了多種解析度,只需要在 對應的解析度case語句最後修改這兩個指針指向的值,就可以達到修改解析度上限的目的。
三、自定義解析度
好了,解析度上限也根據需要修改了,接下來終於可以開始該解析度了!
首先需要修改的文件是:/vendor/mediatek/proprietary/custom/<project>/hal/D1/sendepfeature/config.ftbl.common_raw.h
該文件中定義了很多解析度對,比如預覽界面、照片、視頻等都在該文件中,現在需要做的就是在FTABLE_CONFIG_AS_TYPE_OF_DEFAULT_VALUES下邊已有的解析度中按原有格式加上你自己需要的解析度。
加上以後並沒有萬事大吉,我們繼續
接下來要改的文件是:/frameworks/av/media/libmedia/MediaProfiles.cpp
這個文件就不太好解釋了(我表達能力捉急啊求原諒……),總之,該文件中配置了很多視頻參數,根據你的項目版本以及視頻編碼方式,找到對應的那個視頻參數,修改其中的解析度為自定義的解析度。
比如:new MediaProfiles::VideoCodec(VIDEO_ENCODER_H264, 9000*1000/CamMode, 1280, 720, 30/CamMode);
看了一後應該很明白吧,解析度就是1280x720,改了這倆參數就行了,然後就在MediaRecorder中設置解析度,錄視頻,驚奇的發現,解析度改了!!!
最後再羅嗦一點:
MTK對一些視頻信息也有封裝,可以用以下方法獲取:
import com.mediatek.camcorder.CamcorderProfileEx;
CamcorderProfile mProfile = CamcorderProfileEx.getProfile(CamcorderProfileEx.QUALITY_FINE);
其中CamcorderProfileEx在AndroidStdio中會報錯,因為不是SDK中的,但是源碼編譯是沒問題的,CamcorderProfileEx中定義了不少類似QUALITY_FINE的常亮,可以進源碼看一下
好了,就這麼多了,第一篇博客到此結束,其實這個方法不只能自定義視頻解析度,對照片自定義解析度也可以作為參考,當然,這個我沒試過,大家可以試試
如果文章有什麼不對的地方,歡迎指出大家一起學習進步!