こちらのlame jsというライブラリを使用して、wavファイルをmp3に変換したいです。
リンク
以下のコードは、モノラルの場合は動きますが、ステレオのコードを書くと、速度が半分くらいになったファイルが出力されてしまいます。
モノラル
JavaScript
1//モノラル(正常) 2const wavFile = "./testdata/Left.wav"; 3 4const request = new XMLHttpRequest(); 5request.open("GET", wavFile, true); 6request.responseType = "arraybuffer"; 7 8// Our asynchronous callback 9request.onload = function () { 10 const audioData = request.response;//arraybuf 11 const wav = lamejs.WavHeader.readHeader(new DataView(audioData)); 12 const samples = new Int16Array(audioData, wav.dataOffset, wav.dataLen / 2); 13 encodeMono(wav.channels, wav.sampleRate, samples); 14}; 15request.send(); 16 17 18function encodeMono(channels, sampleRate, samples) { 19 const buffer = []; 20 const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128); 21 let remaining = samples.length; 22 const maxSamples = 1152; 23 24 for (let i = 0; remaining >= maxSamples; i += maxSamples) { 25 const mono = samples.subarray(i, i + maxSamples); 26 const mp3buf = mp3enc.encodeBuffer(mono); 27 if (mp3buf.length > 0) { 28 buffer.push(new Int8Array(mp3buf)); 29 } 30 remaining -= maxSamples; 31 } 32 33 const d = mp3enc.flush(); 34 if(d.length > 0){ 35 buffer.push(new Int8Array(d)); 36 } 37 38 console.log('done encoding, size=', buffer.length); 39 const blob = new Blob(buffer, {type: 'audio/mp3'}); 40 const bUrl = window.URL.createObjectURL(blob); 41 download(bUrl) 42} 43 44function download(url, fileName){ 45 const anchor = document.createElement("a"); 46 anchor.href = url; 47 anchor.download = fileName || "download"; 48 anchor.click(); 49 anchor.remove(); 50} 51```--- 52 53ステレオ 54```JavaScript 55//速度が1/2になっている 56const wavFile = "./testdata/Stereo44100.wav"; 57 58const request = new XMLHttpRequest(); 59request.open("GET", wavFile, true); 60request.responseType = "arraybuffer"; 61 62// Our asynchronous callback 63request.onload = function () { 64 const audioData = request.response;//arraybuf 65 const wav = lamejs.WavHeader.readHeader(new DataView(audioData)); 66 const left = new Int16Array(audioData, wav.dataOffset, wav.dataLen / 2); 67 const right = new Int16Array(audioData, wav.dataOffset, wav.dataLen / 2); 68 encodeStereo(wav.channels, wav.sampleRate, left, right); 69}; 70request.send(); 71function encodeStereo(channels, sampleRate, left, right){ 72 73 const mp3encoder = new lamejs.Mp3Encoder(channels, sampleRate, 128); 74 const mp3Data = []; 75 76 const sampleBlockSize = 1152; //can be anything but make it a multiple of 576 to make encoders life easier 77 78 let leftChunk,rightChunk; 79 80 for (let i = 0; i < left.length; i += sampleBlockSize) { 81 leftChunk = left.subarray(i, i + sampleBlockSize); 82 rightChunk = right.subarray(i, i + sampleBlockSize); 83 const mp3buf = mp3encoder.encodeBuffer(leftChunk, rightChunk); 84 if (mp3buf.length > 0) { 85 mp3Data.push(mp3buf); 86 } 87 } 88 89 const d = mp3encoder.flush(); 90 if(d.length > 0){ 91 mp3Data.push(new Int8Array(d)); 92 } 93 94 95 const blob = new Blob(mp3Data, {type: 'audio/mp3'}); 96 const bUrl = window.URL.createObjectURL(blob); 97 download(bUrl); 98 99} 100 101 102function download(url, fileName){ 103 const anchor = document.createElement("a"); 104 anchor.href = url; 105 anchor.download = fileName || "download"; 106 anchor.click(); 107 anchor.remove(); 108} 109
この原因と対処法を教えて頂きたいです。個人的には、ステレオのほうはleftとrightに同じ値を入れているのが不味いのではないかと考えていますが、別々の値を入れる方法がわからずじまいになっています。
このコードで不可能な場合は、wavをmp3に変換するほかのjsライブラリ等教えていただきたいです。
よろしくお願いいたします。
あなたの回答
tips
プレビュー