代码之家  ›  专栏  ›  技术社区  ›  Marc

非HTC设备的录音问题

  •  0
  • Marc  · 技术社区  · 16 年前

    我用录音机有问题。

    使用从 splmeter 项目:

    private static final int FREQUENCY = 8000;
    private static final int CHANNEL = AudioFormat.CHANNEL_CONFIGURATION_MONO;
    private static final int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    private int BUFFSIZE = 50;
    private AudioRecord recordInstance = null;
    
    ...
    
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
    recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, CHANNEL, ENCODING, 8000);
    recordInstance.startRecording();
    short[] tempBuffer = new short[BUFFSIZE];
    int retval = 0;
    
    while (this.isRunning) {
       for (int i = 0; i < BUFFSIZE - 1; i++) {
          tempBuffer[i] = 0;
       }
    
       retval = recordInstance.read(tempBuffer, 0, BUFFSIZE);
       ... // process the data
    }
    

    这在HTC梦和HTC魔术上工作得很好,没有任何日志警告/错误,但会在模拟器和NexusOne设备上造成问题。

    在NexusOne上,它从不返回有用的数据。我不能提供任何其他有用的信息,因为我让一个远程朋友进行测试。

    在模拟器(android 1.5、2.1和2.2)上,我从audioFlinger得到了奇怪的错误,audioRecordThread溢出了缓冲区。我还发现UI响应速度明显减慢(即使记录是在一个独立的线程中进行的,而不是在UI中进行的)。

    是否有明显的错误?我需要为NexusOne硬件做什么特别的工作吗?

    编辑

    我已经部分解决了这个问题… 文件 AudioRecord 说:

    public static int getMinBufferSize (int sampleRateInHz, int channelConfig, int audioFormat)
    

    返回最小缓冲区大小 成功创建所必需的 音频记录对象的。注意 这个尺寸不能保证光滑 负载下记录,以及更高 值的选择应根据 预期频率 将轮询音频记录实例 用于新数据。用于新数据。

    所以我把缓冲区的长度改为

    private static final int BUFFSIZE = AudioRecord.getMinBufferSize(FREQUENCY, CHANNEL, ENCODING);
    

    现在模拟器运行良好。

    但是

    硬件没有。虽然模拟器从该调用返回640的值(每秒进行12.5次轮询),基于8kHz,HTC硬件返回4096!这意味着大约每秒2次投票和半秒的音频延迟! 此外,对NexusOne的相同调用返回8192!所以一整秒的延迟!

    我希望它就此结束,但关系是 仍然 不会返回任何音频(我自己仍然没有,因此我无法从其中获得正确的调试信息),即使HTC设备和所有模拟器现在都可以工作(即使某些设备比其他设备更慢)。

    我在这里做了什么可怕的错误吗?

    1 回复  |  直到 13 年前
        1
  •  2
  •   Marc    16 年前

    我解决了!

    我(错误地)假定audioRecord类的构造函数中使用的magic 8000数字是频率变量的副本。它实际上应该是您将要使用的缓冲区大小。

    不幸的是,这不仅不同于SPlmeter的缓冲区长度(默认值320——我在第一个代码块中将其修改为50),而且nexus one可接受的最小缓冲区大小是8192,因此必须正确创建audioRecord实例。

    因此,当我修改了缓冲区长度(从getminbuffersize开始),用它替换了magic 8000,并将频率变量增加到建议的44100时,所有平台/模拟器的工作都非常完美。

    因此,如果您计划在修补之前使用splmeter代码库,那么请考虑这三个方面。

    老实说,SPlmeter代码甚至不应该在HTC设备上工作。我想这就是为什么我的dev设备被命名为htc magic=p

    推荐文章