让我们从一个例子开始:
- 您访问 youtube.com,该网站在某些设备上使用带有 HTML5 的媒体源扩展 (MSE)。
- MSE 使用 blob URL 注入
- 在流式传输整个视频的过程中,您的浏览器会进行多次网络调用来下载各个视频块,并将它们附加到 MSE 的 SourceBuffer
- 因此,Meda Source 对象作为一个整体在整个视频流中更新
- 但是,最初附加到
对我来说,这似乎没有多大意义。 Blob URL 应该代表永远不会改变的不可变数据块。但 MSE 似乎能够使它们代表一个可变的内存缓冲区。
这在幕后是如何工作的?如果我们还想让 blob URL 代表一些可变的内存缓冲区,我们如何使用 javascript 自己做到这一点?
您需要了解 BlobURI不代表任何数据。它们只是链接,指向内存中的某些资源,就像字符串一样https://stackoverflow.com/questions/54613972
本身不包含您正在阅读的任何内容,它只是指向随后将生成页面的服务器指令。
一旦您使用生成链接,它们的链接就可以说是不可变的URL.createObjectURL(target)
,你不能改变它的target
,就像你使用const
关键词。
举个例子const foo = {}
now foo
不能设置为该对象以外的其他对象。But所指向的对象foo
地址仍然是可变的。foo.bar = 'baz'
还是可以做的。
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 对象,但是 media-数据不断变化(流)。
即使对于文件,您也可以拥有一个指向硬盘驱动器上的文件的 blobURI,这不会阻止您从 HDD 中删除它,即使 blobURI 现在不再指向任何地方。
与此相关的一个特殊情况是 Blob 的情况,它是从内存中的数据生成的(即不仅仅是指向磁盘上文件的指针)。这里 Blob 保存的数据是不可变的,因此在这种情况下,blobURI 确实指向一个保存不可变数据的对象。
对于您请求有一个指向内存中存储的某些数据的 blobURI,但仍然能够修改这些数据,这是无法完成的......
这是因为此场景意味着您使用内存中的数据从 Blob 对象创建了 blobURI,这再次将数据保持在不可变状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)