如何让以 H.264 编码的视频流在“WebView”中播放?

Posted

技术标签:

【中文标题】如何让以 H.264 编码的视频流在“WebView”中播放?【英文标题】:How to get a video stream encoded in H.264 to play in a "WebView"? 【发布时间】:2018-06-27 14:11:54 【问题描述】:

我有一个带有 html5 视频播放器的远程托管网页,可以流式传输 H.264 编码的视频。我需要在我的 android Activity 中嵌入这个页面(不在浏览器外部打开)。最新的 Android System Webview(版本 63.0)不支持 H.264 编码,Crosswalk 的 Webview 也不支持(匹配我的硬件架构)。我有哪些选择?

【问题讨论】:

需要更多关于编码等的信息,但它确实适用于我使用gist.github.com/Offbeatmammal/3718414 【参考方案1】:

更新答案

经过一番挖掘,似乎Android中的webview确实存在支持h.264的问题。这是因为它基于 Chromium,默认情况下不支持 h.264(涉及专利等的悠久历史)。

目前最常见的建议似乎是构建自己的 Chromium Web 视图,构建选项/标志包括 h.264。

这是 Chrome 的一个已知限制,在撰写本文时这里列出了一个未解决的错误:

https://bugs.chromium.org/p/chromium/issues/detail?id=719023

Chrome 和 Chromium 之间的区别在其他地方已有详细记录,但其中一个关键点是 Chromium 是完全开源的,因此避免包含专有组件,这就是未包含许可 H.264 编解码器的原因。

带有更正的原始答案

[除非刚刚更改,否则标准的 Android 网页视图应该支持] Android 设备和 Android chrome 浏览器通常支持 h.264 视频(只要配置文件和设置在集合内)设备支持 - 最初使用基线配置文件进行测试是一种安全的开始方式)。 但是,在撰写本文时,基于 Chromium 的 Android Webview 不支持 h.264。

支持的默认视频格式集可在此处获得:https://developer.android.com/guide/topics/media/media-formats.html#video-formats

Android Web 视图中存在已知/报告的 WebRTC 和 h.264 问题但一致认为这是与 webRTC 相关的,AFAIK - 请参阅:https://groups.google.com/a/chromium.org/forum/#!topic/android-webview-dev/hVZdHK6MKfI

【讨论】:

我使用 Janus 作为 WebRTC 网关并使用基线配置文件。我还尝试了许多其他设置,但始终看到这两个错误[ERROR:webrtcvideoengine.cc(665)] No video codecs supported.[ERROR:webrtcsession.cc(350)] Failed to set remote offer sdp: Session error code: ERROR_CONTENT. Session error description: Failed to set remote video description send parameters.. 似乎唯一可用的选择是本地实现客户端 API 并呈现流。【参考方案2】:

导致 H.264 视频流无法在 Android 版 Chrome 上运行有两个不同的问题(经常混淆):

1) Chrome for Android 只有 H.264 的硬件实现,没有软件实现。目前,H.264 仅适用于配备 Qualcomm(Kitkat 及更高版本)或三星 Exynos(Lollipop 及更高版本)处理器的设备。

2) Chrome for Android 中存在与 H.264 相关的 bug

错误信息如下:

Unhandled Promise Rejection: OperationError (DOM Exception 34): 
Failed to set remote offer sdp: Session error code: ERROR_CONTENT. 
Session error description: Failed to set remote video description send parameters..

Chrome Android does not offer/answer H.264 Constrained Baseline Profile

这个问题可能会在 Chrome Android M65 中得到解决。见this for more information。

由于您有相同的错误消息(在另一个答案下将此视为注释),因此您的问题与此错误有关。

【讨论】:

我在本机实现中的某些设备上遇到了同样的错误。 Failed to set remote offer sdp: Session error code: ERROR_CONTENT. 如果我尝试使用一些静态值在我的客户端代码中设置 Remote Offer SDP 会有什么不同吗? 报价是动态的,它总是不同的,这就是为什么你不能让它成为静态的。

以上是关于如何让以 H.264 编码的视频流在“WebView”中播放?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何从 iPhone 相机中获取 H.264 编码的视频流?

如何使用 NVidia NVEnc 硬件编码器通过 UDP 流式传输 H.264 视频?

如何使用 libavcodec/x264 对 h.264 进行编码?

如何在 Windows 中使用 H264 视频编码器 MFT 编码位图

YouTube 是不是会在上传具有推荐视频格式 (H.264) 的文件时重新编码?

H264视频文件如何打开