我尝试实现一个记录,并从不同的post收听音频,但我有一个40毫秒的延迟。
这是我的代码。
public class record {
private AudioRecord recorder = null;
private boolean isRecording = false;
private int SAMPLERATE = 8000;
private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLERATE, CHANNELS,
AUDIO_FORMAT);
private Thread recordingThread = null;
public void startRecording() {
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLERATE,
CHANNELS, AUDIO_FORMAT, bufferSize);
recorder.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable()
{
public void run() {
writeAudioData();
}
});
recordingThread.start();
}
public void stopRecording() {
isRecording = false;
recorder.stop();
recorder.release();
recorder = null;
recordingThread = null;
}
private void writeAudioData() {
byte data[] = new byte[bufferSize];
int buff = 8000;
int minBufferSize = AudioTrack.getMinBufferSize(buff,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
Log.i("AUDIO", "BufferSize:" + minBufferSize);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, buff,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize,
AudioTrack.MODE_STREAM);
at.play();
while (isRecording) {
recorder.read(data, 0, bufferSize);
at.write(data, 0, bufferSize);
}
at.stop();
at.release();
}
}
我怎样才能减少延误呢?我尝试减少缓冲区,但问题仍然存在。
发布于 2014-07-15 00:27:43
根据测量对象和方法的不同,Android音频系统中可能存在数十毫秒的延迟或数百毫秒的延迟。
如果测量播放和录制之间的延迟,40ms的延迟是一个正常值,实际上我在Android 4.4.3上的this测试中看到了30~50ms的延迟值:
此外,如果你检查你打印的"minBufferSize“值,你会发现这个最小的缓冲区大小是40ms (在我的Nexus7 2013上)。当你玩的时候会有帧延迟,我们不能期望在调用"at.write()“时立即播放,我猜在内部有另一个缓冲区来存储你的”写“数据。在记录方面也是如此。因此,如果测量从播放开始函数调用到实际声音输出,则会有比40ms更多的延迟。
如果需要更多建议,您需要描述如何测量您的延迟的细节。
https://stackoverflow.com/questions/24746061
复制