我正在使用Recorder.js錄製來自麥克風的音頻。該庫可以將PCM數據編碼爲WAV,我可以使用<audio>
成功播放該數據。但是,由此產生的WAV數據過於龐大(5分鐘記錄約爲38MB)。我嘗試使用從Speech-to-Server可用的libmp3lame.js。如何在PCM中將PCM數據編碼爲MP3?
在recorderWorker.js
,我導入拉梅腳本:
importScripts("libmp3lame.js");
然後,我改變了exportWAV()
功能編碼PCM緩衝區到MP3,而不是WAV。在bufferL
Uncaught RangeError: Invalid array buffer length
這裏PCM數據和bufferR
是Float32Array:
function exportWAV(type){
var bufferL = mergeBuffers(recBuffersL, recLength);
var bufferR = mergeBuffers(recBuffersR, recLength);
//var interleaved = interleave(bufferL, bufferR);
console.log("Start MP3 encoding");
var mp3codec = Lame.init();
Lame.set_mode(mp3codec, Lame.JOINT_STEREO);
Lame.set_num_channels(mp3codec, 2);
Lame.set_out_samplerate(mp3codec, sampleRate);
Lame.set_bitrate(mp3codec, 128);
Lame.init_params(mp3codec);
var mp3data = Lame.encode_buffer_ieee_float(mp3codec, bufferL, bufferR);
audioBlob = new Blob([mp3data.data], { type: "audio/mp3" });
console.log("Done MP3 encoding");
this.postMessage(audioBlob);
}
但是,該Lame.encode_buffer_ieee_float
方法是拋出這個錯誤。我無法找到Lame.encode_buffer_ieee_float預期輸入的內容。
的違規行Lame.encode_buffer_ieee_float
所引發錯誤是:
var arraybuf = new ArrayBuffer(nread);
我把一個斷點,並檢查了nread
值。它是-1。
所以,我的問題是如何在這種情況下使用Lame MP3 JavaScript庫?謝謝。
NREAD是-1。對不起,我應該在帖子中說過。現在編輯它。 – RajV
我通過了蹩腳的C源代碼,並將問題追蹤到發送到lame_encode_buffer_ieee_float的緩衝區大小非常小。我通過將BUFSIZE設置爲channel_l.length * 4來解決問題。現在,編碼適用於短音頻剪輯。但是,對於較大的剪輯再次失敗。 – RajV
你是怎麼結束了這個,因爲我正在考慮錄製MP3以及。我認爲你的更大剪輯失敗可能是由於libmp3lame.js需要使用emscripten以更大的緩衝區大小進行編譯。 –