在 macOS 的 swift 5 中声明 ExtAudioFileRef 的正确方法

Posted

技术标签:

【中文标题】在 macOS 的 swift 5 中声明 ExtAudioFileRef 的正确方法【英文标题】:Proper way to declare ExtAudioFileRef in swift 5 for macOS 【发布时间】:2020-09-16 13:51:57 【问题描述】:

我一直在开发一个音频应用程序,我可以在其中寻找 ExtAudioFile 中的特定点,并将表示特定播放长度(时间)的特定数量的帧加载到 AVAudioPCMBuffer 中并开始播放。如果用户在播放该音频片段期间选择了一个复选框,则缓冲区会被输入音频文件的剩余内容,以便播放到最后。

但是,我遇到了障碍。我发现了加载这些资源的旧代码示例。他们声明调用的方式对我来说在 Swift 5 中不起作用。我收到错误。具体来说:

import Cocoa
import AVFoundation
import AudioToolbox

do 
   var err:OSStatus = noErr
   let url = URL(fileURLWithPath: "./audio files/myAudioFile.mp3")
   let track = try AVAudioFile(forReading: url)
   var trackRef = ExtAudioFileRef?
   err = try ExtAudioFileOpenURL(url as CFURL, trackRef)
 catch 
   print(error)

我得到的第一个错误是 trackRef。编辑器将此行标记为“类型名称后的预期成员名称或构造函数调用”。但是我下面的例子只声明了上面代码中所示的属性。

下一行err = try ExtAudioFileOpenURL(orl as CFURL, trackRef) 有错误“无法将类型'ExtAudioFileRef?.Type'(又名'Optional.Type')的值转换为预期的参数类型'UnsafeMutablePointer'(又名'UnsafeMutablePointer' )。”

编辑器建议我将 trackRef 声明更改为 ver trackRef = ExtAudioFileRef?()var trackRef = ExtAudioFileRef?.self,但这些都没有任何帮助,因为如果我尝试使用第一个建议,我会得到“无法为类型 'ExtAudioFileRef 调用初始化程序?'没有参数”和显示“1. 'ExtAudioFileRef?' 的重载”的灰色注释存在这些部分匹配的参数列表:(Wrapped),(来自:解码器),(nilLiteral:())。“但是err = ExtAudioFileOpenURL(url as CFURL, trackRef)的错误消失了。如果我尝试使用第二个建议let trackRef = ExtAudioFileRef?.self,则该行没有错误,但随后我在err = ExtAudioFileOpenURL(url as CFURL, trackRef) 行上收到错误消息“Cannot convert value of type 'ExtAudioFileRef?.Type' (aka ' Optional.Type')到预期的参数类型'UnsafeMutablePointer'(又名'UnsafeMutablePointer')

我不知道这些错误是什么意思,因为我不知道 UnsafeMutablePointer 是什么。我只是按照示例代码来尝试实现我想做的事情。不幸的是,我无法在 Swift 中使用任何音频工具来做我想做的事情,这对我来说是下一个兔子洞。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我终于在后来的 Swift 中找到了一些最近使用的代码。

我不需要初始化 trackRef 属性,这是导致错误出现在声明中的原因。我也不需要 try 方法。

以下是正确的声明方式:

var trackRef: ExtAudioFileRef?
err = ExtAudioFileOpenURL(url as CFURL, &trackRef)

现在是下一个兔子洞……

【讨论】:

以上是关于在 macOS 的 swift 5 中声明 ExtAudioFileRef 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

iTunesLibrary Swift 5.3 macOS

Swift 5 MacOS Image Resize 内存问题

Xcode Swift 5 MacOs 应用程序存档时为空窗口,但在从 Xcode 运行时有效

Swift更加开放,不再限于macOS与Ubuntu

在 Swift (macOS) 中控制背景音乐

如何在 macOS 应用程序中使用 swift 播放视频?