为啥我不能在 Mac Catalyst 上创建 AVAudioFile? (错误-54)

Posted

技术标签:

【中文标题】为啥我不能在 Mac Catalyst 上创建 AVAudioFile? (错误-54)【英文标题】:Why can't I create an AVAudioFile on Mac Catalyst? (error -54)为什么我不能在 Mac Catalyst 上创建 AVAudioFile? (错误-54) 【发布时间】:2021-07-23 19:19:23 【问题描述】:

我的应用程序允许用户从他们的 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。

【问题讨论】:

【参考方案1】:

哦,我刚刚发现了问题。我需要做的:

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

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

【讨论】:

以上是关于为啥我不能在 Mac Catalyst 上创建 AVAudioFile? (错误-54)的主要内容,如果未能解决你的问题,请参考以下文章

创建 Mac Catalyst App Store 配置文件时出现问题

Mac Catalyst textview 第一响应者

无法使用 Xcode 成功签署 Mac Catalyst 应用程序

UIMarkupTextPrintFormatter 和 Mac Catalyst

Swift UI 列出 Mac Catalyst 上不匹配的部分

Mac Catalyst ITMS-4241 错误上传二进制文件