Ios 如何释放MTAudioProcessingTap?
MTAudioProcessingTap的头文件指出,它的初始化和准备回调将通过取消准备和完成回调来平衡。然而,在中,这些回调永远不会被调用(我将日志添加到它们中,以便检查)。头文件表示,当对象被解除分配时,将调用它们 在苹果的例子中,点击被传递到audioMixInputParameters中的一个保留参数中,该参数被传递到audio mix中,在那里它不再是公共可访问的:Ios 如何释放MTAudioProcessingTap?,ios,objective-c,macos,avfoundation,Ios,Objective C,Macos,Avfoundation,MTAudioProcessingTap的头文件指出,它的初始化和准备回调将通过取消准备和完成回调来平衡。然而,在中,这些回调永远不会被调用(我将日志添加到它们中,以便检查)。头文件表示,当对象被解除分配时,将调用它们 在苹果的例子中,点击被传递到audioMixInputParameters中的一个保留参数中,该参数被传递到audio mix中,在那里它不再是公共可访问的: MTAudioProcessingTapRef audioProcessingTap; if (noErr == MTA
MTAudioProcessingTapRef audioProcessingTap;
if (noErr == MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks, kMTAudioProcessingTapCreationFlag_PreEffects, &audioProcessingTap))
{
audioMixInputParameters.audioTapProcessor = audioProcessingTap;
CFRelease(audioProcessingTap);
audioMix.inputParameters = @[audioMixInputParameters];
_audioMix = audioMix;
}
因此,我希望AudioMix负责以自己的dealloc方法发布它,并在相关PlayerItem发布时发布AudioMix
苹果的例子使用了一个只播放一个项目的AVPlayer,所以它可能不需要直接取消分配任何东西。但在我的例子中,我使用的是一个AVQueuePlayer,所以我不断地向它传递新的AVPlayerItems。我认为它泄漏了我为每个播放器项目(以及相关的音频单元)创建的点击,即使播放器项目被取消分配
当我处理完MTAudioProcessingTap关联的玩家项目后,解除分配MTAudioProcessingTap并使其取消准备并最终完成回调以触发的正确方法是什么
更新:我发现它实际上仍然可以通过音频混音访问,但这样释放它不会触发取消准备和完成回调:
((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor = nil;
这也不是:
MTAudioProcessingTapRef audioProcessingTap = ((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor;
CFRelease(audioProcessingTap);
我也有同样的问题。为了使其正常工作,我必须重置播放器项的
audioMix
、tap处理器(MYAudioTapProcessor
,在苹果的示例项目中),并手动释放MTAudioProcessingTapRef
:
MTAudioProcessingTapRef tap = ((AVMutableAudioMixInputParameters *)_audioTapProcessor.audioMix.inputParameters[0]).audioTapProcessor;
_player.currentItem.audioMix = nil;
_audioTapProcessor = nil;
CFRelease(tap);
这会导致调用finalize
回调
编辑:似乎不需要发布
CFRelease
,请参阅评论。谢谢!我要补充的是,这也会导致调用unprepare回调(在finalize之前)。此外,有时我的playerItem被释放得太早(在finalize回调之前),因此我在MYAudioTapProcessor中添加了对playerItem的强引用,并使用该引用。所以我替换了\u player.currentItem.audioMix=nil代码>带有\u audioTapProcessor.playerItem.audioMix=nil代码>。我还要补充一点,如果您要继续使用AVPlayer,则不应在点击时调用CFRelease,因为点击会被过度释放。当您使用新的点击继续播放音频时,将触发旧的unprepare和finalize回调。应调用CFRelease(点击)(可能在将其分配给mix参数后)。顾名思义,MTAudioProcessingTapCreate返回一个对象,对于我必须替换的swift版本,您必须释放(请参阅)CFRelease(tap)使用点击.release()
,进行编码>。希望有帮助。@glm4在Swift中您不能释放MTProcessingTap对象。release()方法在Unmanaged中可用,但是从上面的答案来看,您是如何做到的?