Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何释放MTAudioProcessingTap?_Ios_Objective C_Macos_Avfoundation - Fatal编程技术网

Ios 如何释放MTAudioProcessingTap?

Ios 如何释放MTAudioProcessingTap?,ios,objective-c,macos,avfoundation,Ios,Objective C,Macos,Avfoundation,MTAudioProcessingTap的头文件指出,它的初始化和准备回调将通过取消准备和完成回调来平衡。然而,在中,这些回调永远不会被调用(我将日志添加到它们中,以便检查)。头文件表示,当对象被解除分配时,将调用它们 在苹果的例子中,点击被传递到audioMixInputParameters中的一个保留参数中,该参数被传递到audio mix中,在那里它不再是公共可访问的: MTAudioProcessingTapRef audioProcessingTap; if (noErr == MTA

MTAudioProcessingTap的头文件指出,它的初始化和准备回调将通过取消准备和完成回调来平衡。然而,在中,这些回调永远不会被调用(我将日志添加到它们中,以便检查)。头文件表示,当对象被解除分配时,将调用它们

在苹果的例子中,点击被传递到audioMixInputParameters中的一个保留参数中,该参数被传递到audio mix中,在那里它不再是公共可访问的:

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中可用,但是从上面的答案来看,您是如何做到的?