在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); //保存缓冲区数据
此代码在其他设备上运行良好,例如nexus one,但在Samsung Galexy S上,我有以下错误消息:
有什么问题?谁能帮我解决这个问题?
提前谢谢〜 易金
答案 0 :(得分:2)
如果你仍然对它感兴趣,我发现有几件事可以使音频记录在Galaxy S上运行(以及驱动程序顶部带有alsa的所有设备)。
if(inputBuffSizeRec <= 4096){ inputBuffSizeRec = 4096 * 3/2; }
这已经有很多帮助,但你仍然会观察到一些丢失的帧
您必须在每个读取方法之前添加get current timestamp;将它与之前的值进行比较,如果您要读取的最后一帧和帧之间的延迟大于帧大小,则应在读取之前等待(休眠)。目标是不调用read方法,而缓冲区(音频驱动程序缓冲区)没有提供你要求的东西。
请注意,我读取的块大小低于缓冲区大小(我认为也更好)。
我在另一个android opensource sip应用程序(sipdroid)上找到了解决方案。集成在我的,听起来很好。不知道日志中是否还有错误(警告?),但是......我用我的应用程序从galaxy S中掏出了一个语音邮件记录器,声音很完美。
答案 1 :(得分:1)
我也面临这个问题。 这里参考我的项目的未决问题: http://code.google.com/p/csipsimple/issues/detail?id=89#c6
不幸的是我没有可以测试的设备。
您是否使用其他音频格式和其他采样率? 我想使用44100作为频率将删除错误,因为根据其名称,它与重新采样器创建有关。
如果你能说出你所观察到的音频数据,我会非常有趣吗?是不稳定的声音/不完整?没有?运行良好,但录制时cpu超载?
答案 2 :(得分:0)
我尝试使用不同的采样率录制,8000和44100 Hz。但失败了!
在8000 Hz时,成功创建了一个AudioRecord对象,但从中读取的数据不稳定且不完整!这与16000 Hz录音的结果相同。
在44100 Hz设置下,AudioRecord对象的创建失败并抛出一个execption。
记录的数据(在位交换后保存)如下所示:
(二进制)
(地址0h)80 07 80 07 ...(相同模式)...
......(相同的模式)......
(地址210h)07 80 07 80 08 80 FD 82 FF 87 5C 8D ......
......(不同的嘈杂模式)......
我认为CPU负载非常低且几乎空闲。
现在我正在尝试测试AudioRecord的其他设置〜 并寻求社区的帮助!
感谢您的帮助和兴趣
是的,金金。