ThimraTV/ShortPlay/Libs/Player/SPPlayer.swift
2025-04-09 18:24:58 +08:00

148 lines
3.8 KiB
Swift

//
// 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)
}
}
}
}