【发布时间】:2020-02-05 20:33:21
【问题描述】:
从 Chrome 80 开始,Blob 或 IndexedDB 的工作方式似乎发生了一些变化。
将视频文件作为 blob 加载并通过 createObjectURL 将其分配给 HTML5 Video 元素,仍然有效:
// load the blob through XMLHttprequest
RequestAsBlob("https://devserver/some-video.mp4",
function(blob)
{
video.src = URL.createObjectURL(blob);
// same above, video.src is now "blob:https://devserver/36e15718-e597-4859-95d3-6bc39daaa999"
}
video.play();
输出:承诺{} 而且视频播放得很好。
检查 blob,它看起来像这样:
Blob {size: 6752122, type: "video/mp4"}
size: 6752122
type: "video/mp4"
__proto__: Blob
arrayBuffer: ƒ arrayBuffer()
size: (...)
slice: ƒ slice()
stream: ƒ stream()
text: ƒ text()
type: (...)
constructor: ƒ Blob()
Symbol(Symbol.toStringTag): "Blob"
get size: ƒ size()
get type: ƒ type()
__proto__: Object
我曾经将 blob 存储到 IndexedDB(通过 LocalForage),然后检索它并播放它,如下所示。这个,不再
// blob is a blob fetched from indexedDB
video.src = URL.createObjectURL(blob);
// video.src is now something like this:
// "blob:https://devserver/ec5e1dfe-0884-40e2-ae8c-c6062734d297"
video.play();
检查检索到的 blob,它看起来与 XMLHttpRequest 返回的一模一样
但是,它不起作用:
输出:Uncaught (in promise) DOMException: The element has no supported sources.
我不知道是什么改变打破了以前的工作方式。 它变得更奇怪了:
如果我得到存储的 blob,显然不能再直接分配给视频 src 的 blob,我会这样做...
var url = URL.createObjectURL(cachedblob);
RequestAsBlob(url,
function(blob)
{
var url = URL.createObjectURL(blob);
video.src = url;
video.play();
}
这行得通!我正在引用一个存储在 indexedDB 中的 blob,为它创建一个 url,通过 XMLHttpRequest 再次加载它,就像它实际上在某个远程位置一样,再次将它作为 blob 接收......并再次创建一个 URL ...而且它有效。
这毫无意义。 我希望有人能对此有所了解。
【问题讨论】:
-
我为同一问题提交的一个 chrome 错误:bugs.chromium.org/p/chromium/issues/detail?id=1055910(它最终成为你的半副本)
标签: javascript blob indexeddb