我使用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或任何其他媒体播放来打开。它甚至可以播放与录音持续时间相同的持续时间。但是,没有声音。
我保证我的发言人没有被关闭......有任何提示吗?