簡體   English   中英

Android:錄制和收聽音頻

[英]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延遲值:

https://github.com/garyyu/AudioTracker-Test

另外,如果您檢查打印的“ minBufferSize”值,則會發現此最小緩沖區大小為40ms(在我的Nexus7 2013上)。 而且播放時會有幀延遲,我們不能指望在調用“ at.write()”時立即播放,我想內部還存在另一個緩沖區來存儲“寫入”數據。 在錄音方面也一樣。 因此,如果從播放開始功能調用到真實聲音輸出進行測量,則比40ms的延遲要多得多。
如果需要更多建議,則需要描述有關如何衡量延遲的詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM