Не могу воспроизвести звук: приложение вылетает

Я пытаюсь воспроизвести звук всеми способами: сначала я попробовал действия SpriteKit:

sprite.runAction(SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: false))

Я также попытался разделить этот код на две части: в методе init я инициализирую действие, которое будет выполнено позже. Но даже если я просто инициализирую SKAction, приложение вылетает:

self.soundAction = SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: true)

Я также пробовал с AVFoundation. Этот код находится внутри метода инициализации:

let explosionURL = NSBundle.mainBundle().URLForResource("explosion", withExtension: "mp3")
var error:NSError?
let data = NSData(contentsOfURL: explosionURL!)
explosionSoundPlayer = AVAudioPlayer(data: data, fileTypeHint: AVFileTypeMPEGLayer3, error: &error)
if explosionSoundPlayer != nil {
    explosionSoundPlayer?.prepareToPlay()
} else {
    println(error?.localizedDescription)
}

Мне пришлось использовать объект NSData, потому что он не работал с URL-адресом. Таким образом, это тоже не удается, но, по крайней мере, это дает мне более осмысленное описание ошибки:

Необязательный("Операция не может быть завершена. (Ошибка OSStatus -39.)")


person Ramy Al Zuhouri    schedule 21.09.2015    source источник
comment
Убедитесь, что вы добавили звуковые файлы в пакет. Также проверьте это в устройстве. Надеюсь, вы звоните [воспроизведение ExplosionSoundPlayer];   -  person abintom    schedule 21.09.2015
comment
@ abyt07 Да, это внутри пакета, и я получаю ту же ошибку на устройстве/симуляторе.   -  person Ramy Al Zuhouri    schedule 21.09.2015


Ответы (1)


Я только что протестировал AVAudioPlayer, и он работает для меня в обоих случаях (либо с NSData, либо с NSUrl). Проверьте код ниже:

class GameScene: SKScene {

    var audioPlayer : AVAudioPlayer?

    var soundAction = SKAction.playSoundFileNamed("sound.wav", waitForCompletion: true)

    override func didMoveToView(view:SKView) {


        let explosionURL = NSBundle.mainBundle().URLForResource("music", withExtension: "mp3")
        var error:NSError?
        let data = NSData(contentsOfURL: explosionURL!)
        audioPlayer = AVAudioPlayer(data: data, fileTypeHint: AVFileTypeMPEGLayer3, error: &error)
        if audioPlayer != nil {
            audioPlayer?.prepareToPlay()
        } else {
            println(error?.localizedDescription)
        }

        /*
        var soundUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("music", ofType: "mp3")!)
        println(soundUrl)

        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: soundUrl, error: &error)
        audioPlayer?.prepareToPlay()
       */
    }
}

Вы можете воспроизводить такие звуки (например, в методе touchesBegan):

//audioPlayer?.play()

 self.runAction(self.soundAction)

Попробуйте скопировать и вставить этот код (просто измените имена звуков и расширения), чтобы увидеть, возникают ли ошибки. Однако часть NSData такая же, как в вашем примере.

Я думаю, вы уже знаете, но не помешает упомянуть, как вы должны добавлять звуковые файлы в свой проект:

  • Перетащите звук в свой проект
  • В разделе «Назначение» выберите «Копировать, если необходимо».
  • В разделе «Добавленные папки» выберите «Создать группы».
  • В разделе «Добавить к целям» выберите цель.

Если все еще не работает, я бы проверил в разделе «Фазы сборки» -> «Копировать ресурсы пакета», чтобы увидеть, присутствует ли «explosion.mp3». Если это не так, используйте кнопку + (добавление элементов будет отображаться при наведении) и добавьте его.

Подсказка:

Обратите внимание, что использовать mp3-файл для коротких звуков не рекомендуется, поскольку mp3 сжат и требует аппаратного декодирования. Декодирование требует процессорного времени. Кроме того, с помощью аппаратного декодера можно воспроизвести только один mp3-файл. Если вы воспроизводите более одного mp3 одновременно, они будут декодированы программным обеспечением, а это медленно. Из документов:

При использовании аппаратного декодирования устройство может одновременно воспроизводить только один экземпляр одного из поддерживаемых форматов. Например, если вы воспроизводите стереозвук MP3 с использованием аппаратного кодека, второй одновременный звук MP3 будет использовать программное декодирование. Точно так же вы не можете одновременно воспроизводить звук AAC и ALAC с помощью аппаратного обеспечения. Если приложение iPod воспроизводит звук в формате AAC или MP3 в фоновом режиме, оно требует аппаратного кодека; затем ваше приложение воспроизводит аудио AAC, ALAC и MP3 с использованием программного декодирования.

Лучшим вариантом для воспроизведения коротких звуков являются форматы .wav и .caf.

person Whirlwind    schedule 22.09.2015
comment
Это все еще не работает. Возможно это баг библиотеки, попробую разобраться. - person Ramy Al Zuhouri; 30.09.2015