之前在做mtk平台Camera定制的时候遇到一个问题,主流的会议软件在Android 9.0 Mtk 平台使用的分辨率都是640*480,于是我猜想是会议apk调用Camera.java中的getPreviewSize()方法获取分辨率在调用setPreviewSize()方法再设置进去。
从Android 8.0开始,media_profiles.xml/media_profiles_ducam.xml(双摄项目)成为了配置视频画质、格式、帧率等参数的文件了,而不同于之前7.0上放在MediaProflie.cpp中配置了。
于是我在device/your_vendor/mt9950/configs/media_profiles.xml中配置如下代码:
<EncoderProfile quality="1080p" fileFormat="mp4" duration="60">
<Video codec="h264"
bitRate="7000000"
width="1920"
height="1080"
frameRate="30" />
<!-- audio setting is ignored -->
<Audio codec="amrnb"
bitRate="12200"
sampleRate="8000"
channels="1" />
</EncoderProfile>
重新编译后执行指令 dumpsys media.camera | grep preview
在getPreviewSize()方法中添加打印发现返回的分辨率已经变成了1920*1080.
但是,会议软件使用的分辨率依旧是640*480
于是我又在getSupportedPreviewSizes()方法中,对返回的列表进行过滤处理,把列表中640*480给过滤掉
private String filter4kPreview(String sizes){
String p480 = ",640x480";
if(sizes.contains(p480)){
sizes = sizes.replace(p480,"");
Log.i(TAG, "filter4kPreview p480 is replace"+sizes);
}
return sizes;
}
/**
* Gets the supported preview sizes.
*
* @return a list of Size object. This method will always return a list
* with at least one element.
*/
public List<Size> getSupportedPreviewSizes() {
String str = get(KEY_PREVIEW_SIZE + SUPPORTED_VALUES_SUFFIX);
Log.i(TAG, "getSupportedPreviewSizes filter: str size+"+str);
str = filter4kPreview(str);
Log.i(TAG, "getSupportedPreviewSizes after filter: pair str+"+str);
List<Size> sizes = splitSize(str);
//Collections.reverse(sizes); 倒置列表
return sizes;
}