Ios 敏捷的AVPlayer。如何跟踪歌曲何时结束播放?

Ios 敏捷的AVPlayer。如何跟踪歌曲何时结束播放?,ios,swift,avplayer,Ios,Swift,Avplayer,当song在Swift中使用AVPlayer完成播放时,东方的追踪方式是什么 是否有任何函数在avplayer完成播放时被调用,或者我应该将计时器与avplayer类引用相结合?类似的功能: func play(url: NSURL) { let item = AVPlayerItem(URL: url) NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlayin

当song在Swift中使用AVPlayer完成播放时,东方的追踪方式是什么


是否有任何函数在avplayer完成播放时被调用,或者我应该将计时器与avplayer类引用相结合?

类似的功能:

func play(url: NSURL) {
    let item = AVPlayerItem(URL: url)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: item)

    let player = AVPlayer(playerItem: item)
    player.play()
}

func playerDidFinishPlaying(note: NSNotification) {
    // Your code here
}

完成后(或在
deinit
中),不要忘记移除观察者

您需要创建一个实现该协议的对象,并将其用作
AVAudioPlayer
对象的委托。然后将它们链接在一起,例如:

audioPlayer = try! AVAudioPlayer(contentsOf: audioFileUrl)
audioPlayer.delegate = self
委托可以实现响应特定事件的方法。当音频播放结束时,此按钮将触发:

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    // ...
}

对于Swif3,您需要进行如下更改:

func play(url: NSURL) {
let item = AVPlayerItem(URL: url)
  NotificationCenter.default.addObserver(self,selector:Selector("playerDidFinishPlaying"), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: item)

let player = AVPlayer(playerItem: item)
player.play() 
}

func playerDidFinishPlaying() {
// Your code here
} 

Swift 3的另一个版本

NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying(sender:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: item)

func playerDidFinishPlaying(sender: Notification) {

    // Do Something
}

更完整的解决方案如下:

import UIKit
import AVFoundation
import MediaPlayer


class ViewController: UIViewController,AVAudioPlayerDelegate {

    var player: AVAudioPlayer = AVAudioPlayer()

    @IBAction func play(_ sender: UIButton) {
        player.play()
        player.currentTime=14*60-10
        print(player.currentTime)
    }
    @IBAction func pause(_ sender: UIButton) {
        player.pause()
    }
    @IBAction func replay(_ sender: UIButton) {
        player.currentTime=0
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        do{
            let audioPath = Bundle.main.path(forResource: "elon", ofType: "mp3")
            player = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: audioPath!))
            player.prepareToPlay()
            player.delegate = self
        }
        catch{
            print(error)
        }
    }

    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool){
        print(flag)
        print("here")
        if flag == true{

        }
    }


}
对于Swift 4.2

func play(url: URL) {
    let item = AVPlayerItem(url: url)
    NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying(sender:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: item)

    let player = AVPlayer(playerItem: item)
    player.play() 
}

@objc func playerDidFinishPlaying(sender: Notification) {
    // Your code here
}

当我测试它时,我得到了这个错误:“由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'-[myApp.MyViewController PlayerDifinishPlaying]:未识别的选择器发送到实例”。你能帮帮我吗?@Llg忘了:在“PlayerDifinishPlay”中:@Flimm他使用的是AVPlayer而不是AVAudioPlayerdon别忘了添加类ViewController:AVaudioPlayerLegate{回答得好!我使用的是AVAudioPlayer,代理工作得很好Mike Carpenter,我尝试了你的解决方案,但没有成功。请看下一步我的代码的“答案”。你收到了什么错误?我在一些项目中有这段代码,它编译和执行时没有任何问题。不要混淆AVPlayer和AVAudioPlayer-下面的一些答案是针对AVAudioPlayer的。
func play(url: URL) {
    let item = AVPlayerItem(url: url)
    NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying(sender:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: item)

    let player = AVPlayer(playerItem: item)
    player.play() 
}

@objc func playerDidFinishPlaying(sender: Notification) {
    // Your code here
}