我刚刚为输入和输出实现了回调。我的应用正在接收和播放音频。我可以在输入和输出之间得到延迟吗?我不知道是怎么回事,因为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) {
.
.
.
}
答案 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);