AVAudioPlayer在播放时不会停止

问题描述:

我正在开发一个应用程序,通过一个接一个地播放逐句语音文件来播放旁白。 使用下面的代码,它按预期播放。但是,添加“停止”按钮停止正在播放的内容后,我发现“停止”按钮没有停止声音。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之后出现闭括号,因为有一个开放式支架{{为其各自的类 –

你正在运行到的问题是,这条线的位置:

霸占为主线,从实际发射保留任何点击你的“停止播放”按钮。

尽管您已经设置了委托方法,但您可以在此处执行的其中一项非常方便的操作是增加计数器并在每次完成声音文件时播放下一个声音文件。

事情是这样的:

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,成功标志:布尔) { 如果计数器