You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:27:01