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

21 回复

报bug都没有人有经验解疑一下吗,emmm

更多关于uni-app语音录制wav,pcm格式文件播放无声,无法识别的实战教程也可以访问 https://www.itying.com/category-93-b0.html


大佬,请问解决了吗

你mp3拿什么工具转的

请问解决了吗,我录制的音频wav格式 电脑也无法打开这个文件

pcm本身确实无法用window player播放,wav文件正常是可以用window player播放;

无声的文件能否分享一下

OK,在评论附件里面

不能播放或者播放无声的文件见附件;音频格式转换下载的风云音频处理大师这个软件进行处理的

提供下原始的录制文件,在提供一个超过10s的文件

问题解决了吗?我直接录制 mp3 文件转换成base64 是可以的。但直接录制 wav 转换成 base64 ,base64 文件就有问题,非常短。手机可以播放录音,但是转码的文件就没有声音。

问题依旧存在。录制出来的wav文件小,且头对不上。 pcm加上wav头也无法播放出声音。 mp3可以正常播放。

作者你好,请问问题解决了吗?现在貌似还是这样

楼主问题解决了吗?

这个bug到现在了还是没有解决

这个BUG真的有年头了,还在

哎 居然没人回复,我也头疼中

24年8月了,这bug还没修,不懂官方在干嘛

24年11月,startRecorder录制wav仍无法播放

还在…

在使用 uni-app 进行语音录制并保存为 WAVPCM 格式时,如果播放时出现无声或无法识别的问题,可能是由于以下原因导致的。以下是一些排查和解决问题的步骤:

1. 确认录制格式

  • WAVPCM 是两种不同的音频格式。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,
    });
    
  • 确保 formatsampleRatenumberOfChannels 等参数设置正确。

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.jsWeb 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);
  }
}
回到顶部