在Android 2.1设备(Samsung Galexy S)上,我尝试使用以下代码记录音频数据。



整数频率= 16000;

int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
   int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
   int bufferSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration,audioEncoding);
   AudioRecord audioRecord =新的AudioRecord(MediaRecorder.AudioSource.MIC,
     频率,channelConfiguration,audioEncoding,bufferSize);
   short [] buffer =新的short [bufferSize];

isAdIdle = false;
   audioRecord.startRecording();

while(isRecording){
    int bufferReadResult = audioRecord.read(buffer,0,bufferSize);
                                //保存缓冲区数据

                        }

此代码在其他设备(例如Nexus 1)上运行良好,但是在Samsung Galexy S上,出现以下错误消息:



AFCCreateReSampler:avAFCInfo-> bUsed [0] in SampleRate [44100] outSampleRate [16000] nChannel [2] outBitDepth [16]

问题是什么?谁能帮我解决这个问题?

提前谢谢〜
金I

最佳答案

如果您仍然对此感兴趣,我发现有几件事可以做,以便使音频记录在Galaxy S(以及驱动程序顶部带有alsa的所有设备)上起作用。


不要相信getMinBufferSize!
这里的一些代码似乎适用于所有设备:



if(inputBuffSizeRec <= 4096){
   inputBuffSizeRec = 4096 * 3/2;
}



这已经有很多帮助,但是您仍然会发现一些丢失的帧


不要连续读。


您必须在每种读取方法之前添加获取当前时间戳记;将其与前一个值进行比较,如果最后一帧和要读取的帧之间的延迟大于帧大小,则应等待(休眠)再读取。目的是在缓冲区(音频驱动程序缓冲区)尚未提供您要请求的内容时不调用read方法。

请注意,我读取的块大小小于缓冲区大小(我也认为这样更好)。

我在另一个android开源sip应用程序(sipdroid)上找到了解决方案。集成在我的系统中,听起来不错。不知道日志中是否仍然存在错误(警告?),但是...我从我的应用程序中听到了来自银河S的语音邮件记录器,声音非常完美。

关于android - 错误消息“SampleRate [44100] outSampleRate [16000]中的AFCCreateReSampler:avAFCInfo-> bUsed [0]”是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3314760/

10-10 08:35