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

问题描述 投票:0回答:2

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

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

知道如何(gu)估计吗?

windows macos audio latency wasapi
2个回答
4
投票

核心音频:

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


0
投票

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

如果你同时找到输入信号和输出信号的 FFT,两者一定与输入非常相似。

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

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

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

同一信号延迟1seg的FFT的相关性是1s处的脉冲。 就这样吧

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

© www.soinside.com 2019 - 2024. All rights reserved.