如果 Blob URL 是不可变的,Media Source Extension API 如何使用它们来流式传输视频?
If Blob URLs are immutable, how does Media Source Extension API use them to stream videos?
让我们从一个例子开始:
- 您访问 youtube.com,它使用媒体源扩展 (MSE) 和 HTML5 用于某些设备。
- MSE 用 blob URL 注入
- 在流式传输整个视频的过程中,您的浏览器进行多次网络调用以下载各种视频块,并将它们附加到 MSE 的 SourceBuffer
- 因此,Meda Source 对象作为一个整体在整个视频流中更新
- 但是,最初附加到
对我来说,这似乎没有多大意义。 Blob URL 被认为代表了永远不会改变的不可变数据块。但似乎 MSE 能够使它们代表可变的内存缓冲区。
这是如何工作的?如果我们还想让 blob URLs 代表一些可变的内存缓冲区,我们如何使用 javascript?
自己做到这一点
您需要了解 BlobURI 不代表任何数据。它们只是 links,指向内存中的一些资源,就像字符串 本身不包含任何你正在阅读的内容,它只是指向一个服务器指令,然后生成页面。
他们的link可以说是不可变的,一旦你用URL.createObjectURL(target)
生成了它,你就不能改变它的target
,就像你用[=14=一样]关键字。
例如 const foo = {}
现在 foo
不能设置为这个对象以外的东西。 但是 foo
地址指向的对象仍然是可变的。 foo.bar = 'baz'
还是可以的
const foo = {};
try{
foo = 'fails';
}
catch(e) {
console.error(e);
}
foo.mutable = true;
console.log(foo);
对于 blobURI 来说,它是一样的。 blobURI 指向一个 target
对象,这个 link 不能改变,但是 target
仍然是可变的。对于 MediaSource 对象和其他对象都是如此。
如果你还记得几年前,我们仍然可以对 MediaStreams 使用 blobURI(这是一个坏主意),这是相同的过程,blobURI 以不可改变的方式指向 MediaStream 对象,但媒体数据不断变化(流)。
即使对于文件,您也可以拥有指向硬盘驱动器上文件的 blobURI,这不会阻止您将其从 HDD 中删除,即使 blobURI 现在不再指向任何地方.
这方面的一个特殊情况是 Blob 的情况,它是从内存中的数据生成的(即不仅仅是指向磁盘上文件的指针)。这里 Blob 保存的数据是不可变的,所以在这种情况下,blobURI 确实指向一个保存不可变数据的对象。
而且你要求有一个 blobURI 指向一些存储在内存中的数据,但仍然能够修改这些数据,这是不可能的...
这是因为这种情况意味着您使用内存中的数据从 Blob 对象创建了 blobURI,这再次将数据保存在不可变状态。
用于MediaSource
的Blob URL
是一个特例。 MediaSource
是特例。
构想
Blob URLs are suppose to represent chunks of immutable data that never
changes.
不一定是真的。考虑一个包含 HTML 和 JavaScript 的 Blob URL
。可以从原始 Blob URL
生成更多数据,包括额外的 Blob URL
s.
让我们从一个例子开始:
- 您访问 youtube.com,它使用媒体源扩展 (MSE) 和 HTML5 用于某些设备。
- MSE 用 blob URL 注入
- 在流式传输整个视频的过程中,您的浏览器进行多次网络调用以下载各种视频块,并将它们附加到 MSE 的 SourceBuffer
- 因此,Meda Source 对象作为一个整体在整个视频流中更新
- 但是,最初附加到
对我来说,这似乎没有多大意义。 Blob URL 被认为代表了永远不会改变的不可变数据块。但似乎 MSE 能够使它们代表可变的内存缓冲区。
这是如何工作的?如果我们还想让 blob URLs 代表一些可变的内存缓冲区,我们如何使用 javascript?
自己做到这一点您需要了解 BlobURI 不代表任何数据。它们只是 links,指向内存中的一些资源,就像字符串
他们的link可以说是不可变的,一旦你用URL.createObjectURL(target)
生成了它,你就不能改变它的target
,就像你用[=14=一样]关键字。
例如 const foo = {}
现在 foo
不能设置为这个对象以外的东西。 但是 foo
地址指向的对象仍然是可变的。 foo.bar = 'baz'
还是可以的
const foo = {};
try{
foo = 'fails';
}
catch(e) {
console.error(e);
}
foo.mutable = true;
console.log(foo);
对于 blobURI 来说,它是一样的。 blobURI 指向一个 target
对象,这个 link 不能改变,但是 target
仍然是可变的。对于 MediaSource 对象和其他对象都是如此。
如果你还记得几年前,我们仍然可以对 MediaStreams 使用 blobURI(这是一个坏主意),这是相同的过程,blobURI 以不可改变的方式指向 MediaStream 对象,但媒体数据不断变化(流)。
即使对于文件,您也可以拥有指向硬盘驱动器上文件的 blobURI,这不会阻止您将其从 HDD 中删除,即使 blobURI 现在不再指向任何地方.
这方面的一个特殊情况是 Blob 的情况,它是从内存中的数据生成的(即不仅仅是指向磁盘上文件的指针)。这里 Blob 保存的数据是不可变的,所以在这种情况下,blobURI 确实指向一个保存不可变数据的对象。
而且你要求有一个 blobURI 指向一些存储在内存中的数据,但仍然能够修改这些数据,这是不可能的...
这是因为这种情况意味着您使用内存中的数据从 Blob 对象创建了 blobURI,这再次将数据保存在不可变状态。
用于MediaSource
的Blob URL
是一个特例。 MediaSource
是特例。
构想
Blob URLs are suppose to represent chunks of immutable data that never changes.
不一定是真的。考虑一个包含 HTML 和 JavaScript 的 Blob URL
。可以从原始 Blob URL
生成更多数据,包括额外的 Blob URL
s.