我使用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”变量获得音频缓冲区的偏移量。当音频缓冲区出现在轨道中时。但我不知道用户何时会听到缓冲区。
有什么想法吗?