Javascript 中的 MediaSource 与 MediaStream

Ser*_*gio 14 javascript video media-source mediastream

我的 Javascript 应用程序通过 Websocket 连接获取 WebM 视频流。远程对等方发送视频帧和应用程序获取它们之间没有延迟。

我MediaSource在应用程序中创建了一个对象,“附加视频帧”,并让视频元素显示它:

video.src = window.URL.createObjectURL(mediaSource);
Run Code Online (Sandbox Code Playgroud)

这很好用,但有一些(不到一秒)延迟,这可以说使这个解决方案不是视频通话的最佳选择。

显然,一些 WebRTC 应用程序使用MediaStream:

video.srcObject = mediaStream;
Run Code Online (Sandbox Code Playgroud)

...这些显示没有延迟。

我无法从文档浏览器确定是否处理src和srcObject不同。

我找不到的另一件事是,是否可以MediaStream像使用MediaSource. 我想尝试这样做只是为了检查是否srcObject不会导致我的应用程序出现上述延迟。

如果我使用:

video.srcObject = mediaSource;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

类型错误:无法在“HTMLMediaElement”上设置“srcObject”属性:提供的值不是“MediaStream”类型

use*_*208 18

您问的是非常好的问题,我们所有人,流媒体视频开发人员,在浏览器中的无插件近实时流媒体视频方面遇到相同的问题并分享同样的挫败感。

让我尽我所知解决您的问题(近年来,我为流媒体服务器软件实现了 WebRTC 和媒体源扩展)

  1. " 如果可以创建 MediaStream 并向其附加缓冲区,例如 MediaSource"

这很容易 - 这是不可能的。MediaStream API:https : //developer.mozilla.org/en-US/docs/Web/API/MediaStream 不公开对 MediaStream 对象的帧缓冲区的访问,它使用 WebRTC 在内部处理所有内容,或者使用 getUserMedia(来自本地网络摄像头)获取帧),或来自 RTCPeerConeection(来自网络)。使用 MediaStream 对象,您不直接操作帧或段。

而且,当然,video.srcObject = mediaSource将不起作用:video.srcObject 必须是由 WebRTC API 创建的 MediaStream 对象,没有别的。

  1. “如果浏览器以不同方式处理 src 和 srcObject,我在文档中找不到”

是的,浏览器确实以非常不同的方式对待 video.src 和 video.srcObject;并且没有关于它的文档,它没有多大意义。政治在其中发挥着重要作用。

来自 Chrome 浏览器的臭名昭著的例子:

一种。媒体源扩展 (video.src) 支持 AAC 音频,但 WebRTC (video.srcObject) 不支持,也永远不会。原因是——谷歌收购了太多音频压缩公司,其中之一——Opus——符合WebRTC规范,谷歌正在推动Opus成为一个新的“免版税”音频之王,所以video.srcObject中没有AAC支持,现在所有的硬件世界都必须实施 Opus。所以谷歌可以并且被合法允许向 Chrome 添加 AAC 支持,因为它是为 Media Source Extensions (video.src) 做的。但它永远不会向 WebRTC 添加 AAC 支持。

湾 Chrome 在 vi​​deo.src 和 video.srcObject 中对 H264 视频解码器使用不同的策略。这没有任何意义,但这是事实。例如,在 Android 上,只有具有硬件 H264 解码支持的设备才会支持 WebRTC (video.srcObject) 中的 H264。不支持硬件 H264 的旧设备将无法通过 WebRTC 播放 H264 视频。但相同的设备将通过媒体源扩展 (video.src) 播放相同的 H264 视频。因此,如果硬件不可用,video.src 必须使用软件解码器。为什么在 WebRTC 中不能做同样的事情?

最后,你的VP8流不会在iOS上播放,无论是Media Source Extensions(iOS根本不支持,哈哈哈),也不是WebRTC(iOS只支持WebRTC的H264视频,哈哈哈哈)。你问苹果为什么这样做?哈哈哈哈哈


use*_*208 5

最后,你的VP8流不会在iOS上播放,无论是在Media Source Extensions中(iOS根本不支持它,哈哈哈),还是在WebRTC中(iOS仅支持WebRTC的H264视频,哈哈哈)。你问苹果为什么这么做?哈哈哈哈哈

2020 更新 - 现在 iOS 设备通过 WebRTC 支持 VP8,并且新的 iPAD 开始支持媒体源扩展。一路走好,苹果!