我一直在研究音频应用程序,可以在其中找到ExtAudioFile中的特定点,并将代表特定播放长度(时间)的特定数量的帧加载到AVAudioPCMBuffer中并开始播放。如果用户在该音频片段的播放过程中选择了一个复选框,则缓冲区将被馈送音频文件的其余内容,以便播放到最后。
但是,我遇到了障碍。我发现了加载这些资源的较旧的代码示例。他们以这种方式宣布对我而言, call 在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'(aka'Optional.Type')的值转换为预期的参数类型'UnsafeMutablePointer '(aka'UnsafeMutablePointer ')。”
编辑器建议我将trackRef声明更改为ver trackRef = ExtAudioFileRef?()var trackRef = ExtAudioFileRef?.self,但这些都无济于事,因为如果我尝试使用第一个建议,则会得到“无法为'ExtAudioFileRef类型调用初始化器?”没有参数”和显示为“1.'ExtAudioFileRef?的重载”的灰色注释。存在以下部分匹配的参数列表:(包装),(来自:解码器),(nilLiteral :())。”但是err = ExtAudioFileOpenURL(url as CFURL, trackRef)的错误消失了。如果我尝试使用第二个建议let trackRef = ExtAudioFileRef?.self,则该行没有错误,但是在err = ExtAudioFileOpenURL(url as CFURL, trackRef)线上却出现错误,提示“无法将类型'ExtAudioFileRef?.Type'(aka'Optional.Type')的值转换为预期值参数类型'UnsafeMutablePointer '(又名'UnsafeMutablePointer ')”
我不太了解这些错误的含义,因为我不知道UnsafeMutablePointer是什么。我只是按照示例代码来尝试实现我想做的事情。不幸的是,我无法在Swift中获得任何音频工具来完成我想做的事情,这对我来说是下一个难题。
谢谢你的帮助。

最佳答案

我终于在以后的Swift中找到了一些使用此功能的最新代码。
我不需要初始化trackRef属性,这是导致错误出现在声明中的原因。我也不需要try方法。
这是声明它的正确方法:

var trackRef: ExtAudioFileRef?
err = ExtAudioFileOpenURL(url as CFURL, &trackRef)
现在为下一个兔子洞...

10-07 20:54