Android 13中VideoEncoderCap是否已废弃?相机应用开发疑问
问题解答
关于VideoEncoderCap的废弃状态
android.hardware.camera2.params.VideoEncoderCapabilities(即你提到的VideoEncoderCap)自API 31起已被官方废弃,Android 13(API 33)系统中已不再提供该类的正常访问路径——即使你将targetSdkVersion设置为30,Android 13设备的系统框架也会限制对该废弃API的调用,因此无法正常使用。
为何MediaCodecInfo与旧API结果存在差异
旧的VideoEncoderCapabilities是直接从相机硬件层面获取的编码能力绑定信息,而MediaCodecInfo是从系统媒体框架(MediaCodec)层面获取的通用编码能力,二者数据源不同:
- 前者严格绑定当前相机硬件的编码输出能力
- 后者是系统编码器支持的所有能力,可能包含不依赖相机硬件的纯软件编码能力,因此结果会存在差异
替代解决方案
1. 正确使用MediaCodecInfo获取编码器能力
针对目标编码格式(如MPEG4、H263),通过MediaCodec的官方API获取准确的编码能力:
// 遍历获取目标编码器的MediaCodecInfo MediaCodecInfo targetCodec = null; for (MediaCodecInfo info : MediaCodecList.getCodecInfos()) { if (!info.isEncoder()) continue; String[] types = info.getSupportedTypes(); for (String type : types) { if (type.equals(MediaFormat.MIMETYPE_VIDEO_MPEG4) || type.equals(MediaFormat.MIMETYPE_VIDEO_H263)) { targetCodec = info; break; } } if (targetCodec != null) break; } // 获取视频编码能力 if (targetCodec != null) { MediaCodecInfo.CodecCapabilities codecCaps = targetCodec.getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_MPEG4); MediaCodecInfo.VideoCapabilities videoCaps = codecCaps.getVideoCapabilities(); // 获取最大分辨率 int maxWidth = videoCaps.getSupportedWidths().getUpper(); int maxHeight = videoCaps.getSupportedHeights().getUpper(); // 若需结合帧率,获取对应帧率下的最大尺寸 Size maxSizeFor30Fps = videoCaps.getSupportedSizesForFrameRate(30).getUpper(); }
2. 获取相机绑定的编码能力(对应旧API场景)
如果你的需求是获取相机硬件直接支持的编码输出尺寸(即旧VideoEncoderCapabilities的作用),可以通过Camera2 API的StreamConfigurationMap获取:
// 从相机Characteristics中获取配置映射 CameraCharacteristics cameraChars = ...; // 已初始化的相机Characteristics StreamConfigurationMap configMap = cameraChars.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); // 获取相机支持的目标编码格式输出尺寸 Size[] supportedVideoSizes = configMap.getOutputSizes(MediaFormat.MIMETYPE_VIDEO_MPEG4); // 筛选出最大尺寸 Size maxCameraVideoSize = Collections.max(Arrays.asList(supportedVideoSizes), (o1, o2) -> Long.compare((long)o1.getWidth() * o1.getHeight(), (long)o2.getWidth() * o2.getHeight()) );
3. 处理能力差异的兼容建议
若需要确保相机输出尺寸能被编码器正常处理,建议:
- 取相机支持尺寸与编码器支持尺寸的交集
- 优先选择交集内符合业务需求的最大尺寸
- 针对MPEG4、H263这类老旧编码格式,额外做低分辨率 fallback 处理,避免部分设备编码器不支持大尺寸编码
内容的提问来源于stack exchange,提问作者peter teoh
相关产品推荐
相关产品推荐

