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

Android修改BigFlake类实现MediaCodec H.265编码报错,求配置方案

解决CameraToMpegTest适配HEVC编码的问题

你遇到的这个报错,核心原因是BigFlake的CameraToMpegTest源码里硬编码了格式检查逻辑,只允许AVC和AAC作为合法编码格式。要让HEVC(H.265)正常工作,需要从以下几个方面修改代码:

1. 先移除/修改格式检查限制

找到抛出Media format provided is neither AVC nor AAC异常的代码块,通常在初始化编码器或设置输出格式的方法里。原代码大概是这样的:

if (!format.getString(MediaFormat.KEY_MIME).equals(MediaFormat.MIMETYPE_VIDEO_AVC) &&
    !format.getString(MediaFormat.KEY_MIME).equals(MediaFormat.MIMETYPE_AUDIO_AAC)) {
    throw new RuntimeException("Media format provided is neither AVC nor AAC");
}

你只需要把HEVC的MIME类型MediaFormat.MIMETYPE_VIDEO_HEVC加入判断条件,或者直接删掉这个检查逻辑(如果不需要保留原有的格式限制的话)。

2. 配置HEVC专属的MediaFormat参数

除了替换MIME类型,还要确保HEVC编码器需要的参数都正确设置,这里给你一个参考配置:

// 替换原有的AVC格式为HEVC
MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_HEVC, width, height);
// 基础参数:比特率、帧率、关键帧间隔
format.setInteger(MediaFormat.KEY_BIT_RATE, 5000000); // 5Mbps,可根据需求调整
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10);
// 颜色格式:和AVC一致用Surface输入即可,大部分设备都支持
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
// HEVC专属的Profile和Level,选主流的Main Profile即可
format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.HEVCProfileMain);
format.setInteger(MediaFormat.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.HEVCLevel31);

3. 提前确认设备支持HEVC编码器

虽然Mate 9、Nexus 6P硬件支持HEVC,但保险起见可以在代码里加个检查逻辑,避免在特殊场景下出错:

boolean hasHevcEncoder = false;
MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
for (MediaCodecInfo info : codecList.getCodecInfos()) {
    if (!info.isEncoder()) continue;
    for (String mime : info.getSupportedTypes()) {
        if (mime.equals(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
            hasHevcEncoder = true;
            break;
        }
    }
    if (hasHevcEncoder) break;
}
if (!hasHevcEncoder) {
    throw new UnsupportedOperationException("当前设备不支持HEVC硬件编码");
}

4. 确认输出容器兼容HEVC

CameraToMpegTest默认输出MP4文件,HEVC是可以正常封装到MP4里的,所以不需要修改MediaMuxer的容器格式(保持MUXER_OUTPUT_MPEG_4即可),只是要注意部分旧播放器可能不支持HEVC编码的MP4文件。

5. 额外注意点

  • 相机预览格式要和编码器兼容:尽量选择ImageFormat.YUV_420_888,这是大多数硬件编码器都支持的输入格式
  • 部分设备的HEVC编码器对参数有特殊限制:比如比特率范围、帧率上限,可以通过MediaCodecInfo.CodecCapabilities查询设备支持的具体参数范围,再调整你的配置

修改完这些部分后,重新编译运行,应该就能解决报错并成功使用HEVC编码了。

内容的提问来源于stack exchange,提问作者Túlio Calazans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:53:43