uniapp如何实现pcm音频播放
在uniapp中如何实现PCM音频的播放?目前项目需要直接播放PCM格式的音频数据,但在uniapp的官方文档中没找到明确的解决方案。尝试过使用innerAudioContext但似乎不支持PCM格式,也测试过web-view嵌入H5的方案但存在兼容性问题。请问是否有成熟的插件或可行的转换方案?需要支持iOS和Android双平台,最好能提供具体的代码示例或实现思路。
2 回复
在 UniApp 中播放 PCM 音频,由于平台限制(H5 和小程序不支持直接播放 PCM 原始数据),通常需要将 PCM 转换为支持的音频格式(如 WAV)。以下是实现步骤及示例代码:
实现步骤:
- 转换 PCM 为 WAV
PCM 是原始音频数据,需添加 WAV 文件头才能播放。 - 使用 UniApp 音频 API
通过uni.createInnerAudioContext()播放转换后的 WAV 文件。
示例代码:
1. PCM 转 WAV 工具函数
function pcmToWav(pcmData, sampleRate = 16000, numChannels = 1, bitDepth = 16) {
const header = new ArrayBuffer(44);
const view = new DataView(header);
// WAV 文件头设置
const writeString = (offset, string) => {
for (let i = 0; i < string.length; i++) {
view.setUint8(offset + i, string.charCodeAt(i));
}
};
writeString(0, 'RIFF');
view.setUint32(4, 36 + pcmData.length, true);
writeString(8, 'WAVE');
writeString(12, 'fmt ');
view.setUint32(16, 16, true);
view.setUint16(20, 1, true);
view.setUint16(22, numChannels, true);
view.setUint32(24, sampleRate, true);
view.setUint32(28, sampleRate * numChannels * bitDepth / 8, true);
view.setUint16(32, numChannels * bitDepth / 8, true);
view.setUint16(34, bitDepth, true);
writeString(36, 'data');
view.setUint32(40, pcmData.length, true);
// 合并文件头和 PCM 数据
const wavData = new Uint8Array(header.byteLength + pcmData.length);
wavData.set(new Uint8Array(header), 0);
wavData.set(new Uint8Array(pcmData), 44);
return wavData.buffer;
}
2. 播放音频
// 假设 pcmData 是 ArrayBuffer 类型的 PCM 数据
const wavBuffer = pcmToWav(pcmData);
const tempFilePath = `${wx.env.USER_DATA_PATH}/temp.wav`;
// 将 WAV 数据写入临时文件(小程序环境)
uni.getFileSystemManager().writeFile({
filePath: tempFilePath,
data: wavBuffer,
encoding: 'binary',
success: () => {
const audio = uni.createInnerAudioContext();
audio.src = tempFilePath;
audio.play();
audio.onEnded(() => {
uni.getFileSystemManager().unlink({ filePath: tempFilePath }); // 清理临时文件
});
}
});
注意事项:
- 平台兼容性:
- H5 需确保浏览器支持 WAV 格式。
- 小程序中需使用
wx.getFileSystemManager()写入临时文件。
- PCM 参数:
转换时需匹配实际采样率、声道数(通常为 16000Hz 单声道)。 - 性能优化:
大文件建议分片处理,避免内存溢出。
通过以上方法,即可在 UniApp 中实现 PCM 音频的播放。


