JS音频倍速后音调发生变化实例页面
回到相关文章 »效果:
原始音频
选择播放速率:
转换音频预览
代码:
HTML代码:
<h4>原始音频</h4> <p> <audio src="/study/201812/audio/zxx-comic-01.mp3" controls></audio> </p> <p>选择播放速率:</p> <p> <label><input type="radio" name="rate" value="0.5">0.5倍速</label> <label><input type="radio" name="rate" value="1" checked>1倍速</label> <label><input type="radio" name="rate" value="1.5">1.5倍速</label> <label><input type="radio" name="rate" value="2">2倍速</label> </p> <p> <button class="button">开始转换</button> </p> <h4>转换音频预览</h4> <p> <audio id="audio" controls></audio> </p>
JS代码:
<script type="module"> import bufferToWav from './buffer2wav.js'; // 原始音频的AudioBuffer let originAudioBuffer; const eleAudio = document.querySelector('audio'); // 获取原始音频的audiobuffer数据 fetch(eleAudio.src) .then(response => response.arrayBuffer()) .then(arrayBuffer => new AudioContext().decodeAudioData(arrayBuffer)) .then(audioBuffer => { // 获取原始音频的采样率 originAudioBuffer = audioBuffer; }); // 点击按钮 document.querySelector('button').onclick = () => { // 获取选中的倍速 const rate = document.querySelector('input[name="rate"]:checked').value * 1; // 创建新的AudioBuffer const audioBuffer = new AudioContext().createBuffer( originAudioBuffer.numberOfChannels, originAudioBuffer.length / rate, originAudioBuffer.sampleRate ); // 复制原始音频的数据到新的AudioBuffer for (let channel = 0; channel < originAudioBuffer.numberOfChannels; channel++) { const originChannelData = originAudioBuffer.getChannelData(channel); const newChannelData = audioBuffer.getChannelData(channel); for (let i = 0; i < audioBuffer.length; i += 1) { newChannelData[i] = originChannelData[Math.floor(i * rate)] || 0; } } // 创建新的音频 const audio = document.querySelector('#audio'); const blob = bufferToWav(audioBuffer, audioBuffer.length); const audioURL = URL.createObjectURL(blob, { type: 'audio/wav' }); audio.src = audioURL; }; </script>