【问题标题】:Saving Huge Files保存大文件
【发布时间】:2016-03-30 18:37:19
【问题描述】:

我需要在 JS 中保存一个未知大小的文件,可能有数 GB。数据源是使用 mediarecorder 捕获的媒体流。

在 Chrome 中,这可以通过使用带有 filesystem: url 的文件系统和文件编写器 api 来完成,方法是在收到 blob 块时将它们写入文件条目,然后设置指向文件 url 的下载链接。

但是,我找不到在 Firefox 或 Edge 中执行此操作的方法(只要有 mediarecorder)。

【问题讨论】:

    标签: javascript html5-filesystem web-mediarecorder


    【解决方案1】:

    这在 Firefox 中适用于我:

    navigator.mediaDevices.getUserMedia({ video: true })
      .then(stream => record(stream, 5000)
        .then(recording => {
          stop(stream);
          video.src = link.href = URL.createObjectURL(new Blob(recording));
          link.download = "recording.webm";
          link.innerHTML = "Download blob";
          log("Playing "+ recording[0].type +" recording.");
        })
        .catch(log).then(() => stop(stream)))
      .catch(log);
    
    var record = (stream, ms) => {
      var rec = new MediaRecorder(stream), data = [];
      rec.ondataavailable = e => data.push(e.data);
      rec.start();
      log(rec.state + " for "+ (ms / 1000) +" seconds...");
      var stopped = new Promise((r, e) => (rec.onstop = r, rec.onerror = e));
      return Promise.all([stopped, wait(ms).then(() => rec.stop())])
        .then(() => data);
    };
    
    var stop = stream => stream.getTracks().forEach(track => track.stop());
    var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
    var log = msg => div.innerHTML += "<br>" + msg;
    <video id="video" height="120" width="160" autoplay></video>
    <a id="link"></a><br>
    <div id="div"></div>

    用户仍然需要点击下载链接。我还没有试验过文件可以有多大。

    【讨论】:

    • 您将文件名设置为recording.blob,但这是一个视频文件。文件类型是什么?如何播放?
    • @styfle 在 OSX 上运行这个 sn-p 后,ffmpeg 说下载的文件是一个“matroska webm”媒体格式文件,里面有一个 vp8、yuv420p、640x480 视频轨道。我已将示例中的扩展名从 .blob 更改为 .webm,它在 Firefox 和 Chrome 中作为文件 URL 对我来说很好,例如file:///Users/Foo/recording.webm.
    猜你喜欢
    • 2020-11-07
    • 2018-04-15
    • 2016-08-17
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多