如何访问HTML5视频解码功能?

4

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

是否可能仅访问解码功能?原因是我正在使用自定义流媒体协议,在客户端上有编码的视频流需要进行解码和渲染。

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


那么Blob URI呢? - Qwertiy
@Qwertiy请详细说明。 - Andriy Tylychko
3个回答

10
很抱歉,不可能仅访问解码功能。我们只有使用高级API的访问权限,可以处理与流/来源文件无关的内容,如基于时间的位置、播放状态和各种事件。我们可以从当前解码帧作为原始RGB(A)向画布绘制帧,但仅限于此。您没有描述该协议,因此我们只能猜测,但您可能可以使用媒体源扩展构建可由视频元素使用的兼容浏览器的流。这使您可以在客户端中构建自适应和自定义流方案。很遗憾,纯JavaScript实现的视频解码器应用性不大,因为它们无法提供足够的性能。
这并不一定是真的。例如,thisthis都是纯JS实现,可以实时解码MPEG1流,包括音频和视频。当然,这在大多数浏览器目前所能做到的极限上运行。还有一个基于emscripten的H-264解码器,似乎也通过WebGL利用GPU,但我不能确定其性能。它可能是下一段落的一个很好的起点:
更好的选择是研究WebAssembly,它可以运行预编译的二进制代码,例如C / C ++源代码。这使您可以在浏览器中以本地速度使用开源实现的HVEC / H.264解码器(请注意许可证和条款,特别是对于H.264),或者使用软件的部分,例如(可链接) ffmpeg

我对任何甚至是非便携的解决方案都感兴趣

你也许需要考虑构建一个网页扩展(也称为浏览器扩展),它可以使用消息传递与本地应用程序交互(在这种情况下,后者可能是ffmpeg或直接处理流的程序)。
当然,这将取决于你正在使用的协议等细节。
以上仅基于有限的范围/描述提供我的2分建议。

据我所知,视频元素只能与HLS或MPEG-DASH一起使用,两者都不支持低延迟流媒体?我的意思是毫秒级的响应,而不是几秒钟:https://www.wowza.com/blog/hls-latency-sucks-but-heres-how-to-fix-it。这是自定义协议的唯一原因,并且这排除了视频元素,请纠正我。不幸的是,MPEG-1不可接受,Web扩展已被弃用。现有的JS解码器是通过emscripten进行简单的移植,并在处理重负载流时表现出坏性能。 - Andriy Tylychko
1
真可惜,浏览器支持并且对一整类应用程序至关重要的功能,甚至在非可移植的情况下也没有暴露出来。 - Andriy Tylychko

1
经过长时间的研究,使用硬件解码器在Android浏览器上解码h264 HLS TS分段流是可能的,使用媒体源扩展(MSE)。由于iOS不支持MSE,在Safari中使其工作似乎遇到了障碍,因为苹果不允许通过FIFO缓冲区或回调访问硬件解码器。考虑到苹果对WebRTC的支持,似乎在iOS中获得硬件解码器的唯一方法是等同于“接收视频通话”的流程,除了输入必须是远程http流,输出必须进入画布。

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

请问您能否详细说明一下?我对客户端解码视频的任何方式都非常感兴趣(更具体地说,提取不带丢帧和重复帧的帧序列),但我不确定如何在这种情况下应用WebRTC。我是否需要设置一个特殊的服务器,通过WebRTC向客户端提供已解码的帧? - Michael Radionov
1
@MichaelRadionov:WebRTC是为点对点视频会议而设计的,例如浏览器到浏览器,并具有JavaScript API。对于任何不太琐碎的事情,它的源代码是开放的,并且具有本地C++ API(也称为“本机WebRTC”)以及其他语言的绑定。您需要通过WebRTC进行流式传输,并通过嵌入式WebRTC客户端接收以进行硬件解码。这是实时流式传输,因此会出现帧丢失,但不会重复。我建议您将您的情况详细描述为一个单独的问题,我会尽力回答。 - Andriy Tylychko
我对直接获取原始解码帧很感兴趣,这可以通过“仅使用解码功能”实现。但是根据我的了解,即使使用WebRTC也不可能实现。如果我错了,请纠正我,但是使用WebRTC时,您必须使用“video”元素才能完成硬件解码,对吗? - N4ppeL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接