0

我的应用程序允许用户从他们的 iTunes 媒体库中选择一个录音,然后保存媒体 ID 以供以后播放。从媒体 ID,我可以MPMediaQuery用来获取MPMediaItem,然后获取录制 URL:

let recordingURL = mediaItem?.value(forProperty: MPMediaItemPropertyAssetURL) as? URL

从 URL 中,我创建了一个AVAudioFile我可以提供给一个AVAudioPlayerNode以供播放的:

do {
    let audioUnitFile = try AVAudioFile(forReading: recordingURL)
} catch let error {
    NSLog("error loading AVAudioFile: " + error.localizedDescription)
}

这一切都在 iOS 上运行良好。在 Mac Catalyst 上,我可以获得一个有效的 URL(在调试器中检查它时我可以看到它是正确的),但该AVAudioFile:forReading函数会引发此错误:

ExtAudioFile.cpp:193:Open: about to throw -54: open audio file
[avae]            AVAEInternal.h:109   [AVAudioFile.mm:134:AVAudioFileImpl: (ExtAudioFileOpenURL((CFURLRef)fileURL, &_extAudioFile)): error -54
error loading AVAudioFile: The operation couldn’t be completed. (com.apple.coreaudio.avfaudio error -54.)

我检查了 Mac 设置应用程序中的隐私设置,我的应用程序有权访问音乐库。我还能检查什么?错误 -54 是什么意思?Mac Catalyst 应用程序是否支持此功能?

我在 macOS 11.4 上使用 Xcode 12.5.1。

4

1 回答 1

0

哦,我才发现问题。我需要做:

recordingURL?.startAccessingSecurityScopedResource()
let audioUnitFile = try AVAudioFile(forReading: recordingURL)
recordingURL?.stopAccessingSecurityScopedResource()

我正在对其他文件执行此操作,但由于某种原因,我不认为对媒体库文件执行此操作。

于 2021-07-23T19:29:18.103 回答