由于Galaxy S4上的pcm_read()返回错误n --5,导致getBuffer超时

雷施诺伯格

我有一个使用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

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

发生这种情况时不会引发任何异常,AudioRecord.read只会阻塞,直到硬件恢复并再次开始录制为止,但是会丢失2-4秒的音频数据,因此对于用户来说,他们的音频文件丢失了大片区域而没有任何解释是非常令人讨厌的至于为什么。

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

雷施诺伯格

在尝试使用AudioRecord尝试了多种频率,缓冲区大小和音频源以及使用MediaRecorder尝试了多种格式之后,如果没有这些pcm错误,我将无法录制音频。这些错误是我从Play商店下载的几个录音应用程序发生的。

我按照本教程创建了OpenSL ES jni库,并且运行良好,我建议将这种方法推荐给在Galaxy S4上看到这些错误的任何人。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

由于Galaxy S4上的pcm_read()返回的错误n --5,导致getBuffer超时

来自分类Dev

由于libstdc ++而导致的错误

来自分类Dev

由于SSIS中的多个JOIN导致超时

来自分类Dev

由于版本而导致的Python错误?

来自分类Dev

由于“ WebRequest”导致的GetResponse()错误

来自分类Dev

由于关系变化而导致的错误

来自分类Dev

EF 5更新超时;可能由于死锁

来自分类Dev

Java:由于超时,对 N 系列求和失败

来自分类Dev

由于Spring源中的超时导致Tomcat启动失败

来自分类Dev

由于node.js的延迟响应,导致连接超时

来自分类Dev

由于Spring源中的超时而导致Tomcat启动失败

来自分类Dev

在移动设备上不受信任的Https /证书:Nexus 4和Galaxy S4

来自分类Dev

由于字符而导致的HTTP错误请求错误

来自分类Dev

由于templateShareable:true而导致的SAPUI5错误消息的解决方案?

来自分类Dev

Android M FingerprintManager.isHardwareDetected()在Samsung Galaxy S5上返回false

来自分类Dev

Android M FingerprintManager.isHardwareDetected()在Samsung Galaxy S5上返回false

来自分类Dev

WifiManager在我的Xperia Z3 +上返回一个空列表,但在我的Galaxy S4上可以正常工作

来自分类Dev

由于观众错误而导致令牌无效?

来自分类Dev

由于#include <graphics.h>而导致的错误

来自分类Dev

由于缺少权限而导致“捕获”错误?

来自分类Dev

由于header()而导致HTTP 302错误

来自分类Dev

如何避免由于舍入错误而导致的NaN

来自分类Dev

避免由于相对网址而导致的错误请求

来自分类Dev

由于私人访问而导致的错误

来自分类Dev

BeginInvoke由于跳过空检查而导致错误

来自分类Dev

由于换行而导致的SimpleXML解析错误

来自分类Dev

由于选择顺序而导致的语法错误

来自分类Dev

由于sqlite宝石导致的Heroku错误

来自分类Dev

由于比较功能导致的分割错误

Related 相关文章

  1. 1

    由于Galaxy S4上的pcm_read()返回的错误n --5,导致getBuffer超时

  2. 2

    由于libstdc ++而导致的错误

  3. 3

    由于SSIS中的多个JOIN导致超时

  4. 4

    由于版本而导致的Python错误?

  5. 5

    由于“ WebRequest”导致的GetResponse()错误

  6. 6

    由于关系变化而导致的错误

  7. 7

    EF 5更新超时;可能由于死锁

  8. 8

    Java:由于超时,对 N 系列求和失败

  9. 9

    由于Spring源中的超时导致Tomcat启动失败

  10. 10

    由于node.js的延迟响应,导致连接超时

  11. 11

    由于Spring源中的超时而导致Tomcat启动失败

  12. 12

    在移动设备上不受信任的Https /证书:Nexus 4和Galaxy S4

  13. 13

    由于字符而导致的HTTP错误请求错误

  14. 14

    由于templateShareable:true而导致的SAPUI5错误消息的解决方案?

  15. 15

    Android M FingerprintManager.isHardwareDetected()在Samsung Galaxy S5上返回false

  16. 16

    Android M FingerprintManager.isHardwareDetected()在Samsung Galaxy S5上返回false

  17. 17

    WifiManager在我的Xperia Z3 +上返回一个空列表,但在我的Galaxy S4上可以正常工作

  18. 18

    由于观众错误而导致令牌无效?

  19. 19

    由于#include <graphics.h>而导致的错误

  20. 20

    由于缺少权限而导致“捕获”错误?

  21. 21

    由于header()而导致HTTP 302错误

  22. 22

    如何避免由于舍入错误而导致的NaN

  23. 23

    避免由于相对网址而导致的错误请求

  24. 24

    由于私人访问而导致的错误

  25. 25

    BeginInvoke由于跳过空检查而导致错误

  26. 26

    由于换行而导致的SimpleXML解析错误

  27. 27

    由于选择顺序而导致的语法错误

  28. 28

    由于sqlite宝石导致的Heroku错误

  29. 29

    由于比较功能导致的分割错误

热门标签

归档