前端实现音频剪切,实际上是把需要的部分复制出来。
剪切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的对象