2017-01-14 2 views
-1

にサウンドを再生、私はXcodeの8で作業中、スウィフト3.スウィフト3 - エラースプラッシュスクリーン

私はアプリが起動直後にサウンドを再生するためのコードをやろうとしています。

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

だからここに私のコードです::私は(AppDelegateに)関数にそれをパット

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をインポートするには。

私はコンソールに入る「エラー」を実行して、行opening_sound.play()にすると、私は「スレッド1を取得:EXC_BAD_ACCESS(=コード= 1、アドレス0x48)

私はアクティブにゾンビオブジェクトとそれを実行してみましたが、ありません。答え

EDIT:あなたの答えのための おかげ@silicon_valleyに返信するには:。

私が手にエラーが操作を完了できませんでしたです(OSStatusエラー1685348671.)

I、J。 ustも持っていた:objc [31817]:クラス_NSZombie___NSArrayMは両方で実装されていますか? (0x618000047c80)と?? (0x618000047cb0)。 2つのうちの1つが使用されます。どちらが未定義ですか。ゾンビが許可されています。

@Pierceと言ったことを試しましたが、AVAudioplayerをオプションの値にすることはできないため、動作しません。私が... = AVAudioplayer?と書いた場合、AVAudioplayer?()の間に "AVAudioPlayerタイプのイニシャライザを呼び出せません"という選択肢があります。議論の余地はありません "。または、AVAudioPlayer?.selfと書いても、コードは正しく実行されません。

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

が動作しないので、コードは:

だから、私は任意の値このようopening_sound開始することができることを考えます。

私は問題がメインスレッドを扱っていると思いますが、私はそれを見ることができません。もちろん、 "opp.mp3"はメインバンドルにあります。

EDIT:(申し訳ありませんが、私はきちんと読んでいない)私はこれだ@Pierceの答えに感謝:

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

     playOpeningSound() 

... ...

var opening_sound: AVAudioPlayer? 

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(" Error ")}'を 'catch let error {print(error.localizedDescription)} 'に置き換えると、クラッシュの理由がわかります。また、do ... catchブロックにエラーがあった場合は、 'play'を呼び出すべきではありません。 –

+0

@VincentS - サウンドファイル名とエクステンションが正しく入力されていればうまくいくはずです。どのように記述したら、メインバンドルに 'opp.mp3'というファイルがあることを確認する必要があります。うまくいけば助ける – Pierce

+0

私はヴィンセントに謝罪します。更新された回答を確認してください。オプションのURLとして 'Nt'をキャストするのを忘れました。 'let Nt:URL? ... ' – Pierce

答えて

0

私は曲を再生する最も良い方法は、非同期に行うことです。 prepareToPlayは私のためにはうまく動作しないようで、UIを初めてプレイするときに一時停止を引き起こす問題は解決しません。これに似た何かを試してみてください:

インスタンス化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() 

が音の方法を再生します:

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") 
     } 
    } 
}