Android MediaRecorder自定義分辨率


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的常亮,可以進源碼看一下

 

        好了,就這么多了,第一篇博客到此結束,其實這個方法不只能自定義視頻分辨率,對照片自定義分辨率也可以作為參考,當然,這個我沒試過,大家可以試試

 

        如果文章有什么不對的地方,歡迎指出大家一起學習進步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM