微信小程序实现pcm音频转换wav音频

总体思路就是,在拿到录音结束之后的临时录音文件路径的时候,创建一个文件管理器,然后读取录音文件拿到二进制数据,再调用工具函数进行转换,完成之后将转换完成的数据写入到新的文件中,拿到新文件的路径去做想要做的操作。

// 录音录制之后拿到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));
	}
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值