Не удается найти медиафайл в каталоге в Xcode - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь просто воспроизвести звук в формате MP3 (который я включил в каталог проекта в папке "files"). Это фрагмент, который я использовал:

import Foundation
import AVFoundation
import Cocoa
import Speech


var sound = AVAudioPlayer()
let path = Bundle.main.path(forResource: "this", ofType: "mp3")

do {
    sound = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path!)) //line 19
}
catch {
    print("ERROR")
}
sound.play()

Имя файла - this.mp3. Проблема возникает в строке 19 с ошибкой: «Неустранимая ошибка: неожиданно обнаружено значение nil при развертывании необязательного значения: файл». Я читал об этой ошибке, поэтому мне кажется, что моя программа не может найти файл.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 06 мая 2020

Edit 3

После уточнения комментариев OP пишет Command Line Application ...

Убедитесь, что ваш аудиофайл включен следующим образом:

enter image description here

Тогда (очень упрощенный) пример тестового кода может быть:

import Foundation
import AVFoundation

class AudioTest {

    var sound = AVAudioPlayer()

    func testMP3() -> Void {

        let bundle = Bundle.main
        let url = bundle.url(forResource: "files/this", withExtension: "mp3")
        if let u = url {

            do {
                sound = try AVAudioPlayer(contentsOf: u, fileTypeHint: AVFileType.mp3.rawValue)
                sound.prepareToPlay()
                sound.play()
            } catch let error {
                print(error.localizedDescription)
            }

        } else {
            print("Could not find resource!")
        }

    }

}   

Я разместил здесь полный (простой) пример проекта : https://github.com/DonMag/TestMP3


Следующее основано на использовании в приложении iOS

Убедитесь, что ваш объект AVAudioPlayer не объявляется, где вы пытаетесь воспроизвести свой звук. Он выйдет go за пределы, прежде чем сможет воспроизвести звук.

Вот текущий способ воспроизведения звука, например, при нажатии кнопки:

// declared at class-level
var sound = AVAudioPlayer()

@IBAction func didTap(_ sender: Any) {

    // abort with error message if this.mp3 is not found in the bundle
    guard let url = Bundle.main.url(forResource: "this", withExtension: "mp3") else {
        fatalError("Could not get URL for mp3 file!")
    }

    do {
        try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
        try AVAudioSession.sharedInstance().setActive(true)

        sound = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

        sound.play()

    } catch let error {
        print(error.localizedDescription)
    }

}

Изменить

Если этот код останавливается и выводит Could not get URL for mp3 file! в консоль отладки, то ваш mp3-файл не включен в пакет.

Выберите его в Project Navigator и убедитесь, что ваша цель отмечена под Target Membership на панели File Inspector. Также проверьте:

  • Настройки проекта
  • Фазы сборки
  • Копировать ресурсы пакета

и убедитесь, что он указан там.


Edit 2

Предполагая, что вы запускаете это на Simulator ...

Добавьте эти две строки перед guard let url - ...:

let path = Bundle.main.path(forResource: "Info", ofType: ".plist")
print(path)

Это должно напечатать длинный путь, который выглядит примерно так:

/Users/yourname/Library/Developer/CoreSimulator/Devices/C55189E0-FDC2-4D93-A1DA-D52EF2EAE905/data/Containers/Bundle/Application/F50C01D1-FF99-4592-8569-120E7362E23B/xcodeProject.app/Info.plist

Скопируйте этот путь, go в окно Finder, выберите Go -> Go to Folder... и вставьте весь этот путь. Посмотрите на найденные там файлы и проверьте, существует ли ваш this.mp3.

Если нет, удалите this.mp3 из своего проекта, снова добавьте его и попробуйте еще раз.

...