簡體   English   中英

Swift檢查AVAudioPlayer是否正在崩潰

[英]Swift checking if AVAudioPlayer is playing crash

我正在用Swift制作音板。 它工作得很好,但我試圖檢查AVAudioPlayer實例是否正在播放,如果是,則停止它。 聲音列在tableview上,它從我存儲Sound類的數組中獲取數據(其中包含2個變量,標題和聲音url)。

我有我的AVAudioPlayer和AVAudioSession以及我的ViewController類上的聲音數組:

 var session = AVAudioSession.sharedInstance()
 var audioPlayer = AVAudioPlayer()
 var sounds: [Sound] = []

當app用戶選擇這樣的行時,我實現音頻播放:

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函數上准備我的audioPlayer :(我必須使用示例聲音來初始化AVAudioPlayer)

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM