总体思路就是,在拿到录音结束之后的临时录音文件路径的时候,创建一个文件管理器,然后读取录音文件拿到二进制数据,再调用工具函数进行转换,完成之后将转换完成的数据写入到新的文件中,拿到新文件的路径去做想要做的操作。
// 录音录制之后拿到tempFilePath
const FileSystemManager = wx.getFileSystemManager()
FileSystemManager.readFile({
filePath: tempFilePath,
success: res => {
let view = encodeWAV(res.data, 1, 16000)
let dateNow = Date.now()
FileSystemManager.writeFile({
data: view.buffer,
filePath: `${wx.env.USER_DATA_PATH}/${dateNow}.wav`,
success: res => {
// 拿封装好的文件进行操作
}
})
}
})
// 一些工具函数,将数据进行转码、封装
function encodeWAV(samples, numChannels, sampleRate) {
var buffer = new ArrayBuffer(44 + samples.byteLength);
var view = new DataView(buffer);
/* RIFF identifier */
writeString(view, 0, 'RIFF');
/* RIFF chunk length */
view.setUint32(4, 36 + samples.byteLength, true);
/* RIFF type */
writeString(view, 8, 'WAVE');
/* format chunk identifier */
writeString(view, 12, 'fmt ');
/* format chunk length */
view.setUint32(16, 16, true);
/* sample format (raw) */
view.setUint16(20, 1, true);
/* channel count */
view.setUint16(22, numChannels, true);
/* sample rate */
view.setUint32(24, sampleRate, true);
/* byte rate (sample rate * block align) */
view.setUint32(28, sampleRate * 4, true);
/* block align (channel count * bytes per sample) */
view.setUint16(32, numChannels * 2, true);
/* bits per sample */
view.setUint16(34, 16, true);
/* data chunk identifier */
writeString(view, 36, 'data');
/* data chunk length */
view.setUint32(40, samples.byteLength, true);
copyBytes(view, 44, samples);
return view;
}
function copyBytes(output, offset, input) {
const dataView = new DataView(input);
for (var i = 0; i < input.byteLength; i++, offset++) {
output.setInt8(offset, dataView.getInt8(i));
}
}
function writeString(view, offset, string) {
for (var i = 0; i < string.length; i++) {
view.setUint8(offset + i, string.charCodeAt(i));
}
}