// // SPPlayer.swift // ShortPlay // // Created by 曾觉新 on 2025/4/9. // import UIKit import ZFPlayer @objc protocol SPPlayerDelegate { ///更新当前总进度 // @objc optional func sp_onDurationUpdate(_ player: SPPlayer, duration: Int) // // ///更新当前进度 // @objc optional func sp_onCurrentPositionUpdate(_ player: SPPlayer, position: Int) ///播放时间发生变化 @objc optional func sp_playTimeChanged(_ player: SPPlayer, currentTime: Int, duration: Int) ///显示首帧 @objc optional func sp_firstRenderedStart(_ player: SPPlayer) ///播放完成 @objc optional func sp_playCompletion(_ player: SPPlayer) ///缓冲完成 @objc optional func sp_playLoadingEnd(_ player: SPPlayer) } class SPPlayer: NSObject { weak var delegate: SPPlayerDelegate? private(set) lazy var isPlaying = false ///总进度 var duration: Int { return Int(self.player.totalTime) } ///当前进度 var currentPosition: Int { return Int(self.player.currentTime) } var playerView: UIView? { didSet { playerView?.addSubview(player.view) player.view.snp.makeConstraints { make in make.edges.equalToSuperview() } } } private lazy var player: ZFAVPlayerManager = { let player = ZFAVPlayerManager() return player }() var isLoop = true override init() { super.init() player.scalingMode = .aspectFill sp_addAction() } func setPlayUrl(url: String) { let proxyURL = KTVHTTPCache.proxyURL(withOriginalURL: URL(string: url)) self.player.assetURL = proxyURL // self.player.assetURL = URL(string: url) self.prepare() } ///准备播放 func prepare() { self.player.prepareToPlay() } func stop() { self.isPlaying = false player.stop() } func start() { self.isPlaying = true player.play() } ///暂停 func pause() { self.isPlaying = false player.pause() } func seekToTime(toTime: Int) { // self.player.seek(toTime: Int64(toTime), seekMode: AVP_SEEKMODE_ACCURATE) self.player.seek(toTime: TimeInterval(toTime), completionHandler: nil) } } extension SPPlayer { private func sp_addAction() { //进度发生变化 player.playerPlayTimeChanged = { [weak self] (asset, currentTime, duration) in guard let self = self else { return } self.delegate?.sp_playTimeChanged?(self, currentTime: Int(currentTime), duration: Int(duration)) } //播放状态 player.playerPlayStateChanged = { [weak self] (asset, playState) in guard let self = self else { return } if playState == .playStatePlaying, !isPlaying { self.pause() } spLog(message: "播放状态====\(playState)") } //加载状态 player.playerLoadStateChanged = { [weak self] (asset, loadState) in guard let self = self else { return } if loadState == .playable, !isPlaying { self.pause() } spLog(message: "加载状态====\(loadState)") } //错误信息 player.playerPlayFailed = { [weak self] (asset, error) in spLog(message: "错误信息====\(error)") } //播放结束 player.playerDidToEnd = { [weak self] (asset) in guard let self = self else { return } if isLoop { self.player.replay() } else { self.delegate?.sp_playCompletion?(self) } } } }