質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Web Audio

Web Audioは、音声を処理・合成するためのWebアプリケーション向けJavaScript APIです。HTML5から導入されました。オーディオソースの選択、エフェクト・ビジュアライゼーションの追加、パンニングなど特殊効果の適用など多くの機能を持ちます。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

1917閲覧

lame js でステレオの.wavを.mp3に変換したい

takushikai

総合スコア12

Web Audio

Web Audioは、音声を処理・合成するためのWebアプリケーション向けJavaScript APIです。HTML5から導入されました。オーディオソースの選択、エフェクト・ビジュアライゼーションの追加、パンニングなど特殊効果の適用など多くの機能を持ちます。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/11/27 04:31

こちらの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ライブラリ等教えていただきたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問