2016-01-13 62 views
1

此代碼在輕按按鈕時播放聲音,但如果再次按下,則取消先前的聲音。我不希望發生這種情況,我希望在重複按下時重疊相同的聲音。我相信這可能是由於使用了與我在互聯網上看到的相同的AVAudioPlayer,但我對swift很陌生,並且想知道如何在每次該方法運行時創建新的AVAudioPlayer,以使聲音重疊。如何播放與AVAudioPlayer重疊的聲音?

func playSound(sound:String){ 


    // Set the sound file name & extension 

    let soundPath = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource(sound, ofType: "mp3")!) 
    do { 
     //Preperation 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
    } catch _{ 
    } 
    do { 
     try AVAudioSession.sharedInstance().setActive(true) 
    } 
    catch _ { 
    } 
    //Play the sound 
    var error:NSError? 
    do{ 
     audioPlayer = try AVAudioPlayer(contentsOfURL: soundPath) 
    }catch let error1 as NSError { 
     error = error1 
    } 

    audioPlayer.prepareToPlay() 
    audioPlayer.play() 

} 

回答

1

要與AVAudioPlayer同時播放兩個聲音,您只需爲每個聲音使用不同的播放器。

在我的例子,我宣佈兩名球員,playerBoomplayerCrash,在視圖控制器,和我有一個聲音通過功能的發揮填充它們,然後觸發播放一次:

import AVFoundation 

class ViewController: UIViewController { 

    var playerBoom:AVAudioPlayer? 
    var playerCrash:AVAudioPlayer? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     playerBoom = preparePlayerForSound(named: "sound1") 
     playerCrash = preparePlayerForSound(named: "sound2") 

     playerBoom?.prepareToPlay() 
     playerCrash?.prepareToPlay() 
     playerBoom?.play() 
     playerCrash?.play() 

    } 

    func preparePlayerForSound(named sound: String) -> AVAudioPlayer? { 
     do { 
      if let soundPath = NSBundle.mainBundle().pathForResource(sound, ofType: "mp3") { 
       try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
       try AVAudioSession.sharedInstance().setActive(true) 
       return try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: soundPath)) 
      } else { 
       print("The file '\(sound).mp3' is not available") 
      } 
     } catch let error as NSError { 
      print(error) 
     } 
     return nil 
    } 

} 

它工作得很好,但是如果你有很多聲音玩,IMO不適合。不過,對於少數人來說,這是一個完美有效的解決方案。

這個例子有兩個不同的聲音,但當然這個想法對於兩個同音的聲音是完全相同的。

+0

你的答案很好,並提供更多的問題,但如果我不知道我需要在代碼中的audioPlayers的數量。有沒有辦法聲明更多的「var playerBoom:AVAudioPlayer?」通過循環方法? AVAudioPlayer也是快速播放聲音的唯一方法嗎? –

+0

如果您不知道聲音的數量(順便提一下,這是一個與您的問題不同的問題,即「播放*相同*聲音重疊」),那麼您不應該使用AVAudioPlayer來解決您的問題。因爲您必須爲每個聲音聲明一個播放器和變量,所以如果要重疊,則無法選擇:AVAudioPlayer一次只能播放一個聲音。那麼,你可以創建一個用聲音準備的AVAudioPlayers *數組,並且將數組保存在一個變量中,但是我不推薦這種解決方案,它很快就會變得混亂。恐怕你不得不尋找除AVAudioPlayer之外的其他方法。 – Moritz

+0

我的意思是這是一個聲音,但誰知道它可以播放多少次,相對於聲音文件的長度和按下的時間。 (可能是10個或100個重疊的相同聲音)你有沒有用過另一種方式來播放聲音?無論如何感謝您的回答,這是及時和徹底的 –

相關問題