【问题标题】:How to pipe a readable stream into a URL.createObjectURL without waiting for the whole file?如何在不等待整个文件的情况下将可读流通过管道传输到 URL.createObjectURL?
【发布时间】:2019-02-07 00:21:54
【问题描述】:

我知道使用 mediaSource 是可行的,但媒体源不支持所有视频格式(例如碎片化的 mp4)。这是一个问题,因为我的应用程序没有可以修复文件的服务器。它只是一个客户端应用程序。

const blob = await ipfs.getBlobFromStream(hash)

const url = URL.createObjectURL(blob)

this.setState({...this.state, videoSrc: url})

const getBlobFromStream = async (hash) => {

  return new Promise(async resolve => {

    let entireBuffer

    const s = await stream(hash)
    s.on('data', buffer => {

      console.log(buffer)

      if (!entireBuffer) {
        entireBuffer = buffer
      }
      else {
        entireBuffer = concatTypedArrays(entireBuffer, buffer)
      }

    })

    s.on('end', () => {

      const arrayBuffer = typedArrayToArrayBuffer(entireBuffer)
      const blob = new Blob(arrayBuffer)
      resolve(blob)
    })

  })

}

这是我现在正在使用的代码,它基本上等待整个文件并将其放入单个数组中,然后放入 blob,然后放入 URL.createObjectURL

【问题讨论】:

  • 你想达到什么目的?在第一个缓冲区到达时开始播放视频?还要在每个传入的缓冲区 blob url 上创建并将该 url 传递到视频元素中?
  • hash 变量包含什么? stream 函数是库吗?能否请您提供更多详细信息,谢谢。
  • @Bitcollage 我希望视频在下载整个缓冲区之前开始播放。我希望它像在 youtube 上一样“缓冲”或“流式传输”。哈希是 IPFS infoHash。这是我围绕这个方法制作的包装函数github.com/ipfs/interface-ipfs-core/blob/master/SPEC/…

标签: javascript ipfs


【解决方案1】:

你可以在重构你的代码时做到这一点:

await ipfs.startBlobStreaming(hash);
this.setState({...this.state, videoComplete: true});

const startBlobStreaming = async (hash) => {
  return new Promise(async (resolve) => {

    let entireBuffer;
    const s = await stream(hash);
    s.on('data', buffer => {
      if (!entireBuffer) {
        entireBuffer = buffer;
      } else {
        entireBuffer = concatTypedArrays(entireBuffer, buffer);
      }
      const arrayBuffer = typedArrayToArrayBuffer(entireBuffer);
      const blob = new Blob(arrayBuffer);
      const url = URL.createObjectURL(blob);
      this.setState({...this.state, videoSrc: url});

    });
    s.on('end', _ => resolve())
  });
}

我不知道缓冲区进入s.on 的强度有多大,但您也可以在特定时间(例如 1000 毫秒)收集一定量的缓冲区,然后创建 blob url。

【讨论】:

  • 我已经测试过这种方法,但由于某种原因,除非有整个缓冲区,否则视频无法播放。好像从不完整的缓冲区创建 ObjectURLSource 不会产生可播放的视频。此外,即使它确实有效,该方法不会在每次反应更新时重新启动视频吗?
  • 我检查了 youtube 是如何工作的。 blob url 始终相同:blob:https://www.youtube.com/e07d4e7f-0031-4354-9425-d08aa5d59a1e 当缓冲区块到达时。我猜它是如何工作的。我认为您必须找到一种方法来将传入缓冲区保存在同一个 blob url 中。
  • 无法追加到 blob。
猜你喜欢
  • 2018-06-04
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
相关资源
最近更新 更多