uni-app 安卓端 uni.getRecorderManager() 录制 pcm 格式音频被严重压缩
uni-app 安卓端 uni.getRecorderManager() 录制 pcm 格式音频被严重压缩
操作步骤:
- uni.getRecorderManager()开始录制音频
- 录音结束拿到音频文件
- 音频文件大小只有其他端的十分之一
预期结果:
- APP的安卓端的音频文件,应该和其他端的大小差不多
实际结果:
- 音频文件大小只有其他端的十分之一
bug描述:
在APP的安卓端,uni.getRecorderManager()录制pcm格式的音频被严重压缩,在其他端,如各个小程序端和APP的IOS端都不会被压缩,同样秒数的音频,在APP的安卓端比其他端文件大小要小了十分之一。 因为这个问题,造成了百度语音转文字功能无法实现,在其他端均可以实现。
更多关于uni-app 安卓端 uni.getRecorderManager() 录制 pcm 格式音频被严重压缩的实战教程也可以访问 https://www.itying.com/category-93-b0.html
感谢反馈,我排查一下
更多关于uni-app 安卓端 uni.getRecorderManager() 录制 pcm 格式音频被严重压缩的实战教程也可以访问 https://www.itying.com/category-93-b0.html
我们底层并未做限制,这是不同端之间有差异所导致的
您好我这边也是用到了语音识别的功能,用的是阿里的https://help.aliyun.com/document_detail/456007.html?spm=a2c4g.456006.0.0.193b4cd7phN2rx
但是使用uni.getRecorderManager()安卓端录制的音频无法验证通过,阿里反馈是采样位数不对,但是看文档无法设置采样位数,我分析了iOS录制的默认是16,安卓的是14或者13 请问这个要怎么处理 安卓音频https://kehuqiniu.yyyybbbb.com/media/0eb46202402231733303126.wav
回复 uni920: 感谢反馈,我联系安卓相关人员排查一下
回复 uni920: 检查一下代码中有没有设置采样率,如果没有的话,参考uni.getRecorderManager()的文档设置之后看一下效果。
回复 DCloud_Android_zl: 设置了的采样率,有效值 8000/16000/44100这几个值都试过了,PCM、wav格式也都试过了,录制完毕的音频,分析采样位数都不对,不符合阿里那边的要求
回复 DCloud_Android_zl: 包括采样率设置为48000这个值也尝试了,也不能符合阿里那边的要求
回复 uni920: aac格式的音频试一下
回复 DCloud_Android_zl: https://kehuqiniu.yyyybbbb.com/media/a8f7c202402271534494070.aac 阿里反馈还是不可以
回复 uni920: 好的,我确认一下
回复 uni920: 麻烦发一个iOS端录制的正常文件
回复 DCloud_Android_zl: https://kehuqiniu.yyyybbbb.com/media/0d4c8202402231634565676.wav
回复 uni920: 我对了一下我们这边的代码,aac格式用的是16bit的,默认也是单声道。wav或pcm格式在录制的时候不能指定位深度。如果aac的阿里不认的话,可以先去我们的插件市场看一下有没有其他的录音插件。wav支持设置位深度需要花较长时间重构。
回复 uni920: 你那边可以设置pcm的比特率吗,我这边也遇到这样的问题了,后台需要的16bit的,但是我看文档上没有设置bit的
在 uni-app 中,使用 uni.getRecorderManager() 录制音频时,默认情况下录制的音频格式可能是 mp3 或 aac,这些格式通常会对音频进行压缩,以减小文件大小。如果你需要录制 PCM 格式的音频(即无损的原始音频数据),可能会遇到音频被压缩的问题。
以下是几个可能的原因和解决方案:
1. 确认录音格式
uni.getRecorderManager() 默认可能不支持直接录制 PCM 格式的音频。你可以尝试设置录音格式为 wav 或 pcm,但具体支持情况取决于平台的实现。你可以通过 format 参数来指定录音格式:
const recorderManager = uni.getRecorderManager();
recorderManager.onStart(() => {
console.log('recorder start');
});
recorderManager.onStop((res) => {
console.log('recorder stop', res);
});
recorderManager.start({
format: 'wav', // 尝试使用 wav 格式
sampleRate: 44100, // 采样率
numberOfChannels: 1, // 单声道
encodeBitRate: 128000, // 编码比特率
});
2. 自定义录音实现
如果 uni.getRecorderManager() 无法满足你的需求,你可能需要自定义录音实现。你可以使用 Web Audio API 或原生 Android 的 AudioRecord API 来直接录制 PCM 格式的音频。
使用 Web Audio API
在 H5 环境下,你可以使用 Web Audio API 来录制音频,并保存为 PCM 格式。
let audioContext = new (window.AudioContext || window.webkitAudioContext)();
let mediaStreamSource = null;
let scriptProcessor = null;
let audioBuffers = [];
navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
mediaStreamSource = audioContext.createMediaStreamSource(stream);
scriptProcessor = audioContext.createScriptProcessor(4096, 1, 1);
scriptProcessor.onaudioprocess = (event) => {
let audioBuffer = event.inputBuffer.getChannelData(0);
audioBuffers.push(new Float32Array(audioBuffer));
};
mediaStreamSource.connect(scriptProcessor);
scriptProcessor.connect(audioContext.destination);
});
function stopRecording() {
mediaStreamSource.disconnect();
scriptProcessor.disconnect();
let pcmData = mergeBuffers(audioBuffers);
console.log(pcmData); // 这是 PCM 格式的音频数据
}
function mergeBuffers(buffers) {
let length = buffers.reduce((acc, buffer) => acc + buffer.length, 0);
let result = new Float32Array(length);
let offset = 0;
buffers.forEach((buffer) => {
result.set(buffer, offset);
offset += buffer.length;
});
return result;
}
使用原生 Android API
如果你需要在 Android 平台上实现 PCM 录音,你可以通过原生插件的方式调用 Android 的 AudioRecord API。
3. 检查录音参数
如果你已经能够录制 PCM 格式的音频,但仍然感觉音频质量被压缩,可能是因为录音参数设置不当。你可以尝试调整以下参数:
sampleRate: 采样率,通常设置为 44100 Hz。numberOfChannels: 声道数,通常设置为 1(单声道)或 2(立体声)。encodeBitRate: 编码比特率,通常设置为 128000 或更高。
recorderManager.start({
format: 'wav',
sampleRate: 44100,
numberOfChannels: 1,
encodeBitRate: 128000,
});

