Swift AVAudioPlayer (Xcode) - Воспроизведение аудио файла вне пакета приложения - PullRequest
0 голосов
/ 11 июня 2019

В моем проекте 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, конечно, могут предложить пользователю отсканировать каталог и получить доступ к музыкальным файлам.Как они это делают?

1 Ответ

0 голосов
/ 11 июня 2019

Кажется, что проблема здесь:

guard let filePath = filePathOptional else {
    print("ERROR: Failed to retrieve music file Path")
    return
}

Пожалуйста, измените печать на:

print("ERROR: Failed to retrieve music file Path \(error.localizedDescription)")

Я думаю, вы увидите, что проблема в том, что у вас нет доступа к этому файлу. По умолчанию у вас есть доступ только к песочнице вашего приложения и папке Desktop.

Также попробуйте поместить свой файл на рабочий стол и воспроизвести его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...