MTK-Android12-13 Camera2 設置默認視頻畫質功能實現
場景:部分客戶使用自己的mipi相機安裝到我們主板上,最大分辨率為1280720,但是視頻畫質默認的是640480。實際場景中,在默認視頻分辨率情況下拍出來的視頻比較模糊、預覽也不清晰
解決方案:默認最大分辨率,這樣拍攝的視頻效果基本滿足需求
文章目錄
- 需求
- 參考資料
- 解決方案
- 修改文件
- 解決方案
- 思路
- 追蹤源碼
- 源碼分析
- 總結
需求
默認視頻畫質大小最大,默認為1280*720,如下實際默認的畫質圖。
參考資料
實際發現網上參考資料基本沒有,最終還是需要死啃源碼,在源碼里面找答案。
Android 13.0 MTK Camera2 設置默認拍照尺寸功能實現
這里自己從兩方面參考資料:源碼里面找視頻畫質相關代碼+參考拍照時候的業務邏輯,特別是默認拍照尺寸的業務邏輯有一些借鑒意義,實際上默認的代碼思路是一樣的。 可以相互對比來看,分析邏輯和代碼。
解決方案
修改文件
路徑:
\vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\videoquality\src\com\mediatek\camera\feature\setting\videoquality\VideoQualityCaptureRequestConfig.java
解決方案
最終分析代碼,發現默認分辨率邏輯是獲取視頻默認質量地方修改,默認選擇支持分辨率第二大的選項,現在默認index=0,屏蔽掉 defaultIndex=1 的邏輯
/*** Get the max size as default value of video quality.* @return getDefaultValue.*/private String getDefaultQuality() {int defaultIndex = 0;/*if (mVideoQuality.getSupportedPlatformValues().size() > QUALITY_INDEX_NUMBER) {defaultIndex = 1;}*/String defaultSize = mVideoQuality.getSupportedPlatformValues().get(defaultIndex);return defaultSize;}
思路
- 先從界面開始,找到對應的文件,如何找到對應的界面? 那就adb 來實現,找其中的Fragment【Camera2
源碼以前跟蹤過,就一個Activity】,所以核心是找到對應的Fragment - 假使找到了對應的Fragment,再從源碼里面找到對應的源碼位置和相關聯文件,研習源碼,看邏輯和業務。
如下,圖片是自己的思路,方便大家提供一個類似的解決問題思路。
追蹤源碼
跟蹤到這里,我們基本上找到這個類在源碼里面的位置了,那我們就跟蹤過去,看看都有啥?
找到這個目錄,基本心理有底了,這里不就是全部跟quality(質量)相關的源碼了嘛。
源碼分析
大家可以看一下videoquality 目錄下面每一個java 文件有哪些內容,源碼文件都不大,邏輯也不復雜的。然后整理分類下部分 類 有哪些內容,做什么的。
源碼文件 | 類描述 |
---|---|
RadioPreference | video quality radio preference. |
VideoQuality | VideoQuality setting item |
VideoQualityCaptureRequestConfig | Configure video quality in capture request in camera api2. |
VideoQualityEntry | Video quality entry. |
VideoQualityHelper | Video quality helper to provide util methods. |
VideoQualitySelector | Video quality selector. |
VideoQualitySettingView | Video quality setting view. |
上面分析了每個源碼的類注釋,其實也已經描述的非常明白了的,每個類文件有哪些作用等。 處于對源碼的敏感,以前經驗告訴自己:Camera2 API 實現相機邏輯、參數設置,都是基于session,設置參數 Capture 來實現的。 正好這里 有一個類 VideoQualityCaptureRequestConfig.java 類。再看一下每個方法,居然發現了一個方法,如下:
/*** Get the max size as default value of video quality.* @return getDefaultValue.*/private String getDefaultQuality() {int defaultIndex = 0;if (mVideoQuality.getSupportedPlatformValues().size() > QUALITY_INDEX_NUMBER) {defaultIndex = 1;}String defaultSize = mVideoQuality.getSupportedPlatformValues().get(defaultIndex);return defaultSize;}
這就解釋了,為啥每次都是默認第二個選中,那么 屏蔽到 默認選中第二,defaultIndex=1 這個邏輯改成默認第一個不就行嘛,實際確實如此,默認defaultIndex 為0 。 編譯、打包項目源碼生成固件,問題解決。
總結
- 對比圖片默認拍攝大小,邏輯一樣的,都是在獲取默認分辨率的地方,進行修改。 如下圖 足以說明 拍照和錄像默認質量、分辨率
其實邏輯一樣的,修改默認值即可。
- 設置默認值的這個過程中,有很多邏輯的,比如setValue , 拍照和錄屏 也是基本一樣的思路,代碼邏輯。 這里不是重點,暫不討論。深究其它部分這里就不參與了。