2017-12-07 3 views
10

私は、一連のトーンが再生され、ユーザーがトーンを繰り返そうとするSimonライクなメモリゲームを持っています。問題は、私が時折、ひどくひどくひどい音を出すことです。それはちょうど少数の音符の後でもよいし、20音符の後でもよい。サウンドはすべて2秒間のwavファイルです。私は10人の選手を回り、どの音もクリッピングされないようにします。 (私は50まで試しましたが、何も役に立たなかった)audioPlayerDidFinishPlayingを実装しようとしました。サウンドが完成してもプレイヤーを止めることができましたが、それも役に立たなかった。最後に、私はprepareToPlay()を追加しました - 悲しいことに、違いはありません。AVAudioPlayerクラックルとポップス

関連があるかもしれないし、関連していないかもしれない1つの興味深い問題は、約15音符のシーケンスの後に、音声がすべて一緒に働くことがなくなることです。アプリは普通のように続きますが、サウンドはありません。

func playSound(_ soundID: Int) { 
     var soundName = "" 

     switch soundID { 
     case 0: 
      soundName = "beep1" 
     case 1: 
      soundName = "beep2" 
     case 2: 
      soundName = "beep3" 
     case 3: 
      soundName = "beep4" 
     case 4: 
      soundName = "swish3" 
     default: 
      soundName = "clank" 
     } 

     guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav") else { return } 

     do { 
      buttonSound.insert(try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue), at: playerIndex) 
      buttonSound[playerIndex].prepareToPlay() 
      buttonSound[playerIndex].delegate = self 

      if playerIndex < 10 { 
       buttonSound[playerIndex].play() 
       playerIndex += 1 
      } else { 
       buttonSound[playerIndex].play() 
       playerIndex = 0 
      } 

     } catch { 
      // error 
     } 
    } 

    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
     if flag { 
      player.stop() 
     } 
    } 

/********私はAVAudioPlayerの作成を移動*********/

UPDATE:ここ

は、コードのオーディオ部分があります私はどこかで横断した古い例に基づいた独自のクラスです。それは15音の問題の後で完全に切り取ったオーディオを解決しましたが、クラックやポップはまだそこにあります!私も運がない音を再録音しようとしました。ここで

は、必要に応じてAVAudioPlayersを作成するためのクラスです:サウンドを再生

import UIKit 
import AVFoundation 

private var players: [AVAudioPlayer] = [] 

class AVAudioPlayerPool: NSObject { 

    class func playerWithURL(url: URL) -> AVAudioPlayer? { 

     let availablePlayers = players.filter { (player) -> Bool in 
      return player.isPlaying == false && player.url == url 
     } 

     if let playerToUse = availablePlayers.first { 
      playerToUse.prepareToPlay() 
      return playerToUse 
     } 

     do { 
      let newPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue) 
      players.append(newPlayer) 
      newPlayer.prepareToPlay() 
      return newPlayer 

     } catch { 
      return nil 
     } 
    } 
} 

は単純です:

func playSound(_ soundID: Int) { 
    var soundName = "" 

    switch soundID { 
    case 0: 
     soundName = "tt1" 
    case 1: 
     soundName = "tt2" 
    case 2: 
     soundName = "tt3" 
    case 3: 
     soundName = "tt4" 
    case 4: 
     soundName = "swish3" 
    default: 
     soundName = "clank" 
    } 

    guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav") else { return } 
    let player = AVAudioPlayerPool.playerWithURL(url: url) 
    player?.play() 

} 

誰がどんな考えを持っている場合 - それはあなたが試すかもしれないだけで、次のステップだ場合でも、 ...

+0

バックグラウンドキューでファイルを再生する方法はありますか?メインスレッドがあなたのゲームを処理していて忙しいかもしれませんが、あなたが経験しているクラックルを引き起こす可能性があります – hhanesand

+0

私はメインスレッドから動かしてみました。しかし、提案に感謝します。 – squarehippo10

+0

OALSimpleAudioを使用しましたか? https://github.com/kstenerud/ObjectAL-for-iPhone私は現在のゲームプロジェクトでそれを使用していますが、それにはさまざまなサウンドがあります。これはObjective-Cコードですが、ブリッジヘッダーを使用して素早くプロジェクトに追加するのは簡単です。 – Woof

答えて

1

何時間もの実験の後、問題は私が選んだサウンド、すなわちリバーブのある大きな中空の方形波のシンセサウンドに起因すると言います。私はまず、レベルアップの考えを減らそうとしました。次に、私はいろいろな種類の音を試しましたが、すべてが震えました。私は選手を割り当てる方法ともっと関係があると思う。いったん私はプレーヤーの問題を解決した後、私は戻って別の音を試してみることを考えなかった。それまで、私はやった...それは動作します!

2

私の意見では、あなたの主な問題は、サウンドの読み込みが、サウンド自体を演奏する同じ機能の内部で行われることです。概念的に間違っています。可能な限り速くサウンドを再生するには、「再生」機能の外ですべてのサウンドを一度ロードする必要があります。その機能はちょうど再生する必要があります、それはそれです。

+1

それは理にかなっています。私はまだダイナミックなプレイヤーの作成をプレイの機能から切り離す方法を見つけようとしています。しかし、私はそれに取り組んでいます... – squarehippo10

0

私たちはチームの問題に直面しました。私たちの場合、歪んだサウンドバグは、デバッガが接続されたデバイスでアプリケーションが実行されている場合は、のみを再現できます。我々は、デバッガからアプリを取り外すと、クラックルは消えます。 新しいXcode 9.2(9C40b)に初めて登場したようです。

+0

それは面白いと私の問題を修正した場合素晴らしいだろう。私がプレイヤーの作成プロセスを改善したとき、歪みはシミュレーターから消えました。残念ながら、それはまだ接続されているかどうか、デバイス上にあります。 – squarehippo10