2017-01-14 6 views
-1

Я работаю на Xcode 8 Swift 3.Swift 3 - Ошибка при воспроизведении звука на SplashScreen

Я пытаюсь сделать код для воспроизведения звука только после того, как приложение запускается. Я гнал его в функцию (в AppDelegate):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {} 

И так вот мой код:

var opening_sound = AVAudioPlayer() 

и после того, как:

let Nt = URL(fileURLWithPath: Bundle.main.path(forResource: "opp", ofType: "mp3")!) 
     do { 
      opening_sound = try AVAudioPlayer(contentsOf: Nt) 
      opening_sound.prepareToPlay() 

     } catch {print("Error")} 

     opening_sound.play() 

Конечно, я импортировать AVFundation.

При запуске я получаю в консоли «Error», а затем на линии opening_sound.play() я получаю «Тема 1:. EXC_BAD_ACCESS (код = 1, адрес = 0x48)

Я попытался запустить его с зомби объекты активизированы, но нет ответ

EDIT:.. Спасибо за ваши ответы в ответ на @silicon_valley:

ошибка, я получаю это операция не может быть завершена (OSStatus ошибка 1685348671.)

I J. У ust также был: objc [31817]: Класс _NSZombie___NSArrayM реализован в обоих (0x618000047c80) и ?? (0x618000047cb0). Один из двух будет использован. Какой из них не определен. с разрешенными зомби.

Я пробовал то, что вы сказали @Pierce, но он не работает, потому что AVAudioplayer не может быть необязательным значением. Если я напишу ... = AVAudioplayer?, у меня есть выбор между AVAudioplayer?(), который заканчивается словами «Невозможно вызвать инициализатор для типа« AVAudioPlayer »? без аргументов ". Или, если я напишу AVAudioPlayer?.self, код после не работает должным образом.

Таким образом, учитывая, что я могу начать opening_sound в качестве дополнительного значения этого:

if let Nt = Nt { 
    self.opening_sound = try? AVAudioPlayer(contentsOf: Nt) 
} 

не работает и поэтому является кодом.

Я думаю, что проблема связана с основной нитью, но я не вижу ее. Конечно, «opp.mp3» находится в главном комплекте.

EDIT: Спасибо к @Pierce ответ (извините, я не читал правильно) я получил это:

var opening_sound: AVAudioPlayer? 

...

let Nt: URL? = URL(fileURLWithPath: (Bundle.main.path(forResource: "opp", ofType: "mp3"))!) 
     if let Nt = Nt { 
      self.opening_sound = try? AVAudioPlayer(contentsOf: Nt) 
     } 

     playOpeningSound() 

...

func playOpeningSound() { 
     if let opening_sound = opening_sound { 
      if opening_sound.isPlaying { 
       opening_sound.pause() 
      } 
      opening_sound.currentTime = 0 
      DispatchQueue.global().async { 
       opening_sound.play() 
      } 

     } 

И у меня нет ошибки. Но звук не выходит ...! Благодарим за помощь!

+1

Что ошибка вы получаете в улове? Если вы замените 'catch {print (" Ошибка ")}' на 'catch let error {print (error.localizedDescription)}', вы получите причину сбоя. Кроме того, вы не должны называть «play», если в блоке do ... catch произошла ошибка. –

+0

@VincentS - Я добавил ответ, который должен работать, если у вас правильно записано имя звукового файла и расширение. Как вы его написали, вы должны убедиться, что у вас есть файл под названием 'opp.mp3' в вашем основном пакете. Надеюсь, это поможет – Pierce

+0

Прошу прощения за Винсент. Проверьте мой обновленный ответ. Я забыл бросить 'Nt' в качестве необязательного' URL'. Вам нужно сказать «let Nt: URL? ... ' – Pierce

ответ

0

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

инстанцировать AVAudioPlayer, сделать opening_sound дополнительный

var opening_sound: AVAudioPlayer? 

let Nt:URL? = URL(fileURLWithPath: Bundle.main.path(forResource: "opp", ofType: "mp3")!) 
if let Nt = Nt { 
    do { 
     self.opening_sound = try AVAudioPlayer(contentsOf: Nt) 
     } catch { 
      print(error) 
     } 
} 

playOpeningSound() 

Play метод звука:

func playOpeningSound() { 
    if let opening_sound = opening_sound { 
     if opening_sound.isPlaying { 
      opening_sound.pause() 
     } 
     opening_sound.currentTime = 0 
     DispatchQueue.global().async { 
      opening_sound.play() 
      print("Sound should be playing") 
     } 
    } 
} 

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

  • Нет связанных вопросов^_^