uni-app语音录制wav,pcm格式文件播放无声,无法识别
uni-app语音录制wav,pcm格式文件播放无声,无法识别
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows 10 专业版 | 21H2 | HBuilderX |
示例代码:
recorderManager.start({
sampleRate:16000,//采样率,App、小程序
numberOfChannels:1,
format:'wav',//格式 aac/mp3/wav/PCM,App默认值为mp3,小程序默认值aac
})
recorderManager.onStop(function (res) {
console.log('录音停止3:' + JSON.stringify(res));
self.voiceTempPath = res.tempFilePath;
self.upload_voice(); //上传至服务器
});
操作步骤:
- 开始录音
recorderManager.start({
sampleRate:16000,//采样率,App、小程序
numberOfChannels:1,
format:'wav',//格式 aac/mp3/wav/PCM,App默认值为mp3,小程序默认值aac
})
- 停止后上传录音
recorderManager.onStop(function (res) {
console.log('录音停止3:' + JSON.stringify(res));
self.voiceTempPath = res.tempFilePath;
self.upload_voice(); //上传至服务器
});
更多关于uni-app语音录制wav,pcm格式文件播放无声,无法识别的实战教程也可以访问 https://www.itying.com/category-93-b0.html
报bug都没有人有经验解疑一下吗,emmm
更多关于uni-app语音录制wav,pcm格式文件播放无声,无法识别的实战教程也可以访问 https://www.itying.com/category-93-b0.html
大佬,请问解决了吗
你mp3拿什么工具转的
请问解决了吗,我录制的音频wav格式 电脑也无法打开这个文件
pcm本身确实无法用window player播放,wav文件正常是可以用window player播放;
无声的文件能否分享一下
不能播放或者播放无声的文件见附件;音频格式转换下载的风云音频处理大师这个软件进行处理的
提供下原始的录制文件,在提供一个超过10s的文件
问题解决了吗?我直接录制 mp3 文件转换成base64 是可以的。但直接录制 wav 转换成 base64 ,base64 文件就有问题,非常短。手机可以播放录音,但是转码的文件就没有声音。
问题依旧存在。录制出来的wav文件小,且头对不上。
pcm加上wav头也无法播放出声音。
mp3可以正常播放。
作者你好,请问问题解决了吗?现在貌似还是这样
楼主问题解决了吗?
这个bug到现在了还是没有解决
这个BUG真的有年头了,还在
哎 居然没人回复,我也头疼中
你
还在…
在使用 uni-app
进行语音录制并保存为 WAV
或 PCM
格式时,如果播放时出现无声或无法识别的问题,可能是由于以下原因导致的。以下是一些排查和解决问题的步骤:
1. 确认录制格式
- WAV 和 PCM 是两种不同的音频格式。WAV 是一种容器格式,通常包含 PCM 数据。PCM 是无压缩的原始音频数据。
- 如果你录制的是 PCM 数据,直接播放 PCM 文件可能会出现问题,因为 PCM 文件不包含音频格式的元数据(如采样率、声道数等)。你需要将 PCM 数据封装成 WAV 文件,或者确保播放器能够正确识别 PCM 文件的格式。
2. 检查音频参数
- 采样率、声道数、位深度等音频参数需要与播放器兼容。常见的采样率是 44100Hz,声道数为 1(单声道)或 2(立体声),位深度为 16 位。
- 如果录制的音频参数与播放器不匹配,可能会导致播放无声或无法识别。
3. 检查录制代码
-
确保你在录制时正确设置了音频参数。以下是一个示例代码片段,展示如何使用
uni.getRecorderManager()
进行录音:const recorderManager = uni.getRecorderManager(); recorderManager.onStart(() => { console.log('recorder start'); }); recorderManager.onStop((res) => { console.log('recorder stop', res); const { tempFilePath } = res; console.log('录音文件路径:', tempFilePath); // 这里可以对录音文件进行处理,比如上传或播放 }); recorderManager.start({ format: 'wav', // 或者 'pcm' sampleRate: 44100, numberOfChannels: 1, encodeBitRate: 96000, });
-
确保
format
、sampleRate
、numberOfChannels
等参数设置正确。
4. 检查播放代码
-
如果你录制的是 WAV 文件,可以直接使用
uni.createInnerAudioContext()
进行播放。以下是一个示例代码片段:const innerAudioContext = uni.createInnerAudioContext(); innerAudioContext.src = 'path/to/your/audio.wav'; innerAudioContext.play(); innerAudioContext.onPlay(() => { console.log('开始播放'); }); innerAudioContext.onError((res) => { console.log('播放错误', res); });
-
如果你录制的是 PCM 文件,可能需要先将 PCM 数据封装成 WAV 文件,或者使用支持 PCM 格式的播放器。
5. 检查文件完整性
- 确保录制的音频文件没有损坏。你可以尝试将文件下载到本地,使用其他音频播放器(如 VLC、Audacity 等)进行播放,检查是否正常。
6. 使用第三方库
- 如果
uni-app
自带的录音和播放功能无法满足需求,可以考虑使用第三方库,如Recorder.js
或Web Audio API
来处理音频录制和播放。
7. 调试和日志
- 在录制和播放过程中,添加日志输出,检查每一步的执行情况,确保没有错误发生。
8. 设备权限
- 确保应用已经获取了麦克风和音频播放的权限。如果没有权限,录音和播放可能会失败。
9. 平台兼容性
- 不同平台(如 iOS、Android、小程序等)对音频格式的支持可能有所不同。确保你录制的音频格式在目标平台上兼容。
10. PCM 转 WAV
- 如果你录制的是 PCM 数据,可以将其封装成 WAV 文件。WAV 文件包含一个文件头,描述了音频的格式信息。你可以使用 JavaScript 或后端服务来生成 WAV 文件头,并将 PCM 数据写入 WAV 文件中。
function encodeWAV(samples, sampleRate, numChannels, bitDepth) {
const bytesPerSample = bitDepth / 8;
const blockAlign = numChannels * bytesPerSample;
const dataSize = samples.length * bytesPerSample;
const buffer = new ArrayBuffer(44 + dataSize);
const view = new DataView(buffer);
// RIFF chunk descriptor
writeString(view, 0, 'RIFF');
view.setUint32(4, 36 + dataSize, true);
writeString(view, 8, 'WAVE');
// FMT sub-chunk
writeString(view, 12, 'fmt ');
view.setUint32(16, 16, true); // Subchunk1Size
view.setUint16(20, 1, true); // AudioFormat (PCM)
view.setUint16(22, numChannels, true); // NumChannels
view.setUint32(24, sampleRate, true); // SampleRate
view.setUint32(28, sampleRate * blockAlign, true); // ByteRate
view.setUint16(32, blockAlign, true); // BlockAlign
view.setUint16(34, bitDepth, true); // BitsPerSample
// Data sub-chunk
writeString(view, 36, 'data');
view.setUint32(40, dataSize, true);
// Write PCM samples
floatTo16BitPCM(view, 44, samples);
return view;
}
function writeString(view, offset, string) {
for (let i = 0; i < string.length; i++) {
view.setUint8(offset + i, string.charCodeAt(i));
}
}
function floatTo16BitPCM(view, offset, input) {
for (let i = 0; i < input.length; i++, offset += 2) {
const s = Math.max(-1, Math.min(1, input[i]));
view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
}
}