Swift AVAudioPlayer (Xcode) - 在应用程序包外播放音频文件
Swift AVAudioPlayer (Xcode) - Play Audio File Outside Application Bundle
在我的 Xcode 项目中,我设置了以下代码(简化代码):
import Cocoa
import AVKit
class ViewController: NSViewController {
var audioPlayer = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
do {
guard let filePath = Bundle.main.path(forResource: "sample", ofType: "mp3") else {
print("ERROR: Failed to retrieve music file Path")
return
}
let fileURL = URL.init(fileURLWithPath: filePath)
print(" PATH: \(filePath)")
print(" URL: \(fileURL)")
try audioPlayer = AVAudioPlayer.init(contentsOf: fileURL)
} catch {
print("ERROR: Failed to retrieve music file URL")
}
audioPlayer.play()
}
}
//CONSOLE PRINTS ----------:
// PATH: /Users/vakho/Library/Developer/Xcode/DerivedData/MusicPlayer-foqzsckozmcjnofvlvhuwabfssqi/Build/Products/Debug/MusicPlayer.app/Contents/Resources/sample.mp3
// URL: file:///Users/vakho/Library/Developer/Xcode/DerivedData/MusicPlayer-foqzsckozmcjnofvlvhuwabfssqi/Build/Products/Debug/MusicPlayer.app/Contents/Resources/sample.mp3
我通过首先转换为 URL 成功地将 sample.mp3 的文件路径(包含在应用程序包中)传递给 audioPlayer。调用 play() 函数播放音频文件。
但是,由于我正在创建一个音乐播放器应用程序,我希望能够播放位于目录文件夹(例如桌面、下载文件夹等)中的音频文件....但是当我尝试在应用程序包外传递音频文件的文件路径,代码中断:
import Cocoa
import AVKit
class ViewController: NSViewController {
var audioPlayer = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
do {
let filePathOptional: String? = "/Users/vakho/Downloads/sample.mp3"
guard let filePath = filePathOptional else {
print("ERROR: Failed to retrieve music file Path")
return
}
let fileURL = URL.init(fileURLWithPath: filePath)
print(" PATH: \(filePath)")
print(" URL: \(fileURL)")
try audioPlayer = AVAudioPlayer.init(contentsOf: fileURL)
} catch {
print("ERROR: Failed to retrieve music file URL")
}
audioPlayer.play()
}
}
//CONSOLE PRINTS ----------:
// PATH: /Users/vakho/Downloads/sample.mp3
// URL: file:///Users/vakho/Downloads/sample.mp3
//ERROR: Failed to retrieve music file URL
//ERRORS ----------:
// (lldb)
// Thread 1: EXC_BAD_ACCESS (code=1, address=0x38)
据我所知,AVAudioPlayer 和 AVKit 库专为访问应用程序资产和捆绑媒体文件以及来自 Internet 的流媒体而设计。但是它无法播放目录中的媒体。
我发现了几个关于这个问题的帖子,所有帖子都不完整或没有答案,例如:https://forums.developer.apple.com/thread/18272
所以如果 AVKit 不能做我认为它应该做的事情,我可以使用什么库或方法来访问目录文件? OSX 的音乐播放器应用程序当然能够提示用户扫描目录和访问音乐文件。他们是怎么做到的?
看来问题出在这里:
guard let filePath = filePathOptional else {
print("ERROR: Failed to retrieve music file Path")
return
}
请将打印更改为:
print("ERROR: Failed to retrieve music file Path \(error.localizedDescription)")
我想您会发现问题在于您无权访问此文件。
默认情况下,您只能访问应用程序和桌面文件夹的沙箱。
也尝试将您的文件放到桌面并播放。
在我的 Xcode 项目中,我设置了以下代码(简化代码):
import Cocoa
import AVKit
class ViewController: NSViewController {
var audioPlayer = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
do {
guard let filePath = Bundle.main.path(forResource: "sample", ofType: "mp3") else {
print("ERROR: Failed to retrieve music file Path")
return
}
let fileURL = URL.init(fileURLWithPath: filePath)
print(" PATH: \(filePath)")
print(" URL: \(fileURL)")
try audioPlayer = AVAudioPlayer.init(contentsOf: fileURL)
} catch {
print("ERROR: Failed to retrieve music file URL")
}
audioPlayer.play()
}
}
//CONSOLE PRINTS ----------:
// PATH: /Users/vakho/Library/Developer/Xcode/DerivedData/MusicPlayer-foqzsckozmcjnofvlvhuwabfssqi/Build/Products/Debug/MusicPlayer.app/Contents/Resources/sample.mp3
// URL: file:///Users/vakho/Library/Developer/Xcode/DerivedData/MusicPlayer-foqzsckozmcjnofvlvhuwabfssqi/Build/Products/Debug/MusicPlayer.app/Contents/Resources/sample.mp3
我通过首先转换为 URL 成功地将 sample.mp3 的文件路径(包含在应用程序包中)传递给 audioPlayer。调用 play() 函数播放音频文件。
但是,由于我正在创建一个音乐播放器应用程序,我希望能够播放位于目录文件夹(例如桌面、下载文件夹等)中的音频文件....但是当我尝试在应用程序包外传递音频文件的文件路径,代码中断:
import Cocoa
import AVKit
class ViewController: NSViewController {
var audioPlayer = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
do {
let filePathOptional: String? = "/Users/vakho/Downloads/sample.mp3"
guard let filePath = filePathOptional else {
print("ERROR: Failed to retrieve music file Path")
return
}
let fileURL = URL.init(fileURLWithPath: filePath)
print(" PATH: \(filePath)")
print(" URL: \(fileURL)")
try audioPlayer = AVAudioPlayer.init(contentsOf: fileURL)
} catch {
print("ERROR: Failed to retrieve music file URL")
}
audioPlayer.play()
}
}
//CONSOLE PRINTS ----------:
// PATH: /Users/vakho/Downloads/sample.mp3
// URL: file:///Users/vakho/Downloads/sample.mp3
//ERROR: Failed to retrieve music file URL
//ERRORS ----------:
// (lldb)
// Thread 1: EXC_BAD_ACCESS (code=1, address=0x38)
据我所知,AVAudioPlayer 和 AVKit 库专为访问应用程序资产和捆绑媒体文件以及来自 Internet 的流媒体而设计。但是它无法播放目录中的媒体。
我发现了几个关于这个问题的帖子,所有帖子都不完整或没有答案,例如:https://forums.developer.apple.com/thread/18272
所以如果 AVKit 不能做我认为它应该做的事情,我可以使用什么库或方法来访问目录文件? OSX 的音乐播放器应用程序当然能够提示用户扫描目录和访问音乐文件。他们是怎么做到的?
看来问题出在这里:
guard let filePath = filePathOptional else {
print("ERROR: Failed to retrieve music file Path")
return
}
请将打印更改为:
print("ERROR: Failed to retrieve music file Path \(error.localizedDescription)")
我想您会发现问题在于您无权访问此文件。 默认情况下,您只能访问应用程序和桌面文件夹的沙箱。
也尝试将您的文件放到桌面并播放。