【问题标题】:Why WebRTC only support H264 in Chrome but not in native application with some devices为什么 WebRTC 仅在 Chrome 中支持 H264 而在某些设备的本机应用程序中不支持
【发布时间】:2018-12-15 18:20:41
【问题描述】:

我使用official sample在Android Chrome中创建offer SDP,我们可以找到a=rtpmap:100 H264/90000表示它可以支持H264。

但如果我构建AppRTC(official Android sample) 并使用official prebuilt libraries 1.0.25821 版本,调用createOffer 然后在SdpObserver::onCreateSuccess 中接收SDP,SDP 确实包含H264。

我的测试设备是 Oppo R15(使用 MTK Helio P60,Android 8.1)。

那么,为什么 WebRTC 只在 Chrome 中支持 H264 而在某些 Android 设备的原生应用程序中不支持?

【问题讨论】:

    标签: android webrtc h.264


    【解决方案1】:

    Chrome 构建使用常规 **WebRTC 不使用的 openh264。我所说的常规的意思是,您可以使用 chrome 构建的软件 h.264 编码器的变体,但我不推荐它。

    在 Android WebRTC 上,仅当

    支持 H.264
    1. 设备硬件支持它,并且
    2. WebRTC 硬件编码器粘合逻辑支持该硬件编码器。目前仅支持 QCOMEXYNOS 设备。因此,任何其他设备,即使它们支持 h.264 硬件编码器,也不会被使用,也不会被添加为编解码器工厂的一部分,并且您不会在从 WebRTC 示例应用程序生成的 SDP 中看到。

    在 Java 级别,您可以在 HardwareVideoEncoderFactory.java 中看到它在 isHardwareSupportedInCurrentSdkH264 函数中检查 QCOM 和 EXYNOS 设备。

    有趣的是,如果您使用的是本机代码,甚至不支持 QCOM 和 EXYNOS 硬件编码器(Webrtc 问题跟踪器上有错误归档)。这是因为硬件编码代码与 JNI 代码的紧密集成——绝对不是一个好的模块化代码。

    【讨论】:

    • 我发现 this commit 说“只允许 O_MR1 或更高版本的 MediaTek H264 HW 编解码器”。 MediaCodecVideoEncoder.java 是干什么用的?
    • 查看了该提交 - 它仍在现场试验中。您可以通过现场试用密钥 "WebRTC-MediaTekH264/Enabled/" 在官方示例应用中启用它
    • 我明白了。首先setFieldTrials"WebRTC-MediaTekH264/Enabled/",使用MediaCodecVideoEncoder::isH264HwSupported检查。然后,将DefaultVideoEncoder/DecoderFactory 改为MediaCodecVideoEncoder/Decoder::createFactory。但我们应该知道MediaCodecVideoEncoder 已被弃用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多