【问题标题】:Android: Record and listen audioAndroid:录制和收听音频
【发布时间】:2014-09-04 22:21:59
【问题描述】:

我尝试实现记录并收听来自不同帖子的音频,但我有 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();
    }

}

如何减少延迟?我尝试减少缓冲区,但问题仍然存在。

【问题讨论】:

  • 包含您的代码,不要发布指向外部站点的链接。 Stackoverflow 旨在帮助您和未来用户。您的链接将来可能无效,并且无法搜索。
  • 好的,我只是添加我的代码。你有解决办法吗?

标签: android audio media-player audio-streaming audio-recording


【解决方案1】:

根据测量对象和方法的不同,Android音频系统可能会有几十毫秒或几百毫秒的延迟。

如果测量播放和录制之间的延迟,40ms的延迟是正常值,实际上我在Android 4.4.3上的这个测试中看到了30~50ms的延迟值:

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

此外,如果您检查打印的“minBufferSize”值,您会发现此最小缓冲区大小为 40 毫秒(在我的 Nexus7 2013 上)。而且播放时会有帧延迟,我们不能指望在调用“at.write()”时立即播放,我猜内部还有另一个缓冲区来存储你的“写入”数据。在录音方面也是如此。因此,如果从播放开始函数调用到真正的声音输出进行测量,则延迟比 40 毫秒要多得多。
如果需要更多建议,您需要详细描述如何衡量延迟。

【讨论】:

  • 已经对此进行了广泛的讨论,我认为您的 40ms 数字可能比现实要低很多,尤其是在较旧的 Android 版本上。我似乎记得人们在端到端处理中看到了 150-250 毫秒的延迟。为了使它有用,您可能希望通过至少提供 40 毫秒适用于哪个 Android 版本来修改您的答案。
  • 我同意有时您会看到数百毫秒的延迟。正如我在上面的答案中提到的,这完全取决于您所说的延迟时间。如果你测量播放和录音之间的延迟,也许 Giancarlo 正在这样做,但我们没有得到他的详细描述,可能有几十个延迟。你可以在这里参考我的贴:link。如果你对此感兴趣,我的那个测试的源代码也可以在这里找到:link
  • 感谢@gary 提供链接。我认为@323go 批评的是您通过引用AudioRecord.getMinBufferSize 的结果来争论40ms,这实际上与延迟/延迟只有粗略的关系。主要组件分别由AudioRecord/AudioTrackread()/write()生产。
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多