【问题标题】:Save Blob with multible file streams?用多个文件流保存 Blob?
【发布时间】:2021-05-18 06:36:21
【问题描述】:

我有两个 Uint8Array。第一个包含视频,第二个包含音频数据。 现在,我使用 blob 保存它们。我很难找到关于如何将它们保存在一个文件中的任何解释。

有人可以提供代码示例吗?

谢谢

编辑:评论 Matt Ellens 请求我搬到这里以获得更好的可读性 不幸的是没有。我尝试自己组装一个函数。

var blob1 = new Blob([arrayConcat(video)], {
    type: 'application/octet-stream'
});
var blob2 = new Blob([arrayConcat(audio)], {
    type: 'application/octet-stream'
});
stream = new MediaStream();
stream.addTrack(arrayConcat(video));
stream.addTrack(arrayConcat(audio));
console.log(stream);

它总是说如果我想添加一个 Track,我需要一个 MediaStreamTrack。然后我搜索并找到了这个:Is there a way to create your own mediaStreamTrack using say, JSON objects?。 Tracks 似乎仅适用于网络摄像头和用户微,因为它们是由浏览器创建的。

【问题讨论】:

标签: javascript html concatenation filestream ffmpeg.js


【解决方案1】:

我认为您可以像这样组合两个缓冲区(我将假设您的媒体的 mime 类型):

let vidBlob = new Blob([videoData], {
    type: 'application/octet-stream'
});
let audBlob = new Blob([audioData], {
    type: 'application/octet-stream'
});

let medSrc = new MediaSource;

let audSrcBuf = medSrc.addSourceBuffer('audio/mpeg3');
audSrcBuf.addEventListener('updateend', function (_) 
{
  medSrc.endOfStream();

  let vidSrcBuf = medSrc.addSourceBuffer('video/mp4');
  vidSrcBuf.appendBuffer(vidBlob.arrayBuffer());

  vidSrcBuf.addEventListener('updateend', function (_) 
  {
    medSrc.endOfStream();

    let objURL = URL.createObjectURL(medSrc);

    // use the objURL to save the two streams.

  });
});



audSrcBuf.appendBuffer(audBlob.arrayBuffer());

【讨论】:

  • 感谢您的回答。我很抱歉,但我无法让它运行。我在 Firefox 中尝试过,但它不起作用,因为根据这个答案,Firefox 不支持 MediaSource。然后我尝试使用edge,这至少给了我一个不支持mp4的可用错误。我看到了一些 mp4 工作的例子。在前面提到的答案中写到我的文件需要特定的标题,但我不能保证这一点。有任何想法吗?答案:stackoverflow.com/a/23359329/11355399
  • 这很奇怪。 According to MDN Firefox 支持 MediaSource。我在这里盲目飞行,因为我没有两个数据数组可供使用。如果我有更多时间,我会更深入地了解。
  • firefox 的错误是,如果我尝试附加缓冲区,则表示媒体流元素不可用
猜你喜欢
  • 2020-11-12
  • 2014-07-11
  • 2019-02-15
  • 2018-04-20
  • 1970-01-01
  • 2018-06-11
  • 2023-04-08
  • 2020-02-11
  • 1970-01-01
相关资源
最近更新 更多