您如何找到音频延迟? (Windows/OSX)

Posted

技术标签:

【中文标题】您如何找到音频延迟? (Windows/OSX)【英文标题】:How do you find the audio latency ? (Windows/OSX) 【发布时间】:2016-06-09 14:54:27 【问题描述】:

我正在编写一个音乐应用程序,但我不知道 Ableton/Cubase/等应用程序如何找到系统的音频延迟(是吗?),以便在录制/播放时补偿时差。 意思是音频输入延迟(从麦克风到可用缓冲区)和音频输出延迟(从缓冲区到扬声器中的声音)。

这似乎比缓冲区大小的问题更复杂,因为在模拟音频和软件可以访问的数字数据之间发生了一个内部事件链。

知道如何(gu)估计吗?

【问题讨论】:

【参考方案1】:

CoreAudio:

property.mSelector = kAudioDevicePropertyLatency;
  if ( AudioObjectHasProperty( id, &property ) == true ) 
    result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &latency );

WASAPI:

IAudioClient::GetStreamLatency
IAudioClient*& captureAudioClient->GetStreamLatency( ( long long* ) &stream_.latency[mode] );
IAudioClient*& renderAudioClient->GetStreamLatency( ( long long* ) &stream_.latency[mode] );

ASIO:

long inputLatency, outputLatency;
ASIOGetLatencies( &inputLatency, &outputLatency );

ALSA:

snd_pcm_sframes_t frames;
snd_pcm_delay( handle, &frames );

OpenSL:

AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
Method m = am.getClass().getMethod("getOutputLatency", int.class);
latency = (Integer)m.invoke(am, AudioManager.STREAM_MUSIC);

另见:

uint32_t afLatency;
android::Audiosystem::getOutputLatency(&afLatency, ANDROID_DEFAULT_OUTPUT_STREAM_TYPE);

https://android.googlesource.com/platform/system/media/+/4f924ff768d761f53db6fa2dbfb794ba7a65e776/opensles/libopensles/android_AudioPlayer.cpp https://android.googlesource.com/platform/frameworks/av/+/006ceacb82f62a22945c7702c4c0d78f31eb2290/media/libmedia/AudioSystem.cpp

【讨论】:

【参考方案2】:

我不确定,但输出与输入相同,但有延迟。

如果您同时找到输入信号和输出信号的 FFT,则两者必须与输入非常相似。

对两个信号进行关联,你必须找到一个脉冲。 更高更细的脉冲,更相似的输入和输出。

从0到脉冲的时间,是信号之间的延迟时间。

同一信号的FFT的相关性是0处的一个脉冲。

同一信号延迟1seg的FFT的相关性是1s的脉冲。 等等

检查此链接 https://www.dsprelated.com/showarticle/26.php

【讨论】:

"输出与输入相同,有延迟"是什么意思?我提供的输出缓冲区不可能与我收到的输入缓冲区相同。我认为他们没有理由分享数据。 延迟是音频信号输入和输出之间的时间量。假设,我对着麦克风说话,我在扬声器里听到我的声音。如果你有输入音频信号和输出音频信号,你可以通过我说的这种方式知道延迟。 假设您向扬声器发送一个缓冲区,并从麦克风获取一个新缓冲区。显然缓冲区是不同的。 ,但两个信号的 FFT 非常相似。两者的相关性会给你一些像脉冲和一些噪音的东西。噪声是失真,脉冲是输入和输出信号的匹配。延迟延迟是脉冲的移动。 啊,我明白你的意思了。然而,我更多的是寻找一种纯粹的编程方式来估计延迟,因为我不能保证用户会使用扬声器(他可以使用耳机,因此没有声音会过滤回麦克风)。我猜像 Ableton 或 Cubase 这样的 DAW 有其他方法来估计。 好的。这种方式不知道

以上是关于您如何找到音频延迟? (Windows/OSX)的主要内容,如果未能解决你的问题,请参考以下文章

测量音频延迟

哪个 iOS 音频 API 设计用于以低延迟从磁盘流式传输大型本地音频文件?

播放多个连续音频文件后延迟

iPad鼓机触摸->音频延迟

在 Java 中从麦克风播放音频时减少延迟

iOS 中针对airplay、蓝牙和相关技术的近似音频延迟