【问题标题】:how to access HTML5 video decoding functionality?如何访问 HTML5 视频解码功能?
【发布时间】:2017-12-12 16:44:12
【问题描述】:

HTML5 有<video/> 元素,可以从服务器下载视频,解码并渲染。他们经常使用硬件加速解码(如果有的话)。

是否可以仅访问解码功能?原因是我正在使用自定义流协议,所以在客户端我已经编码了需要解码和渲染的视频流。

不幸的是,视频解码器的纯 JavaScript 实现不适用,因为它们无法提供足够的性能。我只对 HVEC 或 h.264 编解码器感兴趣。

【问题讨论】:

  • blob uri 呢?
  • @Qwertiy 请详细说明

标签: html html5-video hardware-acceleration video-codecs


【解决方案1】:

是否可以只访问解码功能?

很遗憾,没有。我们只能访问与流/源文件无关的高级 API,其影响有限,例如基于时间的位置、播放状态和各种事件。我们可以从当前解码的帧以原始 RGB(A) 的形式将帧绘制到画布上,仅此而已。

原因是我正在使用自定义流协议等 客户端我已经编码了需要解码的视频流 渲染

你没有描述这个协议,所以我们只能猜测,但你可以使用Media Source Extensions 构建一个可供视频元素使用的浏览器兼容流。这允许您直接在客户端中构建自适应和自定义流解决方案。

视频解码器的纯 JavaScript 实现不适用 不幸的是,它们无法提供足够的性能。

这不一定是真的。例如,纯 JS 实现实时解码 MPEG1 流,包括音频和视频,例如 thisthis。当然,这仅限于目前大多数浏览器所能做的。还有一个emscripten based H-264 解码器可用,它似乎也通过 WebGL 使用 GPU,但我不能说它的性能 - 不过它可能是下一段的一个很好的起点:

更好的选择是查看WebAssembly,它可以从例如 C/C++ 源代码运行预编译的二进制代码。这允许您使用在浏览器中以本机速度运行的 HVEC/H.264 解码器的开源实现(但请注意许可证和条款,especially for H.264),或使用部分软件,例如(linkable) ffmpeg

我对任何非便携式解决方案都感兴趣

在这种情况下,您可能想要考虑构建一个可以使用messaging to interact with native applicationweb-extension(又名浏览器扩展)(在这种情况下后者可以是ffmpeg,或者可以直接处理流的程序)。

这将如何工作当然取决于您使用的协议等等。

根据有限的范围/描述,只需我的 2 美分。

【讨论】:

  • +1。据我了解,视频元素只能与 HLS 或 MPEG-DASH 一起使用,两者都不支持低延迟流媒体?我的意思是毫秒响应,而不是秒:wowza.com/blog/hls-latency-sucks-but-heres-how-to-fix-it。这是自定义协议的唯一原因,这会打折视频元素,请纠正我。不幸的是,MPEG-1 是不可接受的,网络扩展已被弃用。现有的 JS 解码器是 emscripten 的直接端口,在大量流上表现不佳。
  • 遗憾的是,浏览器支持的功能以及整类应用程序所需的功能都没有公开,即使是以不可移植的方式
【解决方案2】:

这个问题的解决方案是WebRTC。可以集成外部编码器或使用嵌入式编码器。在浏览器中,WebRTC 客户端使用 H/W 解码。 WebRTC 还提供实时流功能。兼容性还不错。

【讨论】:

  • 您能否扩展一下您的答案?我对在客户端解码视频的任何方式都非常感兴趣(更具体地说 - 提取没有丢失和重复的帧序列),但我不确定在这种情况下如何应用 WebRTC。我是否必须设置一个特殊的服务器来通过 WebRTC 向客户端提供解码帧?
  • @MichaelRadionov:WebRTC 是为点对点视频会议而设计的,例如网络浏览器到网络浏览器,并且具有 JavaScript API。对于任何不那么琐碎的事情,它的源代码都是开放的,并且具有本机 C++ API(又名“本机 WebRTC”)以及对其他语言的绑定。您需要通过 WebRTC 流式传输并通过嵌入式 WebRTC 客户端接收,以便在 Web 浏览器中进行硬件解码。它是实时流式传输,因此确实会发生丢帧但不会重复。我建议您将您的案例详细描述为一个单独的问题,我会尽力回答。
  • 我对直接获取原始解码帧感兴趣,这可以通过“仅使用解码功能”实现。但是从我读到的内容来看,即使使用 WebRTC 也是不可能的。如果我错了,请纠正我,但是使用 webRTC,您必须使用 video 元素来完成硬件解码,对吧?
【解决方案3】:

经过长期研究,在使用媒体源扩展 (MSE) 的 Android 浏览器上使用硬件解码器解码 h264 HLS TS 段流是可能的。由于 iOS 不支持 MSE,让它在 iOS 的 Safari 上运行似乎遇到了障碍,因为 Apple 不允许通过 FIFO 缓冲区或回调访问硬件解码器。鉴于 Apple 对 WebRTC 的支持,似乎在 iOS 中获取硬件解码器的唯一方法等同于“接收视频通话”流程,除了输入必须是远程 http 流并且输出必须转到画布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2013-01-09
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多