HTMLImageElement - src 作为流

J T*_*ana 5 javascript image mediastream

过去,您可以使用URL.createObjectURL()MediaStream 并将其传递给它。但是,这已被删除(参见https://www.fxsitecompat.dev/en-CA/docs/2017/url-createobjecturl-stream-has-been-deprecated/)。

替换功能是改为使用HTMLMediaElement.srcObject. 这很好地覆盖了视频案例。

但是,HTMLImageElement不继承自HTMLMediaElement. 它也没有 srcObject。

在我的特定情况下,我正在开发一个 FireFox 插件,它利用 WebRequest 过滤器流功能进行图像转换。使用该 API,我获得了 ArrayBuffer 数据块。我希望能够在我收到它们时将它们流式传输到Image()正在解码它们的实时解码器,而不是简单地累积它们,将它们转换为 Blob,然后通过URL.createObjectURL(blob).

有没有办法以流媒体方式完成此任务?

(注 1:如果需要,我可以使用 FireFox 特定的解决方案。)

(注意 2:我尝试将HTMLVideoElementsrc设置为例如 PNG 但看起来视频元素确实很挑剔并且只支持视频格式而不是静止HTMLVideoElement.srcObject图像。如果我可以加载图像静止图像,那也可能使基于 MediaStream 的解决方案成为可能)。

Kai*_*ido 6

URL.createObjectURL( MediaStreamInstance )已被弃用,URL.createObjectURL( BlobInstance )也不是此方法的其他有效输入(如 MediaSource)。

MediaStreams 只能公开视频和音频媒体数据,我找不到确切的引用,但阅读规范使它非常清楚,事实上 aMediaStreamTrack.kind只能是"audio""video"

就像您无法设置 一样<img src="video.mp4">,您永远无法将 MediaStream 传递给<img>,因此这对您来说不是问题,并且URL.createObjectURL可以按您的意愿工作:

const img = document.getElementById( 'img' );
fetch( "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png" )
.then( (resp) => resp.arrayBuffer() )
.then( (buf) => {
  const blob = new Blob( [buf], { type: 'image/png' } );
  img.src = URL.createObjectURL( blob );
} );
Run Code Online (Sandbox Code Playgroud)
<img id="img">
Run Code Online (Sandbox Code Playgroud)

在 an 中拥有真正流的唯一方法<img>是通过MJPEG 格式


已经决定不再允许 MediaStreams,因为作者经常没有在他们应该撤销它的时候撤销它,并且由 blobURI 链接的 MediaStream 必须保持活动状态,这意味着即使是硬件源本地流必须在这个 blobURI 的整个生命周期中保持运行(在某些情况下可能会很长)。

当所有主要浏览器最终都支持MediaElement.srcObjectMediaStreams的属性时,保留它就没有什么意义了。

这是在规范的 repo 上发生的长时间讨论
这是 Firefox 的错误报告
这是 Chrome 的一个

(请注意,唯一被删除的是能够通过 blobURI创建<iframe><object>指向这样的 MediaStream,但没有真正的用例来使用这些而不是<video>元素。)