2017-09-01 197 views
2

我正在開發一個應用程序,通過一個接一個地播放逐句語音文件來播放旁白。 使用下面的代碼,它按預期播放。但是,添加「停止」按鈕停止正在播放的內容後,我發現「停止」按鈕沒有停止聲音。AVAudioPlayer在播放時不會停止

我測試了「停止」按鈕,然後按下「播放」按鈕,這沒有任何問題(消息已打印)。但是,在按下「播放」並且正在播放NarrationPlayer時,「停止」按鈕不起作用(沒有消息被打印)。

任何想法有什麼不對?

import UIKit 
import AVFoundation 

class ViewController: UIViewController,AVAudioPlayerDelegate { 

var NarrationPlayer:AVAudioPlayer = AVAudioPlayer() 
var soundlist: [String] = [] 
var counter = 0 
} 

func playSound(_ soundfile: String) { 

    let NarPath = Bundle.main.path(forResource: soundfile, ofType:"mp3")! 
    let NarUrl = URL(fileURLWithPath: NarPath) 

    do { 
     NarrationPlayer = try AVAudioPlayer(contentsOf: NarUrl) 
     NarrationPlayer.delegate = self 
    } catch{ 
     print(error) 
    } 

    NarrationPlayer.play() 

} 

@IBAction func play(_ sender: Any) { 

soundlist.append("a") 
soundlist.append("b") 
soundlist.append("c") 

playSound("first") 

    while counter < soundlist.count{ 

     if NarrationPlayer.isPlaying == true{ 

     } 
     else{ 
      playSound(soundlist[counter]) 
      counter += 1 
     } 
    } 
} 

@IBAction func StopPlay(_ sender: Any) { 
    print("stop button worked") 
} 
+0

我不知道它是否相關,但爲什麼在變量計數器 – 3stud1ant3

+0

@ 3stud1ant3之後出現閉括號,因爲有一個開放式支架{{爲其各自的類 –

回答

0

你正在運行到的問題是,這條線的位置:

霸佔爲主線,從實際發射保留任何點擊你的「停止播放」按鈕。

儘管您已經設置了委託方法,但您可以在此處執行的其中一項非常方便的操作是增加計數器並在每次完成聲音文件時播放下一個聲音文件。

事情是這樣的:

func playSound(_ soundfile: String) { 

     let NarPath = Bundle.main.path(forResource: soundfile, ofType:"mp3")! 
     let NarUrl = URL(fileURLWithPath: NarPath) 

     do { 
      NarrationPlayer = try AVAudioPlayer(contentsOf: NarUrl) 
      NarrationPlayer.delegate = self 
     } catch{ 
      print(error) 
     } 

     NarrationPlayer.play() 

} 

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) 
{ 
    playSound(self.soundlist[counter]) 
    counter += 1 
} 

@IBAction func play(_ sender: Any) { 

    playSound("first") 

    soundlist.append("a") 
    soundlist.append("b") 
    soundlist.append("c") 
} 

最後一個忠告:

更改名稱NarrationPlayernarrationPlayer。 Swift中的變量(如Objective-C中的變量)應以小寫字母開頭(也稱爲lowerCamelCase)。

+0

非常感謝,解決了這個問題。 要停止播放數組列表的末尾,我添加了if語句。 FUNC audioPlayerDidFinishPlaying(_播放器:AVAudioPlayer,成功標誌:布爾) { 如果計數器

相關問題