• Webrt中H264编码相关问题


    编译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中调试出来了。
  • 相关阅读:
    ConcurrentHashMap之实现细节
    Java 开发 2.0: 用 Hadoop MapReduce 进行大数据分析
    mapreduce从wordcount开始
    centos 5.5 安装mysql 5.5 全程详细记录 RPM方式安装
    使用GDAL工具对OrbView3数据进行正射校正
    centos 5.5 mysql5.5 乱码
    netty vs mina netty和mina的区别
    VC欣赏、家人是阻力,极客化、国际化——90后创业生态
    悲惨而又丢人的创业经历:草根创业者含恨倾诉为什么失败
    悲惨而又丢人的创业经历:草根创业者含恨倾诉为什么失败
  • 原文地址:https://www.cnblogs.com/onlycoder/p/7297360.html
Copyright © 2020-2023  润新知