微信小程序剪辑音频
clickMedia() {
let that = this
let pitchOnMusicItemSrc = that.musicFilePath
const audioCtx = wx.createWebAudioContext()
wx.request({
url: pitchOnMusicItemSrc,
method: 'GET',
responseType: 'arraybuffer',
success: res => {
audioCtx.decodeAudioData(res.data, audioBuffer => {
const channels = audioBuffer.numberOfChannels;
const rate = audioBuffer.sampleRate
const startOffset = rate * that.audioStatrTime
const endOffset = rate * that.audioEndTime;
const frameCount = endOffset - startOffset;
const newAudioBuffer = audioCtx.createBuffer(channels,endOffset - startOffset,rate)
const anotherArray = new Float32Array(frameCount);
const offset = 0
console.log('截取起点:',startOffset,'截取终点:',endOffset,'截取时长:',frameCount,"截取声道数:",channels)
for (let channel = 0; channel < channels; channel++) {
audioBuffer.copyFromChannel(anotherArray, channel, startOffset);
console.log(channel,'copyFromChannel 成功')
newAudioBuffer.copyToChannel(anotherArray, channel, offset);
}
let num = Math.trunc(frameCount)
var fileObj = that.bufferToWave(newAudioBuffer, num);
console.log('fileObj',fileObj)
that.submitMusic(fileObj,frameCount)
}, err => {
console.error('decodeAudioData fail', err)
})
}
})
},
bufferToWave(abuffer, len) {
var numOfChan = abuffer.numberOfChannels,
length = len * numOfChan * 2 + 44,
buffer = new ArrayBuffer(length),
view = new DataView(buffer),
channels = [], i, sample,
offset = 0,
pos = 0;
setUint32(0x46464952);
setUint32(length - 8);
setUint32(0x45564157);
setUint32(0x20746d66);
setUint32(16);
setUint16(1);
setUint16(numOfChan);
setUint32(abuffer.sampleRate);
setUint32(abuffer.sampleRate * 2 * numOfChan);
setUint16(numOfChan * 2);
setUint16(16);
setUint32(0x61746164);
setUint32(length - pos - 4);
for(i = 0; i < abuffer.numberOfChannels; i++)
channels.push(abuffer.getChannelData(i));
while(pos < length) {
for(i = 0; i < numOfChan; i++) {
sample = Math.max(-1, Math.min(1, channels[i][offset]));
sample = (0.5 + sample < 0 ? sample * 32768 : sample * 32767)|0;
view.setInt16(pos, sample, true);
pos += 2;
}
offset++
}
return buffer
function setUint16(data) {
view.setUint16(pos, data, true);
pos += 2;
}
function setUint32(data) {
view.setUint32(pos, data, true);
pos += 4;
}
},
submitMusic(fileObj,frameCount) {
let that = this
var fs = wx.getFileSystemManager();
var number = Math.random();
var filePath = wx.env.USER_DATA_PATH + '/music' + number + '.wav';
that.musicFilePath = wx.env.USER_DATA_PATH + '/music' + number + '.wav';
fs.writeFile({
filePath: filePath,
data:fileObj,
encoding: 'binary',
success: res => {
console.log(res,filePath,frameCount,"writeFile:success")
console.log(res,"writeFile:success")
}, fail: err => {
console.log(err,'writeFile:err')
}
})
},