WebRTC android h264 编解码适配

本文探讨了在Android平台上,WebRTC对H264编解码的支持情况,包括软编软解和硬编硬解的优缺点。分析了硬编码和解码器的创建过程,指出当前WebRTC对某些硬件编码器的白名单限制导致的适配问题,并提出了三种解决方案:扩展白名单、移除白名单检查以及直接通过编码器类型创建。最后,强调了WebRTC在H264支持上的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自从Cisco 宣布旗下的H264 Codec开源为OpenH264,并且替所有OpenH264的使用者支付了H264的专利费,WebRTC也随即对h264进行了支持, 在Android平台, 软编用 OpenH264, 软解用FFMPGE, 硬编硬解用 MediaCodec. 在android和iOs中软编软解默认是禁止的,要想启用需要把OpenH264和FFMPGE编译进来,这样就会大大增加库的大小,况且软编软解比较费cpu,耗电量和发热都会增加,使用软编软解的好处是编解码不依赖于硬件,不存在设备适配问题。硬件编解码能够解决软编软解的痛处,但是存在设备适配问题,因为不同的设备使用的硬解码器不同,可能会导致编码失败及解码失败。以android为例,由于android厂商众多,使用的cpu芯片更是繁多,同一芯片厂商不同型号实现的硬解码器也有不同,这样就造成适配很困难,况且h264不是google推荐使用的编解码器(毕竟不是亲生的),所以在适配方面存在很多问题。

android中硬编码实现在MediaCodecVideoEncoder.java中,硬解码实现在MediaCodecVideoDecoder.java中,下面逐个分析

来看一下如何创建编码器:

boolean initEncode(VideoCodecType type, int profile, int width, int height, int kbps, int fps,
      boolean useSurface) {
    ...
    EncoderProperties properties = null;
    String mime = null;
    int keyFrameIntervalSec = 0;
    boolean configureH264HighProfile = false;
    if (type == VideoCodecType.VIDEO_CODEC_VP8) {
      mime = VP8_MIME_TYPE;
      properties = findHwEncoder(
          VP8_MIME_TYPE, vp8HwList(), useSurface ? supportedSurfaceColorList : supportedColorList);
      keyFrameIntervalSec = 100;
    } else if (type == VideoCodecType.VIDEO_CODEC_VP9) {
      mime = VP9_MIME_TYPE;
      properties = findHwEncoder(
          VP9_MIME_TYPE, vp9HwList, useSurface ? supportedSurfaceColorList : supportedColorList);
      keyFrameIntervalSec = 100;
    } else if (type == VideoCodecType.VIDEO_CODEC_H264) {
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值