快速检查AVAudioPlayer是否正在播放崩溃
问题描述:
我正在用Swift制作音板。它工作得很好,但我试图阻止检查AVAudioPlayer实例是否正在播放,如果是则停止播放。声音被列在一个tableview中,它从我存储我的Sound类的数组中获取数据(它有2个变量,标题和声音的URL)。快速检查AVAudioPlayer是否正在播放崩溃
我有我的AVAudioPlayer和AVAudioSession以及我的声音阵列上我的ViewController类:
var session = AVAudioSession.sharedInstance()
var audioPlayer = AVAudioPlayer()
var sounds: [Sound] = []
,我实现了音频播放,当应用程序用户选择一排这样的:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if audioPlayer.playing {
audioPlayer.stop()
} else {
var sound = self.sounds[indexPath.row]
var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
var pathComponents = [baseString, sound.url]
var audioNSURL = NSURL.fileURLWithPathComponents(pathComponents)
self.audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil)
self.audioPlayer.play()
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
但是当我点击应用程序崩溃行和所有我得到的是“(LLDB)”
你有任何想法发生了什么事?还是我这样做完全错了?
预先感谢您
答
我想通了,所以我与社区共享:
我也不得不宣布对我的ViewController类声音NSURL属性:
var session = AVAudioSession.sharedInstance()
var audioPlayer = AVAudioPlayer()
var audioNSURL = NSURL()
也准备我的音频播放器ViewDidLoad功能: (我不得不使用示例声音来初始化AV AudioPlayer)
let samplePath = NSBundle.mainBundle().pathForResource("sample", ofType: "mp4")
audioNSURL = NSURL.fileURLWithPath(samplePath!)!
audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil)
audioPlayer.prepareToPlay()
然后,在didSelectRowAtIndexPath方法的方法,我检查AVAudioPlayer实例是否正在播放并且如果它的演奏由被窃听的细胞反射的声音。如果是的话,停止audioPlayer,如果没有则播放其他声音(audioPlayer停止并播放其他声音)
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var sound = self.sounds[indexPath.row]
var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
var pathComponents = [baseString, sound.url]
var rowSoundURL = NSURL.fileURLWithPathComponents(pathComponents)!
if audioPlayer.playing && rowSoundURL == audioNSURL {
audioPlayer.stop()
} else {
audioNSURL = rowSoundURL
self.audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil)
self.audioPlayer.play()
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
要知道,如果你还记录在您的应用程序的声音,您必须设置会话类别设置为AVAUdioSessionCategoryPlayback,或者通过设备的小型扬声器听到声音。所以,在viewWillAppear功能:
session.setCategory(AVAudioSessionCategoryPlayback, error: nil)