如何确定Core Audio中音频输入和输出之间的延迟?

时间:2013-12-16 12:45:11

标签: objective-c core-audio

我刚刚为输入和输出实现了回调。我的应用正在接收和播放音频。我可以在输入和输出之间得到延迟吗?我不知道是怎么回事,因为AudioBufferList结构中没有识别器。每个缓冲区的内存地址都相同。谢谢你的回复!

static void inputCallback(id receiver,
                      AEAudioController  *audioController,
                      void  *source,
                      const AudioTimeStamp *time,
                      UInt32 frames,
                      AudioBufferList *audio) {
AEPlaythroughChannel *THIS = receiver;
.
.
.
}

和输出

static OSStatus renderCallback(id channel,
                           AEAudioController *audioController,
                           const AudioTimeStamp *time,
                           UInt32 frames,
                           AudioBufferList *audio) {
.
.
.
}

2 个答案:

答案 0 :(得分:1)

您可以设置首选延迟

Float32 aBufferLength = 0.005; // In seconds
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(aBufferLength), &aBufferLength);

if (noErr != err) {
    NSLog(@"Cannot set preferred audio buffer duration");
}

将尝试将缓冲区大小设置为与大小匹配的缓冲区大小(以秒为单位)。延迟大致在这个大小附近。

答案 1 :(得分:1)

您可能希望获得实际使用的缓冲时间。设置缓冲区持续时间时,它只是您首选值的建议。音频系统通常会选择接近您设置值的内容。它不总是倾听的原因是它选择的值通常基于2的幂和你的采样率。所以只是因为你把它设置为0.005并不意味着它实际上会使用0.005。查询设置首选值后使用的实际值。

// set your preferred duration
Float32 aBufferLength = 0.005; // In seconds
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(aBufferLength), &aBufferLength);


// now get the actual duration used
UInt32 size;
Float32 bufferDuration;
size = sizeof(bufferDuration);
err = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration,&size, &bufferDuration);
NSLog(@"The actual buffer duration used is %f",bufferDuration);