[英]Android: Record and listen audio
我嘗試實現一條記錄並收聽來自其他帖子的音頻,但是我有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();
}
}
如何減少延遲? 我嘗試減少緩沖區,但問題仍然存在。
根據測量對象和方法的不同,Android音頻系統可能會有數十毫秒的延遲或數百毫秒的延遲。
如果測量播放和錄制之間的延遲,則40ms延遲是一個正常值,實際上我在Android 4.4.3的此測試中看到30〜50ms延遲值:
另外,如果您檢查打印的“ minBufferSize”值,則會發現此最小緩沖區大小為40ms(在我的Nexus7 2013上)。 而且播放時會有幀延遲,我們不能指望在調用“ at.write()”時立即播放,我想內部還存在另一個緩沖區來存儲“寫入”數據。 在錄音方面也一樣。 因此,如果從播放開始功能調用到真實聲音輸出進行測量,則比40ms的延遲要多得多。
如果需要更多建議,則需要描述有關如何衡量延遲的詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.