2

我正在使用 Recorder.js,它允许您像这样显示录音

recorder.exportWAV(function(blob) {
  var url = URL.createObjectURL(blob);
  var au = document.createElement('audio');
  au.controls = true;
  au.src = url;
}

但是如何将 blob 保存到数据库中呢?假设我有一个录音集合:

recorder.exportWAV(function(blob) {
  Recordings.insert({data: blob});
}

只会存储这个

{data: { "type" : "audio/wav", "size" : 704556 }}

没有实际内容。

4

2 回答 2

2

在观看 eventedmind.com 的文件上传片段后,原来这样做的方法是使用 FileReader 将 blob 读取为 ArrayBuffer,然后将其转换为 Uint8Array 以存储在 mongo 中:

var BinaryFileReader = {
  read: function(file, callback){
    var reader = new FileReader;

    var fileInfo = {
      name: file.name,
      type: file.type,
      size: file.size,
      file: null
    }

    reader.onload = function(){
      fileInfo.file = new Uint8Array(reader.result);
      callback(null, fileInfo);
    }
    reader.onerror = function(){
      callback(reader.error);
    }

    reader.readAsArrayBuffer(file);
  }
}

然后是 exportWAV 回调

recorder.exportWAV(function(blob) {
  BinaryFileReader.read(blob, function(err, fileInfo){
    Recordings.insert(fileInfo)
  });
});

然后我可以通过以下方式显示我的录音之一:

Deps.autorun(function(){
  var rec = Recordings.findOne();
  if (rec){
    var au = document.createElement('audio');    
    au.controls = true;
    var blob = new Blob([rec.file],{type: rec.type});
    au.src = URL.createObjectURL(blob);
    document.getElementById("recordingslist").appendChild(au);
  }
})

我不知道前面的代码片段是否适用于其他浏览器,但这可能:

var base64Data = btoa(String.fromCharCode.apply(null, rec.file))
var au = document.createElement('audio');
au.controls = true;
au.src = "data:"+rec.type+";base64,"+base64Data
于 2013-09-02T22:31:02.473 回答
0

以防万一,您是否注意到他们的示例中的这一行

确保您使用的是最新版本的 Google Chrome,目前这仅适用于 Google Chrome Canary。

我很快就需要为我自己的项目研究这个,希望你让它运行起来。

于 2013-09-01T09:54:21.800 回答