当前位置: 首页 > 知识库问答 >
问题:

如何发布MTAudioProcessingTap?

桂学
2023-03-14

MTAudioProcessingTap的头文件说,它的初始化和准备回调将通过取消准备和结束回调来平衡。然而,在苹果的例子中,这些回调永远不会被调用(我添加了日志记录,以便我可以检查)。头文件说,当对象被释放时,它们将被调用。

在Apple的示例中,Tap被传递到audioMixInputParameters中的保留参数中,该参数被传递到音频混音中,不再公开访问:

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);

共有1个答案

闻人哲茂
2023-03-14

我也有同样的问题。为了使其工作,我必须重置播放器项的audioMix,点击处理器(苹果示例项目中的MYAudioTapProcessor),并手动释放MTAudioProcessingTapRef:

MTAudioProcessingTapRef tap = ((AVMutableAudioMixInputParameters *)_audioTapProcessor.audioMix.inputParameters[0]).audioTapProcessor;
_player.currentItem.audioMix = nil;
_audioTapProcessor = nil;
CFRelease(tap);

这会导致调用finaliz回调。

编辑:似乎不需要发布,请参阅注释。

 类似资料:
  • 我正在尝试发布我的Go包,以便它在doc搜索和go搜索中可见,并且可以使用安装。 然而,我发现的一个文档并没有清楚地告诉我如何生成和托管文档,或者如何发布包。如何发布我的软件包?

  • 我所拥有的是一个maven存储库(nexus),maven一直在向其发布。在我的构件存储库文件夹中的每个构件版本文件夹中都有标准的maven构件:maven-metadata.xml、jar和pom.xml等。 现在我想用gradle来解决这些问题。在我的gradle.build文件中,如果我将它们列为: 然后它们会正确地解决。但是,我想使用版本“latest.integration”,这样我就可

  • 如何发布npm模块 那么我们来发布一个吧,顺便学习一下如何发布npm模块 登陆npm 发布 ➜ require-dictory git:(master) ✗ nrm use npm Registry has been set to: https://registry.npmjs.org/ ➜ require-dictory git:(master) ✗ npm login Usern

  • 问题内容: 我读了一些将jsons发布到服务器的示例。 有人说: OkHttp是Java提供的HttpUrlConnection接口的实现。它提供用于编写​​内容的输入流,并且不知道(或不在乎)内容的格式。 现在,我想用名称和密码的参数对URL进行常规发布。 这意味着我需要自己将名称和值对编码为流? 问题答案: 当前接受的答案已过期。现在,如果您想创建一个发布请求并向其中添加参数,则应该使用Mul

  • 我有一个javaScript代码,其中我发送了带有一些参数的http post。Post参数是一个类似于以下内容的json: 在JavaScript中,我只是打开request、设置头和发送参数。Post请求如下所示: 现在我需要在Java中进行相同的调用(由于一些内部POC需求)。为此,我做了以下几点: 但这给了我错误。 提前道谢。

  • 问题内容: 我们通过Spring MVC公开了REST服务。我们使用a 记录异常。我们目前记录以下内容: 异常及其堆栈跟踪 网址 请求头 如果我们也可以记录JSON发布数据,则将使调试更加容易。关于如何获得此建议? 问题答案: 您需要一个过滤器,该过滤器可以在读取请求正文时保存请求正文,并在以后将保存的数据提供给异常记录器。 Spring包含做类似的事情。尽管它并不直接适合您的问题,但是您可以将其