webrtc M66 华为手机h264硬编解码不支持问题
最近使用webrtc的h264编码时,测试发现华为都不支持,而其他手机可以,通过阅读webrtc的代码发现如下问题
- webrtc 会先检测手机支持不支持h264编码,如果找不到,就认为此手机不支持h264编码,但是我们都知道华为手机是支持h264编码的,那为什么知道不到呢?
- 通过调试发现webrtc h264的
supportedHwCodecProperties
只支持如下两种,也就是OMX.qcom和OMX.Exynos(OMX是OpenMax的缩写);
- 华为手的MediaCodecInfo列表中只找到了如下,所以并不是华为手机不支持h264编解码,而是没有匹配到
- 要让webrtc和找到h264编码器,只需要修改
supportedHwCodecProperties
就可以,修改如下:(编码和解码都要修改),主要是修改MediaCodecVideoEncoder
和MediaCodecVideoDecoder
这两个类;
//MediaCodecVideoEncoder
googleH264HwProperties = new MediaCodecVideoEncoder.MediaCodecProperties("OMX.google.", 21, MediaCodecVideoEncoder.BitrateAdjustmentType.FRAMERATE_ADJUSTMENT);
private static final MediaCodecVideoEncoder.MediaCodecProperties[] h264HwList() {
ArrayList<MediaCodecVideoEncoder.MediaCodecProperties> supported_codecs = new ArrayList();
supported_codecs.add(qcomH264HwProperties);
supported_codecs.add(exynosH264HwProperties);
supported_codecs.add(googleH264HwProperties);//添加对 OMX.google 的匹配
if (PeerConnectionFactory.fieldTrialsFindFullName("WebRTC-MediaTekH264").equals("Enabled")) {
supported_codecs.add(mediatekH264HwProperties);
}
return (MediaCodecVideoEncoder.MediaCodecProperties[])supported_codecs.toArray(new MediaCodecVideoEncoder.MediaCodecProperties[supported_codecs.size()]);
}
// MediaCodecVideoDecoder 类
private static final String[] supportedH264HwCodecPrefixes() {
ArrayList<String> supportedPrefixes = new ArrayList();
supportedPrefixes.add("OMX.qcom.");
supportedPrefixes.add("OMX.Intel.");
supportedPrefixes.add("OMX.Exynos.");
supportedPrefixes.add("OMX.google."); //添加对 OMX.google 的匹配
if (PeerConnectionFactory.fieldTrialsFindFullName("WebRTC-MediaTekH264").equals("Enabled") && VERSION.SDK_INT >= 27) {
supportedPrefixes.add("OMX.MTK.");
}
return (String[])supportedPrefixes.toArray(new String[supportedPrefixes.size()]);
}