【问题标题】:javascript can't find blobjavascript找不到blob
【发布时间】:2020-01-04 14:22:30
【问题描述】:

所以我知道 blob 仅在创建它们的选项卡中可用,但不知何故我收到一条错误消息,指出找不到 blob。我在哪里尝试都没关系。

例如 YouTube 视频是 blob,我可以使用它获取它的对象 URL

document.getElementsByTagName('video')[0].currentSrc /// => 'blob:http://youtube.com/asddasd-asdasd-asdasd-asddsa'

现在,如果我尝试获取 blob

fetch(url)

我收到一个找不到 blob 的错误。

【问题讨论】:

  • 也许 blob 不再可用,youtube 一次下载小块视频,每个块都是不同的 blob。

标签: javascript web html5-video blob fetch-api


【解决方案1】:

Youtube 视频 blobURI 不是指向 Blob,而是指向 MediaSources

Blob 不是我们可以使用 URL.createObjectURL() 方法指向的唯一对象,我们过去也可以传递 MediaStreams,更重要的是,我们仍然可以传递 MediaSource 对象。

const source = new MediaSource();
const url = URL.createObjectURL( source ); // this doesn't throw
console.log( url ); // that's a valid blob URI

fetch( url ).catch( console.error ); // nothing to fetch there

YouTube 确实以 ArrayBuffers 的形式获取数据,然后使用该数据填充 MediaSource。

本机无法从 blobURI 中检索原始 MediaSource,即使 we can override URL.createObjectURL 将其取回,我们也无法检索传递给 MediaSource 的实际数据...

【讨论】:

    【解决方案2】:

    我认为您应该先使用标准 URL 获取,然后指示它应该被解释为 blob。

    const url = "http://youtube.com/asddasd-asdasd-asdasd-asddsa"
    fetch(url)
      .then(response => response.blob())
      .then(console.log)
    

    但您在获取 youtube 时可能会遇到一些 CORS 问题!

    【讨论】:

    • 如果我使用“blob:”执行此操作,则会收到“ERR_FILE_NOT_FOUND”错误。如果我在没有“blob:”的情况下执行此操作,我会收到 404 错误。
    • @Mointy 您可以查看 DevTools 的 Network 选项卡以获取有关请求失败原因的更多信息吗?
    • 这是一张带有和不带有“blob”的请求的图片:ibb.co/xHGYG6Y, ibb.co/ydWbK5V
    • blob: 协议不是 supported by all browsers 并且在请求跨源资源时似乎被禁止 (?)。
    • 因为我在浏览器扩展的内容脚本中使用了它,所以它应该可以工作。内容脚本直接注入站点,不存在跨域问题。我将在谷歌浏览器中尝试它,我使用的是带有铬引擎的边缘(这意味着它应该仍然可以工作)......
    猜你喜欢
    • 2014-06-02
    • 2020-06-09
    • 2019-01-09
    • 1970-01-01
    • 2017-11-21
    • 2011-04-28
    • 1970-01-01
    • 2013-03-19
    • 2016-07-02
    相关资源
    最近更新 更多