<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410780&amp;view=findpost&amp;p=3721394</guid>
        <pubDate>Thu, 11 May 2017 20:56:30 +0000</pubDate>
        <title>Конвертирование WAV в MP3</title>
        <link>https://forum.sources.ru/index.php?showtopic=410780&amp;view=findpost&amp;p=3721394</link>
        <description><![CDATA[vtg: Использую <a class='tag-url' href='https://github.com/zhuker/lamejs' target='_blank'>JavaScript-порт кодировщика LAME</a> для конвертирования WAV-файла в MP3.<br>
<br>
Есть примеры конвертирования пустого буфера<br>
<br>
Momo<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">channels = 1; //1 for mono or 2 for stereo</div><div class="code_line">sampleRate = 44100; //44.1khz (normal mp3 samplerate)</div><div class="code_line">kbps = 128; //encode 128kbps mp3</div><div class="code_line">mp3encoder = new lamejs.Mp3Encoder(channels, sampleRate, kbps);</div><div class="code_line">var mp3Data = [];</div><div class="code_line">&nbsp;</div><div class="code_line">samples = new Int16Array(44100); //one second of silence (get your data from the source you have)</div><div class="code_line">sampleBlockSize = 1152; //can be anything but make it a multiple of 576 to make encoders life easier</div><div class="code_line">&nbsp;</div><div class="code_line">var mp3Data = [];</div><div class="code_line">for (var i = 0; i &#60; samples.length; i += sampleBlockSize) {</div><div class="code_line">&nbsp;&nbsp;sampleChunk = samples.subarray(i, i + sampleBlockSize);</div><div class="code_line">&nbsp;&nbsp;var mp3buf = mp3encoder.encodeBuffer(sampleChunk);</div><div class="code_line">&nbsp;&nbsp;if (mp3buf.length &#62; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;mp3Data.push(mp3buf);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">var mp3buf = mp3encoder.flush(); &nbsp; //finish writing mp3</div><div class="code_line">&nbsp;</div><div class="code_line">if (mp3buf.length &#62; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;mp3Data.push(new Int8Array(mp3buf));</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">var blob = new Blob(mp3Data, {type: &#39;audio/mp3&#39;});</div><div class="code_line">var url = window.URL.createObjectURL(blob);</div><div class="code_line">console.log(&#39;MP3 URl: &#39;, url);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Stereo<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">mp3encoder = new lamejs.Mp3Encoder(2, 44100, 128);</div><div class="code_line">var mp3Data = [];</div><div class="code_line">&nbsp;</div><div class="code_line">left = new Int16Array(44100); //one second of silence (get your data from the source you have)</div><div class="code_line">right = new Int16Array(44100); //one second of silence (get your data from the source you have)</div><div class="code_line">sampleBlockSize = 1152; //can be anything but make it a multiple of 576 to make encoders life easier</div><div class="code_line">&nbsp;</div><div class="code_line">for (var i = 0; i &#60; samples.length; i += sampleBlockSize) {</div><div class="code_line">&nbsp;&nbsp;leftChunk = left.subarray(i, i + sampleBlockSize);</div><div class="code_line">&nbsp;&nbsp;rightChunk = right.subarray(i, i + sampleBlockSize);</div><div class="code_line">&nbsp;&nbsp;var mp3buf = mp3encoder.encodeBuffer(leftChunk, rightChunk);</div><div class="code_line">&nbsp;&nbsp;if (mp3buf.length &#62; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;mp3Data.push(mp3buf);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">var mp3buf = mp3encoder.flush(); &nbsp; //finish writing mp3</div><div class="code_line">&nbsp;</div><div class="code_line">if (mp3buf.length &#62; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;mp3Data.push(mp3buf);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">console.log(mp3Data);</div></ol></div></div></div></div><br>
<br>
<br>
По аналогии конвертирую Mono-файл.<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function convertWAVToMP3(audioData)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;var wav = lamejs.WavHeader.readHeader(new DataView(audioData))</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var samples = new Int16Array(audioData, wav.dataOffset, wav.dataLen / 2)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var buffer = []</div><div class="code_line">&nbsp;&nbsp; &nbsp;var mp3enc = new lamejs.Mp3Encoder(wav.channels, wav.sampleRate, 128)</div><div class="code_line">&nbsp;&nbsp; &nbsp;var remaining = samples.length</div><div class="code_line">&nbsp;&nbsp; &nbsp;var maxSamples = 1152</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for ( var i = 0; remaining &#62;= maxSamples; i += maxSamples ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var mono = samples.subarray(i, i + maxSamples)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var mp3buf = mp3enc.encodeBuffer(mono)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( mp3buf.length &#62; 0 ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;buffer.push(new Int8Array(mp3buf))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;remaining -= maxSamples</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var d = mp3enc.flush()</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( d.length &#62; 0 ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;buffer.push(new Int8Array(d))</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return buffer</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
В audioData находится файл, прочитанный в виде ArrayBuffer. Работает.<br>
<br>
А как конвертировать Stereo-файл?<br>
В частности непонятно как заполнять left и right массивы из примера про Stereo.]]></description>
        <author>vtg</author>
        <category>Программирование звука</category>
      </item>
	
      </channel>
      </rss>
	