【问题标题】:Why can't a blob url be shared by two video elements?为什么两个视频元素不能共享一个 blob url?
【发布时间】:2021-08-16 22:58:44
【问题描述】:

我正在开发 Firefox 扩展程序,我希望能够加载我创建并插入页面的视频元素,并加载与在 Odysee 页面上播放的主视频相同的内容。 Odysee 页面中视频的 src url 是一个 Blob,类似于:blob:https://odysee.com/0f30d1d7-af80-9243-9ea1-52c5492ead50

我通过简单地尝试过:

myVideoPlayer.src = odyseeVideoPlayer.src;

但它不起作用,在我的播放器上出现“没有找到支持格式和 MIME 类型的视频”错误。

从我对使用 blob url 所做的研究中,我了解到 Blob 实际上只是一个对象,其中包含存储在浏览器内存中的视频(在本例中)的原始数据。 (对于 blob url 包含带有域的 http 协议这一事实,我有点困惑,但从我所阅读的内容来看,这并没有改变 blob 存储在本地的事实。)

我不明白为什么使用相同 src url 的两个视频元素不会同时播放该文件,因为似乎该 url 指向内存中的同一个 Blob。我已经搜索并阅读了许多关于将 blob 用于视频元素 src 的 SO 和 SE 问题,但没有人回答这个问题。

【问题讨论】:

  • “我正在开发 Firefox 扩展” 从未尝试过,所以您告诉我:在您的代码中,您是否可以将文本文件的内容读入变量(eg: 类型为 String 或类型 Buffer Array)?
  • @VC.One FF 扩展是沙盒化的,因此您仅限于页面上可以访问的内容(请参阅我的 cmets 中的更详细说明),但要给出完整的答案,技术上,应该可以使用 Native Messaging(一个 FF 扩展 API)通过外部应用程序下载脚本并将其读入扩展的内容脚本,但这非常笨拙,需要用户安装其他软件,许多用户不会这样做,所以我避免这样做。
  • ...我真的很困惑为什么我不能做像 myVideoPlayer.src = odyseeVideoPlayer.src 这样简单的事情。如果 src 是 contentUrl(例如指向视频流),这可以工作,但如果 src 是 blob,为什么它不起作用?直觉上看起来应该没有区别。

标签: html5-video blob


【解决方案1】:

“对于 blob url 包含带有域的 HTTP 协议这一事实,我有点困惑,但根据研究,这并没有 改变 blob 存储在本地的事实"

关于上述问题...

我查看了这个video,其中包含一个视频 src 作为 blob url。

当您查看开发工具网络面板时,您会看到对 blob url 的响应不是二进制数据,而是 javascript。

这是一个自执行的 js 函数,看起来像,用来设置一个hls video stream

当您点击播放按钮时,您还可以看到以下请求:

https://watchman.na-backend.odysee.com/reports/playback 

使用以下(示例)有效负载:

{
    device: "web"
    duration: 866
    player: "eu-p1"
    position: 1000
    protocol: "hls"
    rebuf_count: 0
    rebuf_duration: 0
    rel_position: 0
    url: "@LittleApostate#5/trust-the-experts,-even-though-the#1"
    user_id: "213731445"
}

这也表明视频是 hls 流。

您可以使用 videojs(一个 js 视频播放器)和 hls 看到相同的行为。

一个example page,其中代码未缩小。

【讨论】:

  • 谢谢。在您的回答中,我不清楚为什么在同一页面上使用 2 个不同的视频播放器,如果它们的 src 属性相同,它们就不能同时播放相同的内容。一个会播放它,但另一个不会。
  • 再次查看您的答案,我猜您正在处理我的评论,“我对 blob url 包含带有域的 http 协议这一事实感到有些困惑”
【解决方案2】:

...Odysee 页面中视频的 src url 是一个 Blob,类似于:
blob:https://odysee.com/0f30d1d7-af80-9243-9ea1-52c5492ead50

我已经尝试过这样做了:

myVideoPlayer.src = odyseeVideoPlayer.src;

但它不起作用,在我的播放器上出现“没有找到支持格式和 MIME 类型的视频”错误。

我发现的唯一有效的视频流链接位于页面的源代码本身(例如:不像blob强>对象)。 URL 位于"contentUrl" 部分。解决方案是读取该信息,然后用于视频元素的.src

例如:https://odysee.com/@MovieGasm:d/the-vault-official-trailer-2-(2021):d

你可以看到...

"contentUrl": "https://odysee.com/$/stream/the-vault-official-trailer-2-(2021)/df2442ea839b5d0b98728a663a255121c92cd228

所以在视频元素“src”中使用该 contentURL 的代码...

//# using same url as "odyseeVideoPlayer.src;"...
myVideoPlayer.src = "https://odysee.com/$/stream/the-vault-official-trailer-2-(2021)/df2442ea839b5d0b98728a663a255121c92cd228";

PS
正如您在源代码中看到的,他们将contentURL 放入<script type="application/ld+json"> 不幸的是,它没有元素 id,因此您无法使用 this method 或类似的 Answer on S.O 读取它。

解决方案
如果您能找到访问该数据块的方法,请使用它,否则您必须将页面 URL 读入一些 String 变量并使用 String 函数来提取所需的文本。

【讨论】:

  • 有用的信息,但这仍然不能回答我的问题:“我不明白为什么使用相同 src url 的两个视频元素不会同时播放该文件,因为似乎 url 指向内存中的同一个 Blob。”如果我可以使用这个解决方案会很好,但是在 FF 扩展中,内容脚本无法访问页面的 JS、DOM 元素及其属性和属性。所以 AFAICT,我无法访问 contentUrl。
  • 我实际上可以在内容脚本中获取对脚本元素的引用,但除此之外,我什至无法读取脚本元素的 textContent 或 innerHTML。我知道出于安全原因,扩展 JS 沙箱很重要。因此,虽然您的回答对浏览器的开发人员工具很有用,但我无法使用浏览器扩展来实现它。因此,我的问题的重点是如何使用原始视频播放器的 blob 加载我的播放器,因为我只能访问 video.src 属性。
  • 在我的第一条评论中:“但在 FF 扩展中,内容脚本无法访问页面的 JS、DOM 元素及其属性和属性。”应该是“但在 FF 扩展中,内容脚本无法访问页面的 JS,只有 DOM 元素及其属性和属性。”
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2015-11-26
  • 2016-11-15
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多