iOS Core Audio:如何通过Audio Processing Tap传递缓冲区的输出时间?

时间:2014-12-18 10:37:27

标签: ios objective-c audio core-audio

我使用AVPlayer输出声音&它的可视化。我的问题是,一大块声音的可视化是时移的,并且在用户听到该块之前发生。这是因为缓冲化。

播放新的音频缓冲区〜比处理时间晚0.2秒(我想在我的情况下总共有3个缓冲区)。

我的可视化在处理后立即发生。声音和声音可视化不是同步的。

看起来很难看。我知道我可以硬编码这些0.2秒延迟(确切地说是2 * 4096/44100秒),但这将是一个kludge。我的蓝牙音箱也有更高的延迟(约0.5-1.0秒)。

我想知道如何确定缓冲区的延迟,或者如果它甚至可以在iOS上使用。 (拒绝核心音频或AVPlayer是一个选项,但这是不可取的。)

我可以通过MTAudioProcessingTapGetSourceAudio获取音频:

OSStatus MTAudioProcessingTapGetSourceAudio(
        MTAudioProcessingTapRef tap,
        CMItemCount numberFrames,
        AudioBufferList *bufferListInOut,
        MTAudioProcessingTapFlags *flagsOut,
        CMTimeRange *timeRangeOut,
        CMItemCount *numberFramesOut);

MTAudioProcessingTapProcessCallback内:

 typedef void (*MTAudioProcessingTapProcessCallback)(
        MTAudioProcessingTapRef tap,
        CMItemCount numberFrames,
        MTAudioProcessingTapFlags flags,
        AudioBufferList *bufferListInOut,
        CMItemCount *numberFramesOut,
        MTAudioProcessingTapFlags *flagsOut);

我可以通过“timeRangeOut”变量获得音频缓冲区的偏移量。当音频缓冲区出现在​​轨道中时。但我不知道用户何时会听到缓冲区。

有什么想法吗?

0 个答案:

没有答案