在 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
编辑器建议我将 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 是什么。我只是按照示例代码来尝试实现我想做的事情。不幸的是,我无法在 Swift 中使用任何音频工具来做我想做的事情,这对我来说是下一个兔子洞。
感谢您的帮助。
【问题讨论】:
【参考方案1】:我终于在后来的 Swift 中找到了一些最近使用的代码。
我不需要初始化 trackRef 属性,这是导致错误出现在声明中的原因。我也不需要 try 方法。
以下是正确的声明方式:
var trackRef: ExtAudioFileRef?
err = ExtAudioFileOpenURL(url as CFURL, &trackRef)
现在是下一个兔子洞……
【讨论】:
以上是关于在 macOS 的 swift 5 中声明 ExtAudioFileRef 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
Swift 5 MacOS Image Resize 内存问题