我正在写一个音乐应用程序,但我不知道Ableton / Cubase等等应用程序如何找到系统的音频延迟(他们?),这样他们可以在录制/播放时补偿时差 . 含义,音频输入延迟(从麦克风到可用缓冲区)和音频输出延迟(从缓冲区到扬声器中的声音) .
它似乎比缓冲区大小更复杂,因为内部事件链发生在模拟音频和软件可访问的数字数据之间 .
知道如何(古)估计吗?
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
我不确定,但输出与输入相同,有延迟 .
如果您发现输入信号的FFT和输出信号的FFT,同时两者必须非常相似 .
对两个信号进行相关,您必须找到一个脉冲 . 脉冲越来越高,输入和输出更相似 .
从0到脉冲的时间是信号之间的延迟时间 .
相同信号的FFT的相关性是0的脉冲 .
延迟1 seg的相同信号的FFT的相关性是1s的脉冲 . 等等
检查此链接https://www.dsprelated.com/showarticle/26.php
2 回答
CoreAudio:
WASAPI:
ASIO:
ALSA:
OpenSL:
也可以看看:
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
我不确定,但输出与输入相同,有延迟 .
如果您发现输入信号的FFT和输出信号的FFT,同时两者必须非常相似 .
对两个信号进行相关,您必须找到一个脉冲 . 脉冲越来越高,输入和输出更相似 .
从0到脉冲的时间是信号之间的延迟时间 .
相同信号的FFT的相关性是0的脉冲 .
延迟1 seg的相同信号的FFT的相关性是1s的脉冲 . 等等
检查此链接https://www.dsprelated.com/showarticle/26.php