ios - Swift 中的 AVPlayer 状态监听器

标签 ios swift swift3 avfoundation avplayer

我想知道如何获取播放器 (AVPlayer) 的状态(缓冲、播放、停止、错误)并根据这些状态更新 ui(包括锁定屏幕上的播放器)。我具体应该怎么做?

我的标签可能包含: “正在缓冲...”、“正在播放”、“已停止”或“错误”。

基本上,我有以下内容:

媒体播放器:

import Foundation
import AVFoundation

class MediaPlayer {

    static let sharedInstance = MediaPlayer()
    fileprivate var player = AVPlayer(url: URL(string: "my_hls_stream_url_here")!)
    fileprivate var isPlaying = false

    func play() {
        player.play()
        isPlaying = true
    }

    func pause() {
        player.pause()
        isPlaying = false
    }

    func toggle() {
        if isPlaying == true {
            pause()
        } else {
            play()
        }
    }

    func currentlyPlaying() -> Bool {
        return isPlaying
    }

}

PlayerViewController:

class PlayerViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBAction func playStopButtonAction(_ sender: UIButton) {
        MediaPlayer.sharedInstance.toggle()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        label.text = "Disconnected"

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            print("Audio session ok\n")
        } catch {
            print("Error: Audio session.\n")
        }

        // Show only play/pause button on the lock screen
        if #available(iOS 9.1, *) {

            let center = MPRemoteCommandCenter.shared()

            [center.previousTrackCommand, center.nextTrackCommand, center.seekForwardCommand, center.seekBackwardCommand, center.skipForwardCommand, center.skipBackwardCommand, center.ratingCommand, center.changePlaybackRateCommand, center.likeCommand, center.dislikeCommand, center.bookmarkCommand, center.changePlaybackPositionCommand].forEach {
                $0.isEnabled = false
            }

            center.togglePlayPauseCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in
                MediaPlayer.sharedInstance.toggle()
                return MPRemoteCommandHandlerStatus.success
            }

            center.playCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in
                MediaPlayer.sharedInstance.play()
                return MPRemoteCommandHandlerStatus.success
            }

            center.pauseCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in
                MediaPlayer.sharedInstance.pause()
                return MPRemoteCommandHandlerStatus.success
            }

        } else {
            // Fallback on earlier versions
            print("Error (MPRemoteCommandCenter)")
        }


    }


    override func remoteControlReceived(with event: UIEvent?) {
        guard let event = event else {
            print("No event\n")
            return
        }
        guard event.type == UIEventType.remoteControl else {
            print("Another event received\n")
            return
        }
        switch event.subtype {
        case UIEventSubtype.remoteControlPlay:
            print("'Play' event received\n")
        case UIEventSubtype.remoteControlPause:
            print("'Pause' event received\n")
        case UIEventSubtype.remoteControlTogglePlayPause:
            print("'Toggle' event received\n")
        default:
            print("\(event.subtype)\n")
        }
    }

}

最佳答案

我认为您可以使用 AVPlayertimeControlStatus 属性。根据to the doc它可以是暂停waitingToPlayAtSpecifiedRate,这基本上就是您所说的缓冲播放

如果您确实需要错误状态,您可以观察错误 property或者状态 property设置为失败

对这些属性的简单 KVO 观察器就可以解决问题。

关于ios - Swift 中的 AVPlayer 状态监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42025388/

相关文章:

ios - 无法从 subview 连接文本字段

i = mymax 的 Swift 范围运算符;我 >= 0 我--

ios - 发布方法请求 Alamofire

ios - 解除分配旧 UIVIewController 的 UIStoryboard segue

ios - 创建单位转换器的最有效方法是什么,用户可以滚动浏览两个单位选项列表(并排)

swift - 在 ARKit/RealityKit 中同时使用水平面和垂直面

swift - 文件存在则返回,否则返回false

ios - 我们可以让 2 个具有相同 bundle id 的 ios 应用程序针对不同的 ios 吗?

ios - Xcode 9-无法发出预编译的 header

swift - 将图像 URL 放入 Collection View 中