gpt4 book ai didi

android - 由于 pcm_read() 在 Galaxy S4 上返回错误 n -5,obtainBuffer 超时

转载 作者:太空狗 更新时间:2023-10-29 15:06:28 24 4
gpt4 key购买 nike

我有一个应用程序使用 AudioRecord API 在 Android 设备上捕获音频,但它在 Galaxy S4 设备上反复失败。这也发生在尝试同时使用 AudioRecord 和 MediaRecorder(例如 AudioRec HQ)录制音频的其他应用程序中。我能够使用以下代码在测试应用程序中重现它:

final int bufferSize = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize << 2);
mAudioRecord.startRecording();

mRecordThread = new Thread(new Runnable() {
@Override
public void run() {
BufferedOutputStream fileOutputStream = null;
try {
fileOutputStream = new BufferedOutputStream(new FileOutputStream(String.format(Locale.US, "/sdcard/%1$d.pcm", System.currentTimeMillis())));
final byte[] buffer = new byte[bufferSize];
int bytesRead;
do {
bytesRead = mAudioRecord.read(buffer, 0, buffer.length);
if (bytesRead > 0) {
fileOutputStream.write(buffer, 0, bytesRead);
}
}
while (bytesRead > 0);
} catch (Exception e) {
Log.e("RecordingTestApp", e.toString());
}
}
});
mRecordThread.start();

这些是相关的 logcat 条目:

02-03 15:36:10.913: W/AudioRecord(20986): obtainBuffer timed out (is the CPU pegged?) user=001699a0, server=001699a0
02-03 15:36:11.394: E/alsa_pcm(208): Arec: error5
02-03 15:36:11.394: W/AudioStreamInALSA(208): pcm_read() returned error n -5, Recovering from error
02-03 15:36:11.424: D/ALSADevice(208): close: handle 0xb7730148 h 0x0
02-03 15:36:11.424: D/ALSADevice(208): open: handle 0xb7730148, format 0x2
02-03 15:36:11.424: D/ALSADevice(208): Device value returned is hw:0,0
02-03 15:36:11.424: V/ALSADevice(208): flags 11000000, devName hw:0,0
02-03 15:36:11.424: V/ALSADevice(208): pcm_open returned fd 39
02-03 15:36:11.424: D/ALSADevice(208): handle->format: 0x2
02-03 15:36:11.434: D/ALSADevice(208): setHardwareParams: reqBuffSize 320 channels 1 sampleRate 8000
02-03 15:36:11.434: W/AudioRecord(20986): obtainBuffer timed out (is the CPU pegged?) user=001699a0, server=001699a0
02-03 15:36:11.444: D/ALSADevice(208): setHardwareParams: buffer_size 640, period_size 320, period_cnt 2
02-03 15:36:20.933: W/AudioRecord(20986): obtainBuffer timed out (is the CPU pegged?) user=0017ade0, server=0017ade0
02-03 15:36:21.394: E/alsa_pcm(208): Arec: error5
02-03 15:36:21.394: W/AudioStreamInALSA(208): pcm_read() returned error n -5, Recovering from error
02-03 15:36:21.424: D/ALSADevice(208): close: handle 0xb7730148 h 0x0
02-03 15:36:21.424: D/ALSADevice(208): open: handle 0xb7730148, format 0x2
02-03 15:36:21.424: D/ALSADevice(208): Device value returned is hw:0,0
02-03 15:36:21.424: V/ALSADevice(208): flags 11000000, devName hw:0,0
02-03 15:36:21.424: V/ALSADevice(208): pcm_open returned fd 39
02-03 15:36:21.424: D/ALSADevice(208): handle->format: 0x2
02-03 15:36:21.434: D/ALSADevice(208): setHardwareParams: reqBuffSize 320 channels 1 sampleRate 8000
02-03 15:36:21.434: D/ALSADevice(208): setHardwareParams: buffer_size 640, period_size 320, period_cnt 2
02-03 15:36:21.454: W/AudioRecord(20986): obtainBuffer timed out (is the CPU pegged?) user=0017ade0, server=0017ade0

这是完整的 logcat: http://pastebin.com/y3XQ1rMf

发生这种情况时不会抛出任何异常,AudioRecord.read 只会阻塞,直到硬件恢复并再次开始录音,但会丢失 2-4 秒的音频数据,因此用户的音频文件丢失大面积区域非常烦人没有任何解释为什么。

这是一个已知的硬件问题,还是我应该做一些不同的事情来更可靠地记录?有什么方法可以检测到这个问题已经发生

最佳答案

在使用 AudioRecord 尝试各种频率、缓冲区大小和音频源并使用 MediaRecorder 尝试多种格式后,我无法在没有这些 pcm 错误的情况下录制音频。这些相同的错误发生在我从 Play 商店下载的几个录音应用程序中。

我关注了这个tutorial创建一个 OpenSL ES jni 库并且它运行良好,我会向在 Galaxy S4 上看到这些错误的任何人推荐这种方法

关于android - 由于 pcm_read() 在 Galaxy S4 上返回错误 n -5,obtainBuffer 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21538686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com