首页 文章

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

提问于
浏览
0

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

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

知道如何(古)估计吗?

2 回答

  • 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

  • 0

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

    如果您发现输入信号的FFT和输出信号的FFT,同时两者必须非常相似 .

    对两个信号进行相关,您必须找到一个脉冲 . 脉冲越来越高,输入和输出更相似 .

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

    相同信号的FFT的相关性是0的脉冲 .

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

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

相关问题