В моем проекте 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
Я успешно могу передать filePath sample.mp3 (содержится в комплекте приложений) в audioPlayer с помощьюсначала конвертировать в URL.Вызов функции play () воспроизводит аудиофайл.
Однако, поскольку я создаю приложение музыкального проигрывателя, я хотел бы иметь возможность воспроизводить аудиофайл, который находится в папках каталогов, таких как рабочий стол, папка загрузок.и т. д. .... Но когда я пытаюсь передать filePath аудиофайла вне пакета приложения, код обрывается:
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 предназначены для доступа к ресурсам приложения.и связывать мультимедийные файлы, а также потоковое мультимедиа из Интернета.Но он не может воспроизвести мультимедиа из каталога.
Я обнаружил несколько потоков об этой проблеме, все они неполные или без ответа, например: https://forums.developer.apple.com/thread/18272
Так что, если AVKit не может сделать то, что я думалдолжна иметь, какую библиотеку или подход я могу использовать для доступа к файлам каталога?Приложения музыкального плеера для OSX, конечно, могут предложить пользователю отсканировать каталог и получить доступ к музыкальным файлам.Как они это делают?