Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.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_Audio Recording - Fatal编程技术网

Android 录音延迟

Android 录音延迟,android,audio,audio-recording,Android,Audio,Audio Recording,我正在为Android编写一个应用程序,我的目标是记录用户的歌声。录音后,我播放与器乐同步的唱片(这不是问题) 问题是,当我在播放音频的同时开始录制时,我怀疑录制开始有延迟:(当我稍后尝试播放录制时,当录制也录制了乐器时,这一点很明显)。Nexus5上的延迟可能在300毫秒左右 我的查询是: 所有安卓设备(4.0+)上的延迟是否为常数 如何计算无延迟 在移动设备上打开录音并缩放是否可以接受 到乐器(可能涉及音频解码/编码) 如何消除延迟?正如@Lukos已经提到的,延迟很可能取决于处理速度。

我正在为Android编写一个应用程序,我的目标是记录用户的歌声。录音后,我播放与器乐同步的唱片(这不是问题)

问题是,当我在播放音频的同时开始录制时,我怀疑录制开始有延迟:(当我稍后尝试播放录制时,当录制也录制了乐器时,这一点很明显)。Nexus5上的延迟可能在300毫秒左右

我的查询是:

  • 所有安卓设备(4.0+)上的延迟是否为常数
  • 如何计算无延迟
  • 在移动设备上打开录音并缩放是否可以接受 到乐器(可能涉及音频解码/编码)

如何消除延迟?

正如@Lukos已经提到的,延迟很可能取决于处理速度。启动录音机只是需要一些时间

我相信您最好的解决方案是先启动录音机,然后在您知道录音机启动后立即开始音频播放。这样你的录音会有一些延迟,但至少你是同步的。您需要确保播放已初始化,以便尽快开始播放

这可以通过使用AudioRecorder回调来实现

// Assuming you have a recorder objects defined somewhere
AudioRecord recorder;

recorder.setNotificationMarkerPosition(1);
recorder.setRecordPositionUpdateListener(new AudioRecord.OnRecordPositionUpdateListener() {
    @Override
    public void onMarkerReached(AudioRecord recorder) {
        // start audio playback
    }

    @Override
    public void onPeriodicNotification(AudioRecord recorder) {

    }
});

请注意,我不确定标记的位置。您也可以使用0,但不确定这是否会在录制开始后立即向您发出通知,或者是在录制实际开始之前发出通知。您必须在那里做一些测试。

是所有Android设备(4.0+)上的延迟常数吗?

是,因为至少音频往返延迟

您可以确保延迟不是恒定的,因为它还取决于:

  • 实际的音频硬件编解码器:某些编解码器启动缓慢。例如,看看

  • 音频在处理链中的缓冲方式:4096个样本(the)的缓冲区大小显然会比1024个样本的缓冲区增加更多的延迟

如何在不涉及复杂方法的情况下计算延迟? (没有复杂的方法)

AudioTrack API报告的音频延迟只是软件延迟。正如你所看到的

如何消除延迟?

这是一个好消息:你可能不需要消除延迟,只要你在录音真正开始后就开始播放

杰弗里的解决方案是一个伟大的开端。请注意,您需要读取()数据,否则您的回调将不会被调用

在移动设备上打开录音并将其缩放到乐器(可能涉及音频解码/编码)是否可以接受?

为您提供了缩放轨迹的简单方法。自动找到比例因子可能相当棘手:您需要估计录音的响度,以及乐器的响度


我建议您使用更简单的解决方案:在UI上提供一个滑块,允许用户调整乐器和录音之间的混合(在后台使用
AudioTrack.setVolume
)。通过这种方式,您可以确定乐器/声音的比例确实符合用户的口味。

我认为延迟不是恒定的,我认为它取决于处理速度。也许你可以在滴答声中加上一个计数之类的。我一回去工作就会试试这个。我会让你了解最新情况。谢谢你的回答!很抱歉没有给你赏金。我用你们两个回答的信息来解决我的问题。我感到很难过,因为我不能分享一半的赏金。谢谢你的详细回答。我正在实施杰弗里的解决方案。你的信息真的很有价值!