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

Javascript 如果Blob URL是不可变的,媒体源扩展API如何使用它们来流式传输视频?,javascript,html,browser,media-source,Javascript,Html,Browser,Media Source,让我们从一个例子开始: 您可以访问youtube.com,它将媒体源扩展(MSE)与HTML5一起用于某些设备 MSE使用blob URL注入标记。它看起来是这样的:blob:“ 在整个视频流中,您的浏览器会进行多个网络调用以下载不同的视频块,并将其附加到MSE的SourceBuffer中 因此,Meda源对象作为一个整体在整个视频流中更新 但是,最初附加到元素的blob URL(假定它代表媒体源对象)保持不变 对我来说,这似乎没有多大意义。Blob URL被假定为表示永不改变的不可变数据块。但

让我们从一个例子开始:

  • 您可以访问youtube.com,它将媒体源扩展(MSE)与HTML5一起用于某些设备
  • MSE使用blob URL注入标记。它看起来是这样的:blob:“
  • 在整个视频流中,您的浏览器会进行多个网络调用以下载不同的视频块,并将其附加到MSE的SourceBuffer中
  • 因此,Meda源对象作为一个整体在整个视频流中更新
  • 但是,最初附加到元素的blob URL(假定它代表媒体源对象)保持不变
  • 对我来说,这似乎没有多大意义。Blob URL被假定为表示永不改变的不可变数据块。但MSE似乎能够使它们表示可变的内存缓冲区


    这在后台是如何工作的?如果我们还想让blob URL表示一些可变的内存缓冲区,我们自己如何使用javascript实现这一点?

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

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

    例如,
    const foo={}
    现在不能将
    foo
    设置为此对象以外的其他对象。但是
    foo
    地址指向的对象仍然是可变的。
    foo.bar='baz'
    仍然可以执行

    constfoo={};
    试一试{
    foo='失败';
    }
    捕获(e){
    控制台错误(e);
    }
    foo.mutable=true;
    
    console.log(foo);
    用于
    MediaSource
    Blob URL
    是一个特例。
    MediaSource
    是一个特例

    这个概念

    Blob URL被假定为表示不可更改的数据块 变化


    不一定是真的。考虑一个包含“HTML”和“JavaScript”的<代码> BLB URL>代码。可以从原始的<代码> BLB URL < /代码>中生成更多的数据,包括附加的<代码> BLB URL< /COD> S.< /P>。实际上,BoLBIS的BLUBs对于OP来说是特别的。我不确定您对“代码”的意思。从原始Blob URL生成,包括其他Blob URL。blobURI只指向某些资源,以后对它所做的任何事情都不能说是blobURI的事实。当我从blobURI加载mp3时,在我的计算机中唱歌的不是blobURI,就像它也不是URL一样。@Kaido是的,sp特殊情况。如果开发

    MediaSource
    的组的源代码和严格参数,以及与
    Blob
    使用相关的问题,以及规范经过审查,可以变得更清楚。是的,可以说,进一步过程的起源是在初始
    Blob URL
    Blob URI
    中>。很抱歉,我不理解你的评论……我的观点是Blob在这里是特殊的,因为只有Blob保存不可变的数据。磁盘上的文件、MediaStream或MediaSource都没有这种特殊性。所以Blob是这里的特例。@Kaido不确定你要传达什么。数据不是“不可变的”“。如果有足够的动机,可以在磁盘上修改
    blobURL
    s指向的数据。另外,
    bloburl
    还可以动态生成额外的进程,其中派生的进程不是不可变的,因此
    bloburl
    本身也不是不可变的。在
    MediaSource
    的情况下,
    blobURL
    blobURI
    的行为与
    blobURL
    的行为特别不同,后者与
    MediaSource
    没有关联,尤其是在Chrome/Chrome浏览器实现中。blobURL本身只是一个字符串。。。此字符串指向内存中的某个对象,此链接无法修改=>它是“不可变的”。现在,由内存中的数据生成的Blob(比如
    newblob(['foo bar]])
    )以一种不变的方式将其数据固定在内存中:在生成Blob之后,任何web API都无法修改此数据(例如,arraybuffer是可变的)。我停留在web API领域,问题是标记为js和浏览器。“这是不可能的。”从技术上讲,它可以通过web API@guest271314“这是不可能的”。。。很明显,你可以把你的电脑扔进火里……是的,你已经烧了好几次了。是
    MediaSource
    中的一个bug示例。这是一个特例,在Mozilla和Chromium实现之间有明显的行为差异。也许是因为C++中的底层媒体播放器播放媒体,但在执行中仍然是可观察到的bug。当然,这个对象是特殊的,可能有特殊的bug,但是这根本不与当前的问题有关,也不与Bulburi……不一致。问题本质上是
    MediaSource
    如何工作。这需要相当多的努力来收集。这并不像解释
    bloburl
    s与
    bloburi
    s的不同或相同那样简单。阅读以前和当前的规范、开放和关闭的问题、邮件列表。项目历史。实际上,在不同的浏览器上运行代码,可以说,这是“橡胶遇到道路的地方”。在一个无bug的实现中,bug并不重要。当Bug使浏览器选项卡崩溃且未修复时,可能会出现系统性问题,这些问题可能不会立即在浏览器中显现出来