我正在为Android编写应用程序,我的目标是记录用户的歌声。录音后,我播放与乐器同步的录音(这不是问题)。
问题是当我在播放音频的同时开始录音时我怀疑录音开始有延迟:(当录音录制乐器后我尝试播放录音时会很明显) 。关于nexus 5,延迟可能约为300毫秒。
我的询问是:
如何摆脱延迟?
答案 0 :(得分:4)
正如@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,不确定在录制开始后是否立即通知您,或者是否在实际开始之前通知您。你必须在那里做一些测试。
答案 1 :(得分:4)
是所有Android设备上的延迟常数(4.0 +)?
The delay为not constant,因为至少音频往返延迟is not constant。
您可以确定延迟不是恒定的,因为它还取决于:
实际的音频硬件编解码器:某些编解码器启动较慢。例如,请查看the adc_ramp_work
function in this code: it is doing a slow start on the codec。
音频在处理链中缓冲的方式:缓冲区大小为4096个样本(size used on most samsung phones),显然会比1024个样本缓冲区增加更多延迟。
如何在不涉及复杂方法的情况下计算延迟? You can't.(没有复杂的方法)。
AudioTrack API报告的音频延迟仅是软件延迟。和measuring the latency is not a simple task一样,您可以看到in the official documentation。
如何摆脱延迟?
这是一个好消息:你可能不需要摆脱延迟,只要你在录制完成后就开始播放。
杰弗里的解决方案是一个很好的开始。请注意,您需要读取()数据,否则您的回调将不会被调用。
在移动设备上是否可以接受,打开录音并将其缩放为乐器(可能涉及音频解码/编码)?
AudioTrack.setVolume()为您提供了一种扩展音轨的简单方法。自动查找缩放因子可能非常棘手:您需要估计录音的响度以及乐器的响度。
我建议你使用一个更简单的解决方案:在你的用户界面上提供一个滑块,允许你的用户调整乐器和录音之间的混音(在后台使用AudioTrack.setVolume
)。这样,您可以确保乐器/语音比率真正符合用户的口味。