148 lines
3.8 KiB
Swift
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)
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|