【问题标题】:How to write .wav file from blob in Javascript/Node如何在 Javascript/Node 中从 blob 写入 .wav 文件
【发布时间】:2017-01-16 15:18:22
【问题描述】:

我正在尝试使用 fs.writeFile 编写一个 .wav 文件。文件创建成功,但它只有 8-13 字节长,所以显然我做的不对。

如果 blob 已经是音频/wav,我可以写入磁盘还是需要将其转换为 Base 64?

我在这里几乎不知所措,我发现另一个没有答案的类似帖子 - Here

我们将不胜感激。

routerApp.controller('audiotest', function($scope) {
 $scope.saveToDisk = function(){
  var nw = require('nw.gui');
  var fs = require('fs');
  var path = require('path');
  fs.writeFileSync('test.wav', $scope.recordedInput)
 };
}

console.log($scope.recordedInput) 返回Blob {size: 294956, type: "audio/wav"}

这不是很相关,但这是我的 HTML

<div class="row" ng-controller="audiotest">
<div class="row">
    <button type="button" ng-click="saveToDisk()"> Write this sucker to disk </button>
    </div>

<ng-audio-recorder id='audioInput' audio-model='recordedInput'>
  <!-- Start controls, exposed via recorder-->
  <div ng-if="recorder.isAvailable">
    <button ng-click="recorder.startRecord()" type="button" ng-disabled="recorder.status.isRecording">
        Start Record
    </button>
    <button ng-click="recorder.stopRecord()" type="button" ng-disabled="recorder.status.isRecording === false">
        Stop Record
    </button>

</ng-audio-recorder>
</div>

【问题讨论】:

    标签: javascript node.js audio base64 node-webkit


    【解决方案1】:

    您可以将 Blob 转换为 Typed Array,然后转换为 Buffer 以直接传递给fs.writeFileSync()

    var fileReader = new FileReader();
    fileReader.onload = function() {
      fs.writeFileSync('test.wav', Buffer.from(new Uint8Array(this.result)));
    };
    fileReader.readAsArrayBuffer($scope.recordedInput);
    

    【讨论】:

    • 我绝对不明白你在这里做什么,但无论如何我得到一个未捕获的 TypeError buffer.js:259 Uncaught TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.
    • console.log(this.result) 在回调中显示什么?
    • [object ArrayBuffer]
    • 好的,那应该没有问题。你用的是什么版本的 nw.js?
    • 版本为0.16.0
    【解决方案2】:

    使用 mscdex 答案。

    当我使用 NodeWebkit 作为浏览器时,这对我有用。

    var fileReader = new FileReader();
    fileReader.onload = function () {
           fs.writeFileSync('test.wav', Buffer(new Uint8Array(this.result)));
    };
    fileReader.readAsArrayBuffer(blob);
    

    注意 Buffer 的“from”方法已经消失。最后一行中传递的“blob”是以 wav 编码的音频数据。
    其余的,它唯一的魔法。不要问我...

    【讨论】:

      【解决方案3】:

      我无法让其中任何一个为我工作。我找到了成功,并且使用此节点模块express-fileupload 更容易实现。这是一些代码:

      var express = require('express');
      var fileUpload = require('express-fileupload');
      
      app.use(fileUpload());
      
      app.post('/', function(req, res) {
      
      
        console.log(req.files.data);
        req.files.data.mv('test.wav', function(err) {
          if (err) {
            console.log(err);
          }
        });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-14
        • 2021-09-06
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        • 2012-03-31
        • 2018-08-13
        相关资源
        最近更新 更多