AudioRecord:缓冲区溢出?

时间:2013-07-22 14:49:10

标签: android buffer-overflow audiorecord android-audiorecord

我的应用程序RECORDING正在缓冲区溢出。录制在Service中执行。我无法弄清楚为什么我从AudioFlinger收到此消息。

下面我实例化AudioRecord对象并设置它的回调。

bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
aRecorder = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize);

aRecorder.setRecordPositionUpdateListener(updateListener);

bytesPerSample = bitsPerSample / 8;
int bytesPerFrame = nChannels * bytesPerSample;
framePeriod = bufferSize / bytesPerFrame; // nr of frames that can be kept in a bufferSize dimension    
int result = aRecorder.setPositionNotificationPeriod(framePeriod);    
buffer = new byte[bufferSize];

audioRecord回调:

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener(){
        public void onPeriodicNotification(AudioRecord recorder){
            int result = aRecorder.read(buffer, 0, buffer.length);
        }

        public void onMarkerReached(AudioRecord recorder)
        {}
    };

我怀疑问题与:aRecorder.setPositionNotificationPeriod(framePeriod);有关 - 也许这段时间对于bufferSiz来说太大了,更快(更小)的时间段可以解决问题。

有人能告诉我如何摆脱缓冲区溢出吗?

2 个答案:

答案 0 :(得分:9)

要解决此问题,请将AudioRecord的缓冲区大小更改为最小缓冲区大小的2倍。

您可以使用AudioRecord.getMinBufferSize()静态方法。这将为您提供用于当前格式的最小缓冲区大小。

getMinBufferSize()方法的语法是:

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

在创建AudioRecord对象时,任何小于此数字的内容都将导致失败。

您应该减少缓冲区大小,以免压低音频子系统对数据的需求。

请记住将重写的方法(@Override)用于audioRecord回调,如下所示:

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener(){

        @Override
        public void onPeriodicNotification(AudioRecord recorder){
            int result = aRecorder.read(buffer, 0, buffer.length);
        }

        @Override
        public void onMarkerReached(AudioRecord recorder)
        {}
    };

我建议阅读帖子:Android audio recording, part 2

你可以尝试的另一件事是在录制时使用线程,在记录的字节上使用另一个进程,从而避免主UI线程上的过多重载。

此方法的开源示例代码:musicg_android_demo

查看此帖子了解更多信息 - android-audiorecord-class-process-live-mic-audio-quickly-set-up-callback-func

答案 1 :(得分:1)

那是因为:

framePeriod = bufferSize / bytesPerFrame;

你需要乘以而不是除以你的缓冲区大小。

尝试:

framePeriod = bufferSize * bytesPerFrame;

如果您需要样本:here is a complete audio capture class

希望有所帮助