Chrome:播放通过 fetch/XHR 下载的视频

2023-11-24

我想要实现的是让 Chrome 将视频文件作为数据加载(通过 Fetch API、XHR 等)并使用<video>仍在下载文件时,无需对同一 URL 发出两个单独的请求,也无需等到文件完全下载。

很容易获得ReadableStream从获取 API (response.body),但我找不到一种方法将其输入video元素。我发现我需要一个blob可以使用以下命令创建此 URL:MediaSource目的。但是,那SourceBuffer#appendStream方法听起来正是需要的,但在 Chrome 中没有实现,所以我无法将流直接连接到MediaSource object.

我可能可以分块读取流,创建Uint8Arrays 出来,并使用SourceBuffer#appendBuffer,但这意味着除非块大小非常小,否则播放不会立即开始。而且感觉就像手动做一些所有这些 API 应该能够开箱即用的事情。如果没有其他解决方案,并且我这样做,我应该注意什么?

是否有其他方法可以为ReadableStream?或者有没有办法制作fetch and <video>分享一个请求?有太多新的 API,我很容易错过一些东西。


经过几个小时的实验,找到了一个半有效的解决方案:

const video = document.getElementById('audio');

const mediaSource = new MediaSource();

video.src = window.URL.createObjectURL(mediaSource);

mediaSource.addEventListener('sourceopen', async () => {

  const sourceBuffer = mediaSource.addSourceBuffer('audio/webm; codecs="opus"');

  const response = await fetch(audioSRC);

  const body = response.body

  const reader = body.getReader()

  let streamNotDone = true;

  while (streamNotDone) {

    const {value, done} = await reader.read();
    
    if (done) {streamNotDone = false; break;}
    
    await new Promise((resolve, reject) => {
      sourceBuffer.appendBuffer(value)

      sourceBuffer.onupdateend = (() => {
        resolve(true);
      })
    }) 

  }
});

它适用于https://developer.mozilla.org/en-US/docs/Web/API/MediaSource

另外,我仅使用 webm/opus 格式对此进行了测试,但我相信它也应该适用于其他格式只要你指定.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome:播放通过 fetch/XHR 下载的视频 的相关文章

随机推荐

  • 如何将任意选项字符串解析为Python字典

    我试图找到最 Pythonic 的方法来获取包含命令行选项的字符串 t 500 x c 3 d 并将其变成字典 t 500 x True c 3 d True UPDATE 字符串还应该能够包含 long 选项 以及中间带有破折号的单词 t
  • 是否有一种*干净的*方法可以使只读依赖属性反映另一个属性的值?

    下面的代码是我当前的解决方案 我试图模仿的一个很好的例子是 FrameworkElement ActualWidth 属性 您知道每当 Width 属性更改 或重新绘制控件或其他任何时候 如何计算和重新分配 ActualWidth 属性吗
  • 访问令牌的“无效签名”错误(Azure Active Directory / msal js)

    我使用 MSAL JS 来验证用户身份 然后调用 acquireTokenPopup scopes 来获取访问令牌 我正在获取访问令牌 但无法按照其说明使用它签名无效 也在 jwt io 中检查过 同样的错误 在论坛上我发现这是由于 Gra
  • python 将多行转换为单行

    我想将 Python 多行字符串转换为单行 如果我在 Vim 中打开字符串 我可以在每行的开头看到 M 如何处理字符串以使其全部位于一行中 并在每行之间使用制表符分隔 Vim 中的示例如下所示 Serialnumber MName Rick
  • 获取C中的当前时间[重复]

    这个问题在这里已经有答案了 我想获取系统的当前时间 为此 我在 C 中使用以下代码 time t now struct tm mytime localtime now if strftime buffer sizeof buffer X m
  • 如何使用匹配节点连接两个 XML 文件

    我需要找到一种方法 当两个 XML 文件具有匹配的节点时将它们连接起来 据我所知 这可以用许多不同的语言来完成 是否有 PHP 或 AJAX 方法来做到这一点 从 SO 上的其他帖子中我看到了 XSLT 解决方案 但我并没有真正理解 这是最
  • .NET 从 HTML 页面中删除/剥离 JavaScript 和 CSS 代码块

    我有带有 JavaScript 和 CSS 代码块的 HTML 字符串 如何剥离这些块 关于可用于删除这些的正则表达式有什么建议吗 快速的 n 脏方法将是一个像这样的正则表达式
  • 如何使用 Javascript 对 HTML 文档进行永久更改?

    我有一个简单的计数器代码 但所做的更改消失了 页面刷新后 为什么会发生这种情况 应该使用 PHP 来完成吗 如何更有效地编写这段代码 无论如何 这不是主要问题 var like document getElementById like im
  • 在另一个页面中获取magento会话变量

    我在 magento 模式页面的会话中设置数组变量 并希望在另一个页面 如 getuserdata php 中检索 但不进入另一个页面 我设置变量并进入一页 然后完全检索 我的代码就像 首页代码 session Mage getSingle
  • 我们有 Perl 中的 autochomp 吗?

    这就是我的 Perl 代码的样子监控 Unix 文件夹 usr bin perl use strict use warnings use File Spec Functions my date date chomp date my date
  • XCode 5 中的配置文件

    我今天开始使用 XCode 5 并在尝试归档一个项目以进行临时分发时发现 我看到的配置文件不包括我最近创建的配置文件 但确实包括我已删除的配置文件 我检查了我的管理器中该设备的配置文件列表 该列表没问题 并且包含我最近下载的配置文件 所以我
  • c#:将网页的html源代码读取为字符串[重复]

    这个问题在这里已经有答案了 我希望能够使用 winforms 将某个网页的 html 源读入 C 中的字符串 我该怎么做呢 string html new WebClient DownloadString http twitter com
  • ASP.NET 主题样式表渲染

    当呈现具有主题的页面时 给定主题中的样式表链接标记将呈现在结束头标记之前 有谁知道有什么方法可以改变这种情况吗 有没有办法让我可以将这些标签放置在起始头标签之后 我知道它可以通过jquery关闭 只需选择所有链接标签并将其放置在起始头标签之
  • 如何在groovy中合并两个地图

    问题 如何合并映射 同时求和映射之间公共键的值 Input a 10 b 2 c 3 b 3 c 2 d 5 Output a 10 b 5 c 5 d 5 扩展问题 如何通过对 2 个映射中的公共键的值应用函数 闭包 来合并原始的 2 个
  • 解组时未找到类:android.support.v7.widget.Toolbar$SavedState

    我正在使用 Maps API 创建一个简单的 Android 应用程序 但出现了一个我无法解决的奇怪错误 当我旋转设备时通常会发生这种情况 我正在使用谷歌服务8 4 0 4 23 15 39 47 503 9419 9419 com lic
  • 在 Ubuntu C++ 上找不到 gtk/gtk.h

    我对编程相当陌生 尤其是在涉及如何包含库和类似活动时 我过去曾使用 Python 进行过一些编程 并且一直使用 GTK 来创建窗口 这也是我在使用 C 编程时打算做的事情 首先 这是我的代码 include
  • VsTac 任务失败,使用全局 Cordova 工具集时找不到文件 appAsTgz.tgz

    当我使用全局安装的 Cordova 7 1 0 工具集并执行 iOS 远程构建 到模拟器或本地设备 时 我几乎立即收到错误消息 Error MSB4018 The VsTac task failed unexpectedly System
  • 积分推广与运营商+=

    我需要消除 gcc Wconversion 警告 例如 typedef unsigned short uint16 t uint16 t a 1 uint16 t b 2 b a gives warning conversion to ui
  • 使用 JQuery 禁用链接

    我有以下代码 其功能类似于 Stackoverflow 上评论链接的工作方式 单击时 它会触发 ActionResult 并填充 div function a id doneLink live click function event ma
  • Chrome:播放通过 fetch/XHR 下载的视频

    我想要实现的是让 Chrome 将视频文件作为数据加载 通过 Fetch API XHR 等 并使用