簡體   English   中英

在iOS音樂中播放完音樂后播放音樂時播放下一首歌

[英]play next song when music when music is finished in iOS swift

我試圖建立一個音樂應用程序。 音樂播放得很好,但是音樂播放完后就不會播放下一首歌。 我正在尋找這個解決方案。 當我嘗試一些解決方案是給我錯誤。

由於未捕獲的異常'NSInvalidArgumentException'而終止應用程序,原因:'-[Shironamhin.MusicPlayer playerDidFinishPlaying:]:無法識別的選擇器已發送到實例0x17003d960

我正在嘗試這種方式

class MusicPlayer: NSObject {

    static let player = MusicPlayer()

    //this is global variable
    var player : AVPlayer?
    var playerItem:AVPlayerItem?

    func initPlayer(){
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
            print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)

                print("AVAudioSession is Active")

            } catch let error as NSError {
                print(error.localizedDescription)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
}
    func playMusic(_ musicUrl: String?) {
        if let mm = musicUrl {
            var url: URL!
            url = URL(string: mm)
            playerItem = AVPlayerItem(url: url)
            player = AVPlayer(playerItem: playerItem)
            player?.volume = 1.0
            player?.rate = 1.0
            player?.play()
            NotificationCenter.default.addObserver(self, selector: Selector(("playerDidFinishPlaying:")), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)


        }

        func playerDidFinishPlaying(note: NSNotification) {

            print("call")

        }
    }




}

另外,我如何實現這個playerDidFinishPlaying?

從Swift 3開始,您必須這樣聲明Selectors#selector(playerDidFinishPlaying(email:)) ,從Swift 4開始,您必須將@objc屬性添加到函數中:

@objc func audioDidFinishPlaying(note: NSNotification) {
    print("call")
}

順便說一句, AVAudioPlayerDelegate有一個不錯的功能: optional func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) ,使用起來可能會更容易。 :)

我同意@ user6603599,這就是我使用的。

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    print("\naudioPlayerDidFinishPlaying")
}

確保為您的MusicPlayer類設置如下:

class MusicPlayer:AVAudioPlayerDelegate {

暫無
暫無

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

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