Android:判断MediaRecorder的H264编码是硬编/软编及强制硬编方法
判断MediaRecorder的H264编码器类型&强制硬件编码方案
一、怎么知道当前用的是硬件还是软件编码器?
MediaRecorder本身没有直接暴露编码器类型的API,但有两个靠谱的方法:
看系统日志:Android会在MediaRecorder初始化编码器时输出日志,你可以在Logcat里搜索关键词比如
MediaRecorder、CodecBase或者video/avc。通常:- 硬件编码器名称带厂商前缀的
OMX.标识,比如高通的OMX.qcom.video.encoder.avc,联发科的OMX.mtk.video.encoder.avc; - 软件编码器一般是
OMX.google.h264.encoder。
找到类似Using codec [编码器名称] for video/avc的日志,就能直接判断类型。
- 硬件编码器名称带厂商前缀的
间接排查编码器列表:先枚举设备上所有支持H264编码的MediaCodec,筛选出硬件/软件编码器,再结合日志对比。不过这个方法不如看日志直接,代码示例:
MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS); for (MediaCodecInfo codecInfo : codecList.getCodecInfos()) { if (!codecInfo.isEncoder()) continue; for (String type : codecInfo.getSupportedTypes()) { if (type.equalsIgnoreCase("video/avc")) { String tag = codecInfo.isHardwareAccelerated() ? "硬件编码器" : "软件编码器"; Log.d("CodecCheck", tag + ": " + codecInfo.getName()); } } }
另外要注意:你之前用MediaCodec.createDecoderByType("video/avc")获取的是解码器信息,和MediaRecorder用的编码器完全不相关,所以这个方法没法判断编码器类型哦。
二、怎么强制仅使用硬件编码器?
MediaRecorder的封装性比较强,没有直接指定编码器名称的API,所以有两种方案:
方案1:用MediaCodec+MediaMuxer替代MediaRecorder(推荐)
如果需要精确控制编码器,直接用MediaCodec构建编码流程,就能指定硬件编码器:
// 第一步:找到可用的硬件H264编码器 String hardwareCodecName = null; MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS); for (MediaCodecInfo codecInfo : codecList.getCodecInfos()) { if (!codecInfo.isEncoder()) continue; for (String type : codecInfo.getSupportedTypes()) { if (type.equals("video/avc") && codecInfo.isHardwareAccelerated()) { hardwareCodecName = codecInfo.getName(); break; } } if (hardwareCodecName != null) break; } if (hardwareCodecName == null) { throw new IllegalStateException("设备没有可用的H264硬件编码器"); } // 第二步:初始化硬件编码器 MediaCodec encoder = MediaCodec.createByCodecName(hardwareCodecName); MediaFormat videoFormat = MediaFormat.createVideoFormat( "video/avc", 1920, 1080, // 替换成你的分辨率 8000000 // 替换成你的码率 ); videoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30); videoFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5); videoFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); encoder.configure(videoFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); Surface inputSurface = encoder.createInputSurface(); // 后续:从Surface采集摄像头数据、启动编码、将编码后的数据写入MediaMuxer保存为视频文件
这种方式能100%确保使用硬件编码器,因为我们直接指定了硬件编码器的名称。
方案2:尝试给MediaRecorder设置编码器偏好(不保证所有设备生效)
有些设备支持通过MediaRecorder.setParameters()传递隐藏参数来指定编码器,但这属于厂商私有API,兼容性很差,不推荐。比如某些设备可能支持:
media_rec.setParameters("encoder-name=OMX.qcom.video.encoder.avc");
但这个方法在不同厂商设备上可能完全无效,所以还是方案1更可靠。
三、怎么验证确实用了硬件编码器?
- 日志验证:运行时查看Logcat,确认编码器名称是硬件编码器(比如带厂商前缀的OMX.xxx);
- 性能验证:硬件编码的CPU占用会比软件编码低很多,用Android Studio的Profiler或者
adb shell top命令查看CPU使用率,软件编码通常会占用较高CPU,硬件编码则几乎不占; - API验证:如果用方案1的MediaCodec方式,直接调用
encoder.getCodecInfo().isHardwareAccelerated(),返回true就说明是硬件编码器。
内容的提问来源于stack exchange,提问作者toxic_boi_8041




