首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioRecord:缓冲区溢出?

AudioRecord:缓冲区溢出?
EN

Stack Overflow用户
提问于 2013-07-22 22:49:10
回答 2查看 6.7K关注 0票数 8

我得到了缓冲区溢出,而RECORDING与我的应用程序。记录是在Service中执行的。我不明白为什么我会从AudioFlinger那里收到这条消息。

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

代码语言:javascript
复制
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回调:

代码语言:javascript
复制
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);有关-也许这个周期对于这个bufferSize来说太大了,一个更快(更小)的周期就可以解决这个问题。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-26 16:40:29

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

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

getMinBufferSize()方法的语法为:

代码语言:javascript
复制
public static int getMinBufferSize (
    int sampleRateInHz, int channelConfig, int audioFormat)

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

您应该减小缓冲区大小,以免数据需求使音频子系统不堪重负。

请记住将audioRecord回调的重写方法(@Override)放在下面:

代码语言:javascript
复制
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

票数 10
EN

Stack Overflow用户

发布于 2013-07-26 16:37:05

这是因为:

代码语言:javascript
复制
framePeriod = bufferSize / bytesPerFrame;

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

尝试使用:

代码语言:javascript
复制
framePeriod = bufferSize * bytesPerFrame;

如果您需要示例:here is a complete audio capture class

希望能有所帮助

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17790630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档