前端實現音頻剪切,實際上是把需要的部分復制出來。
剪切audiobuffer
引用:JS純前端實現audio音頻剪裁剪切復制播放與上傳
實現的原理很簡單,創建一個空的AudioBuffer,復制現有的通道數據前3秒的數據,然后復制的內容寫入到這個空的AudioBuffer,於是我們就得到了一個剪裁后的音頻Buffer數據了。
// 聲道數量和采樣率
var channels = audioBuffer.numberOfChannels;
var rate = audioBuffer.sampleRate;
// 截取前3秒
var startOffset = 0;
var endOffset = rate * 3;
// 3秒對應的幀數
var frameCount = endOffset - startOffset;
// 創建同樣采用率、同樣聲道數量,長度是前3秒的空的AudioBuffer
var newAudioBuffer = new AudioContext().createBuffer(channels, endOffset - startOffset, rate);
// 創建臨時的Array存放復制的buffer數據
var anotherArray = new Float32Array(frameCount);
// 聲道的數據的復制和寫入
var offset = 0;
for (var channel = 0; channel < channels; channel++) {
audioBuffer.copyFromChannel(anotherArray, channel, startOffset);
newAudioBuffer.copyToChannel(anotherArray, channel, offset);
}
// newAudioBuffer就是全新的復制的3秒長度的AudioBuffer對象
剪切arraybuffer
實現原理同上,此處的arraybuffer應當是沒有header的。在計算音頻長度時,
duration = arraybuffer.bytelength / samplerate / 2
之所以除以2是因為duration是16bit的pcm格式長度,而arraybuffer的bytelength是8bit的。
const startOffset = 0;
const clipDuration = 3;//截取前3秒
const clipBuffer = audioBuffer.slice(startOffset , clipDuration * 2 * sampleRate);
// clipBuffer 就是全新的復制的3秒長度的Arraybuffer的對象