登录
  • 欢迎访问 Sharezer Blog

Webrt中H264编码相关问题

Android sharezer 3993次浏览 已收录 0个评论

编译WebRTC后,默认是没有把H264编码编进来的。WebRTC中H264编码采用的是openh264,解码默认采用的是ffmpeg,移动版本android,ios默认采用的是系统的h264硬件编码,如果你的手机支持H264硬件编码的话,WebRTC就会默认支持H264。

1.如何在桌面版本中开启H264编码

使用gn生成ninja文件时,加入以下两个选项就可以生成 ffmpeg_branding="Chrome" rtc_use_h264=true,比如我要编译Linux版本,使用以下命令 gn gen out/linux --args='target_os="linux" target_cpu="x64" is_component_build=false is_debug=false ffmpeg_branding="Chrome" rtc_use_h264=true',再输入ninja -C out/linux video_loopback,就会在out/linux目录下生成video_loopback可执行文件,你进入到out/linux目录下,输入./video_loopback --codec=H264就可以看到效果了,这个在WebRTC56版本,ubuntu14.04环境下测试。

2.如何在安卓版本中调试h264硬件编解码

WebRTC是通过jni调用Android系统中的MediaCodec api来实现硬件编解码的,我通过分析代码发现,硬件解码的实现在org.webrtc.
MediaCodecVideoDecoder中实现的,目前WebRTC官方只调试过高通,三星等大厂商的芯片,像其它的比如海思,联发科,全志之类等
芯片,你要想把这些芯片的H264硬件解码调出来,就需要自己修改WebRTC的java代码了,在MediaCodecVideoDecoder.java中有以下代码

private static final String[] supportedVp8HwCodecPrefixes = {"OMX.qcom.", "OMX.Nvidia.", "OMX.Exynos.", "OMX.Intel."};
private static final String[] supportedVp9HwCodecPrefixes = {"OMX.qcom.", "OMX.Exynos."};
private static final String[] supportedH264HwCodecPrefixes = {"OMX.qcom.", "OMX.Intel.", "OMX.Exynos."};

以下代码的意思就是VP8硬件解码只支持高通,英伟达,三星,英特尔,VP9硬件解码只支持高通和三星,H264硬件解码只支持高通,英特尔,三星。
比如我知道海思的芯片支持H264硬件解码,我只需要修改一行就可以调试出来。
private static final String[] supportedH264HwCodecPrefixes = {"OMX.qcom.", "OMX.Intel.", "OMX.Exynos.","OMX.hisi."};
说完解码我们再来看编码,硬件编码在的MediaCodec api来实现硬件编解码的,我通过分析代码发现,硬件解码的实现在org.webrtc。
MediaCodecVideoEncoder中,关键代码如下,

private static final MediaCodecProperties qcomH264HwProperties = new MediaCodecProperties(
      "OMX.qcom.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT);
private static final MediaCodecProperties exynosH264HwProperties = new MediaCodecProperties(
      "OMX.Exynos.", Build.VERSION_CODES.LOLLIPOP, BitrateAdjustmentType.FRAMERATE_ADJUSTMENT);
private static final MediaCodecProperties[] h264HwList =
      new MediaCodecProperties[] {qcomH264HwProperties, exynosH264HwProperties};

以下代码的意思是WebRTC默认只支持高通和三星的芯片才有H264硬件编码,我现在想把海思的H264硬件编码也加进来,需要修成成以下这样:

private static final MediaCodecProperties qcomH264HwProperties = new MediaCodecProperties("OMX.qcom.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT);
private static final MediaCodecProperties exynosH264HwProperties = new MediaCodecProperties("OMX.Exynos.", Build.VERSION_CODES.LOLLIPOP, BitrateAdjustmentType.FRAMERATE_ADJUSTMENT);
private static final MediaCodecProperties hihsH264HwProperties = new MediaCodecProperties("OMX.hisi.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT);
private static final MediaCodecProperties[] h264HwList = new MediaCodecProperties[] {
    qcomH264HwProperties,
    exynosH264HwProperties,
    hihsH264HwProperties
};

我模仿高通的编码加了一行,并加入到h264HwList数组中,这样海思的H264硬件编码也在WebRTC中调试出来了。


Sharezer , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Webrt中H264编码相关问题
喜欢 (4)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址