我用录音机有问题。
使用从
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设备和所有模拟器现在都可以工作(即使某些设备比其他设备更慢)。
我在这里做了什么可怕的错误吗?