2015-09-21 10 views
0

Я пытаюсь играть звук во всех отношениях: во-первых, я пытался с действиями SpriteKit по:Невозможно воспроизвести звук: приложение падает

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

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

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

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

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)»)

факультативного

+0

Убедитесь, что вы добавили звуковые файлы в комплект. Также проверьте его на устройстве. Надеюсь, что вы называете [взлёт взрывного звука]; – abintom

+0

@ abyt07 Да, это внутри пакета, и я получаю ту же ошибку на устройстве/симуляторе. –

ответ

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 такая же, как и в вашем примере.

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

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

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

Подсказка:

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

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

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

+0

Он все еще не работает. Возможно, это ошибка библиотеки, я попытаюсь изучить ее. –

Смежные вопросы