DataURL中的解码二进制音频未正确写入.mp3文件

时间:2017-11-19 21:43:02

标签: javascript ruby base64 html5-audio getusermedia

我使用getUserMedia API允许用户在客户端上录制短音频片段。完成录制后,我初始化FileReader,从所有音频块创建一个Blob,并将该blob的读取器作为DataURL读取。它会作为Text添加到Web表单中,然后发送到Rails5 API,我很难将二进制音频转换为工作的.mp3文件。

代码如下所示:

当录音机变为非活动状态时,会收集这些块并用于实例化一个类型为' audio / mpeg'的新Blob。

  var chunks = [];
  if (recorder.state == 'inactive') {
    var blob = new Blob(chunks, { type: 'audio/mpeg' });
    App.mediaStream.encodeBase64(blob);
  }

然后将Blob传递给创建base64编码的DataURL的函数。

  encodeBase64: function(blob) {
    var reader = new FileReader();
    reader.onloadend = function() { 
      App.mediaStream.appendToForm(reader.result);
    };
    reader.readAsDataURL(blob);
  },

读者的结果是遵循这种模式的dataURL,数据:[type]; base64,[data] - 所以它是一个看起来像的字符串:

"data:audio/mpeg;base64,GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQRChYECGFOAZwH/////////FUmpZpkq17GDD0JATYCGQ2hyb21lV0GGQ2hyb21lFlSua7uuudeBAXPFh+bmBbc......."

我将此DataURL附加到表单,该表单将其与其他一些数据一起发送到我的Rails 5 API。这是我遇到麻烦的地方。在服务器端,我有一个解析dataURL的ruby方法,并将其写入文件:

  def binary_to_audio_file(dataURL)
    data    = dataURL.split(',').last
    filename = SecureRandom.hex

    File.open("public/#{filename}.mp3", 'wb') do |f|
      f.write Base64.decode64(data)
    end
  end

这是在指定目录中成功创建一个新文件,该文件将已解码的音频二进制文件写入文件。该文件可以通过QuickTime,Itunes或任何其他媒体播放来打开。它甚至可以播放与录音持续时间相同的持续时间。但是,没有声音。

我保证我的发言人没有被关闭......有任何提示吗?

0 个答案:

没有答案