如果Blob URL是不可变的,那么媒体源扩展API如何使用它们来流式传输视频



让我们从一个例子开始:

  1. 您可以访问youtube.com,该网站对某些设备使用HTML5的媒体源扩展(MSE)
  2. MSE注入<视频>带有blob URL的标记。它看起来像这样:blob:https://www.youtube.com/blahblahblah">
  3. 在整个视频流传输过程中,您的浏览器会进行多次网络调用以下载各种视频块,并将它们附加到MSE的SourceBuffer中
  4. 因此,Meda Source对象作为一个整体在整个视频流中进行更新
  5. 然而,最初附加到<视频>元素,假定它表示Media Source对象,保持不变

对我来说,这似乎没有多大意义。Blob URL被假定为表示从不更改的不可变数据块。但MSE似乎能够让它们代表一个可变的内存缓冲区。

这是如何在引擎盖下工作的?如果我们还想让blobURL代表一些可变的内存缓冲区,我们如何用javascript自己做到这一点?

您需要了解BlobURI并不表示任何数据。它们只是指向内存中某个资源的链接,就像字符串https://stackoverflow.com/questions/54613972本身不包含任何您正在读取的内容一样,它只是指向一条服务器指令,然后该指令将生成页面。

它们的链接可以说是不可变的,一旦使用URL.createObjectURL(target)生成它,就不能更改它的target,就像使用const关键字一样。

const foo = {}为例,现在不能将foo设置为除此对象之外的其他对象但是foo地址指向的对象仍然是可变的。CCD_ 8仍然可以完成。

const foo = {};
try{
foo = 'fails';
}
catch(e) {
console.error(e);
}
foo.mutable = true;
console.log(foo);

对于blobURI来说,这是一样的。blobURI指向一个target对象,这个链接不能更改,但target仍然是可变的。MediaSource对象也是如此,但其他对象也是如此。

如果你还记得几年前,我们仍然能够为MediaStreams使用blobURI(这是一个坏主意),这是同一个过程,blobURI以不可变的方式指向MediaStream对象,但媒体数据不断变化(流)。

即使对于文件,你也可以在硬盘上有一个指向文件的blobURI,这不会阻止你将其从硬盘中删除,即使blobURI现在不再指向任何地方。

这方面的一个特殊情况是Blob的情况,它是从内存中的数据(即,不仅仅是指向磁盘上文件的指针)生成的。这里Blob所持有的数据是不可变的,所以在这种情况下,blobURI确实指向了一个持有不可变数据的对象。

如果您请求有一个指向内存中存储的一些数据的blobURI,但仍然能够修改这些数据,这是不可能的
这是因为这个场景意味着您使用内存中的数据从Blob对象创建了您的blobURI,而内存再次将数据保持在不可变的状态。

用于MediaSourceBlob URL是一种特殊情况。MediaSource是一种特殊情况。

的概念

Blob URL被认为代表从不可变的数据块更改。

不一定是真的。例如,考虑一个包含HTML和JavaScript的Blob URL。可以从原始Blob URL生成进一步的数据,包括额外的Blob URLs。

最新更新