3

阅读这篇文章后:如何发布 MTAudioProcessingTap?,按照克里斯的建议,一键点击似乎有效,并且调用了 unprepare 和 finalize 回调。

但是,我有不止一个音轨和一个水龙头。与 Apple 的 WWDC 示例不同,我MYAudioTapProcessor不再生成音频混合,因为有多个音轨,因此多个AVMutableAudioMixInputParameters给了audioMix's inputParameters

使用多次点击时,我将MYAudioTapProcessors的 NSMutableArray 存储在_audioProcessors对播放器的强引用playerItemaudioMix包含AVPlayer. 拆除播放器时,我遵循以下模式:

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;

然而几乎每次,水龙头的 unprepare 和 finalize 回调之一都不会被调用,并且 MTAudioProcessingTap 会在内存中徘徊。存储和取消分配多个点击以确保每个点击的回调触发的正确方法是什么?

4

1 回答 1

1

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

就我而言,拆掉播放器是一个无关紧要的问题。事实证明,有强烈的引用periodicTimeObserversboundaryTimeObservers仍然在AVPlayer导致玩家停留的时间比预期的要长。

离开视图控制器时(我想销毁 的时间),我从他们的超级视图中删除了从 s 创建的AVPlayer任何s 并将它们归零,然后采取与上述相同的步骤,除了我没有释放单个水龙头. 这由 nil-ing和.AVPlayerLayerAVPlayerCFRelease_audioMix_playerItem

于 2013-10-14T23:13:14.440 回答