在Android 2.1设备(Samsung Galexy S)上,我尝试使用以下代码录制音频数据:
int frequency = 16000;
int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord( MediaRecorder.AudioSource.MIC,
frequency, channelConfiguration, audioEncoding, bufferSize);
short [] buffer = new short[bufferSize];
isAdIdle = false;
audioRecord.startRecording();
while( isRecording ) {
int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
// save buffer data
}
此代码在Nexus One等其他设备上运行良好,但在三星Galaxy S上,我有以下错误信息:
AFCCreateReSampler: avAFCInfo->bUsed[0] in SampleRate[44100] outSampleRate[16000] nChannel[2] outBitDepth[16]
有什么问题吗?有人能帮我解决这个问题吗?
先谢了~ YI Kim。
3条答案
按热度按时间bfnvny8b1#
如果你仍然对它感兴趣,我发现有几件事要做,使音频记录功能在Galaxy S(和所有设备与Alsa的顶部驱动程序)。
1.不要相信getMinBufferSize!下面是一些似乎可以在所有设备上工作的代码:
这已经很有帮助了,但是您仍然会观察到一些丢失的帧
1.不要连续阅读。
必须在每个读取方法之前添加获取当前时间戳;将其与之前的值进行比较,如果最后一帧与要读取的帧之间的延迟大于帧大小,则应在阅读之前等待(休眠)。目标是在缓冲区(音频驱动程序缓冲区)尚未被输入您将请求的内容时不调用读取方法。
注意,我读取的块大小小于缓冲区大小(我认为这也更好)。
我在另一个android开源sip应用程序(sipdroid)上找到了这个解决方案。集成在我的应用程序中,声音工作得很好。不知道日志中是否仍然有错误(警告?),但是......我在我的应用程序中使用了galaxy S的语音邮件录音机,声音非常完美。
x6492ojm2#
我也面临着这个问题,下面是我项目的公开问题,供大家参考:http://code.google.com/p/csipsimple/issues/detail?id=89#c6
很遗憾,我没有设备可供测试。
你是用另一种音频格式和另一个采样率吗?我猜使用44100作为频率将消 debugging 误,因为根据它的名称,它与重新采样器创建。
此外,如果你能告诉我你观察到的音频数据是什么,我会很感兴趣的?它是波涛汹涌的声音/不完整的?什么都没有?工作正常,但cpu在录音时超载?
nzrxty8p3#
我试过用不同的采样率记录,8000和44100赫兹。但是失败了!
在8000 Hz时,成功创建了一个AudioRecord对象,但从中读取的数据不连贯且不完整!这与16000 Hz录音的结果相同。
在44100 Hz设置上,创建AudioRecord对象失败并引发异常。
记录的数据(位交换后保存)如下所示:(二进制)(地址0 h)80 07 80 07...(相同模式)...
...(相同的模式)...(地址210 h)07 80 07 80 08 80 FD 82 FF 87 5C 8D......(不同的噪声模式)...
我认为CPU负载非常低,几乎处于空闲状态。
现在我正在尝试测试AudioRecord的其他设置~并寻求社区的帮助!
感谢您的帮助和兴趣
易金。