Javascript 如何在不等待整个文件的情况下将可读流导入URL.createObjectURL?

Javascript 如何在不等待整个文件的情况下将可读流导入URL.createObjectURL?,javascript,ipfs,Javascript,Ipfs,我知道使用mediaSource是可行的,但mediaSource不支持所有的视频格式(例如碎片mp4)。这是一个问题,因为我的应用程序没有可以修复文件的服务器。它只是一个客户端应用程序 const blob = await ipfs.getBlobFromStream(hash) const url = URL.createObjectURL(blob) this.setState({...this.state, videoSrc: url}) const getBlobFromStre

我知道使用mediaSource是可行的,但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

您可以通过重新构造代码来执行此操作:

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。

您希望实现什么?要在第一个缓冲区到达时启动视频?还要在每个传入缓冲区blob url上创建url并将该url传递到视频元素中吗?什么包含
散列
变量?
函数是一个库吗?请您提供更多详细信息,谢谢。@Bitcollage我希望在下载整个缓冲区之前开始播放视频。我希望它像在youtube上一样“缓冲”或“流”。散列是IPFS信息散列。这是我围绕这个方法制作的一个包装函数,我已经测试过这个方法,但是由于某种原因,视频没有播放,除非它有整个缓冲区。好像从不完整的缓冲区创建ObjectURLSource不会产生可播放的视频。而且,即使它真的起作用了,这种方法不是每次更新都会重新启动视频吗?我检查了youtube的工作情况。blob url始终相同:
blob:https://www.youtube.com/e07d4e7f-0031-4354-9425-d08aa5d59a1e
当缓冲区块到达时。我猜它是怎么工作的。我认为您必须找到一种方法,如何将传入的缓冲区保存在同一个blob url中。无法附加到blob。