Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:录制和收听音频_Android_Audio_Media Player_Audio Streaming_Audio Recording - Fatal编程技术网

Android:录制和收听音频

Android:录制和收听音频,android,audio,media-player,audio-streaming,audio-recording,Android,Audio,Media Player,Audio Streaming,Audio Recording,我试着实现一个录音并从不同的帖子中收听音频,但我有一个40毫秒的延迟 这是我的密码 public class record { private AudioRecord recorder = null; private boolean isRecording = false; private int SAMPLERATE = 8000; private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO;

我试着实现一个录音并从不同的帖子中收听音频,但我有一个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值,您会发现在我的Nexus7 2013上,该最小缓冲区大小为40ms。播放时会有帧延迟,我们不能期望在调用at.write时立即播放,我想在内部会有另一个缓冲区来存储您的写入数据。在录音方面也是如此。因此,如果从播放开始函数调用到实际声音输出进行测量,则延迟比40ms大得多。
如果需要更多建议,您需要详细描述如何衡量您的延迟。

包括您的代码,不要发布指向外部站点的链接。Stackoverflow旨在帮助您和未来的用户。你的链接将来可能会无效,并且不可搜索。好的,我只是添加我的代码。你有一个解决方案吗?关于这一点已经进行了广泛的讨论,我认为你的40毫秒数字可能比实际情况要低一些,尤其是在旧的Android版本上。我似乎记得人们在端到端处理中看到了150-250毫秒的延迟。为了使它有帮助,你可能想修改你的答案,至少提供40毫秒适用于哪个Android版本。我同意有时候你会看到数百毫秒的延迟。正如我在上面的回答中提到的,这完全取决于你所说的延迟时间。如果你测量播放和录制之间的延迟,可能是Giancarlo在做这件事,但我们没有得到他的详细描述,可能会有数十次延迟。您可以在此处参考我的粘贴:。如果你对此感兴趣,我的测试的源代码也可以在这里找到:。谢谢@gary的链接。我认为@323go批评的是,您通过参考AudioRecord.getMinBufferSize的结果来论证40ms,它实际上只是粗略地与延迟/延迟相关。主要部件分别由录音/录音和读/写产生。