我一直在研究音频应用程序,可以在其中找到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)
现在为下一个兔子洞...