我的应用程序RECORDING
时出现缓冲区溢出。在CCD_ 2中执行记录。我不明白为什么我从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
e来说太大了,更快(更小)的周期会解决这个问题。
有人能告诉我如何摆脱缓冲区溢出吗?
要解决此问题,请将AudioRecord的缓冲区大小更改为最小缓冲区大小的2倍。
您可以使用AudioRecord.getMinBufferSize()
静态方法。这将为您提供用于当前格式的最小缓冲区大小。
getMinBufferSize()方法的语法为:
public static int getMinBufferSize (
int sampleRateInHz, int channelConfig, int audioFormat)
在创建AudioRecord对象时,任何小于此数字的值都将导致失败。
您应该减少缓冲区大小,以免音频子系统因数据需求而不堪重负。
记住将audioRecord回调的重写方法(@Override
)如下所示:
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音频录制,第2部分
您可以尝试的另一件事是在录制时使用线程,而在录制的字节上使用另一个进程,从而避免主UI线程过多过载。
这种方法的开源示例代码:musicg_android_demo
查看此帖子了解更多-安卓录音类处理现场麦克风音频快速设置回调函数
这是因为:
framePeriod = bufferSize / bytesPerFrame;
你需要乘以而不是除以你的buffersize。
试用:
framePeriod = bufferSize * bytesPerFrame;
如果你需要一个样本:这里是一个完整的音频捕获类
希望它能帮助