0

我一直在开发一个音频应用程序,我可以在其中寻找 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<ExtAudioFileRef?>'(又名'UnsafeMutablePointer<Optional>')。”

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

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

谢谢你的帮助。

4

1 回答 1

0

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

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

这是声明它的正确方法:

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

现在为下一个兔子洞...

于 2020-09-16T15:28:53.333 回答