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
相关产品推荐
相关产品推荐

