Ios 如何为多个MTaudioProcessingTap取消准备并最终确定要触发的回调?

Ios 如何为多个MTaudioProcessingTap取消准备并最终确定要触发的回调?,ios,objective-c,avfoundation,Ios,Objective C,Avfoundation,在阅读了这篇文章之后:,按照chris的建议进行一次点击似乎是可行的,取消准备和完成回调被调用 但是,我有不止一个音轨,每个都有一个点击。与苹果的WWDC示例不同,myMYAudioTapProcessor不再生成音频混音,因为有多个音轨,因此为audioMix的inputParameters提供了多个AVMutableAudioMixInputParameters 当使用多个点击时,我在\u音频处理器中存储一个NSMUTABLE数组MYAudioTapProcessor,在包含AVPlayer

在阅读了这篇文章之后:,按照chris的建议进行一次点击似乎是可行的,取消准备和完成回调被调用

但是,我有不止一个音轨,每个都有一个点击。与苹果的WWDC示例不同,my
MYAudioTapProcessor
不再生成音频混音,因为有多个音轨,因此为
audioMix
inputParameters提供了多个
AVMutableAudioMixInputParameters

当使用多个点击时,我在
\u音频处理器
中存储一个NSMUTABLE数组
MYAudioTapProcessor
,在包含
AVPlayer
的视图控制器中强引用播放器
playerItem
audioMix
。在拆卸播放器时,我遵循以下模式:

for (int i = 0; i < _audioMix.inputParameters.count; i++) {
    MTAudioProcessingTapRef tap = ((AVMutableAudioMixInputParameters *)_audioMix.inputParameters[i]).audioTapProcessor;
                CFRelease(tap);
}
_audioMix = nil;
_playerItem = nil;
_player = nil;
_audioProcessors = nil;
for(int i=0;i<\u audioMix.inputParameters.count;i++){
MTAudioProcessingTapRef tap=((AVMutableAudioMixInputParameters*)_audioMix.inputParameters[i])audioTapProcessor;
cfr释放(tap);
}
_audioMix=零;
_playerItem=零;
_玩家=零;
_音频处理器=零;

然而,几乎每次tap的unprepare和finalize回调都不会被调用,而MTAudioProcessingTap会挂在内存中。存储和释放多个点击以确保每个点击的回调触发的正确方法是什么?

看起来引用的帖子是正确的方法

在我的情况下,这是一个无关的问题,拆除球员。事实证明,在
AVPlayer
上仍然有对
periodicTimeObservators
boundaryTimeObservators
的强烈引用会导致玩家逗留的时间超过预期


离开视图控制器时(我想销毁
AVPlayer
),我从他们的superview中删除了从
AVPlayer
创建的
AVPlayerLayer
,并将其置零,然后采取与上述相同的步骤,只是我没有用
CFRelease
释放各个点击。这是由nil-ing
\u audioMix
\u playerItem

解决的。是的,我认为让点击释放的困难根源在于所有使混音和播放器保持活力的强引用。似乎存在一个强大的引用循环,只有在删除您自己对这些类的引用之前,手动将这些类中的某些类的引用彼此置零,才能打破这个循环。在我的例子中是
audioMix.audioTapProcessor
MYAudioTapProcessor.audioMix
。我同意您不应该在tap CF对象上调用
CFRelease
,因为这样会破坏契约(您自己的代码中的
CFRetain
不会平衡),并会导致崩溃。应该调用CFRelease(tap)(可能是在将其分配给混合参数之后)。顾名思义,MTAudioProcessingTapCreate返回一个必须释放的对象(请参阅)