MTK-Android12-13 Camera2 设置默认视频画质功能实现
场景:部分客户使用自己的mipi相机安装到我们主板上,最大分辨率为1280720,但是视频画质默认的是640 480。实际场景中,在默认视频分辨率情况下拍出来的视频比较模糊、预览也不清晰
解决方案:默认最大分辨率,这样拍摄的视频效果基本满足需求
文章目录
需求
默认视频画质大小最大,默认为1280*720,如下实际默认的画质图。
参考资料
实际发现网上参考资料基本没有,最终还是需要死啃源码,在源码里面找答案。
Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现
这里自己从两方面参考资料:源码里面找视频画质相关代码+参考拍照时候的业务逻辑,特别是默认拍照尺寸的业务逻辑有一些借鉴意义,实际上默认的代码思路是一样的。 可以相互对比来看,分析逻辑和代码。
解决方案
修改文件
路径:
java
\vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\videoquality\src\com\mediatek\camera\feature\setting\videoquality\VideoQualityCaptureRequestConfig.java
解决方案
最终分析代码,发现默认分辨率逻辑是获取视频默认质量地方修改,默认选择支持分辨率第二大的选项,现在默认index=0,屏蔽掉 defaultIndex=1 的逻辑
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;
}
思路
- 先从界面开始,找到对应的文件,如何找到对应的界面? 那就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 类。再看一下每个方法,居然发现了一个方法,如下:
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 , 拍照和录屏 也是基本一样的思路,代码逻辑。 这里不是重点,暂不讨论。深究其它部分这里就不参与了。