Skip to content

Commit

Permalink
修复播放状态调用顺序不对
Browse files Browse the repository at this point in the history
增加播放失败Delegate
  • Loading branch information
JmoVxia committed Dec 29, 2021
1 parent a9a7ec0 commit dbbdf90
Show file tree
Hide file tree
Showing 27 changed files with 190 additions and 121 deletions.
2 changes: 0 additions & 2 deletions CLCollectionViewController/CLCollectionViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ class CLCollectionViewController: CLController {
"http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4",
"http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4",
"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4",
"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4",
"http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4",
"http://vfx.mtime.cn/Video/2019/03/18/mp4/190318214226685784.mp4",
"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319104618910544.mp4",
"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319125415785691.mp4",
Expand Down
3 changes: 1 addition & 2 deletions CLPlayer.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|

s.name = 'CLPlayer'
s.version = '2.0.2'
s.version = '2.0.3'
s.summary = 'Swift版自定义AVPlayer'
s.description = <<-DESC
CLPlayer是基于系统AVPlayer封装的视频播放器.
Expand All @@ -24,5 +24,4 @@ Pod::Spec.new do |s|
s.frameworks = 'UIKit','MediaPlayer'
s.dependency 'SnapKit'


end
10 changes: 5 additions & 5 deletions CLPlayer.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat\" . --exclude Carthage,Pods --swiftversion \"5.0\"\n";
shellScript = "\"${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat\" . --exclude Carthage,Pods --swiftversion \"5.0\" --disable unusedArguments\n";
};
/* End PBXShellScriptBuildPhase section */

Expand Down Expand Up @@ -654,7 +654,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
Expand Down Expand Up @@ -709,7 +709,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
Expand Down Expand Up @@ -745,7 +745,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGETED_DEVICE_FAMILY = 1;
};
name = Debug;
};
Expand Down Expand Up @@ -775,7 +775,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGETED_DEVICE_FAMILY = 1;
};
name = Release;
};
Expand Down
121 changes: 90 additions & 31 deletions CLPlayer/CLPlayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ import AVFoundation
import SnapKit
import UIKit

extension CLPlayer {
enum CLWaitReadyToPlayState {
case nomal
case pause
case play
}
}

public class CLPlayer: UIView {
public init(frame: CGRect = .zero, configure: ((inout CLPlayerConfigure) -> Void)? = nil) {
super.init(frame: frame)
Expand Down Expand Up @@ -46,12 +54,11 @@ public class CLPlayer: UIView {
}
}()

private lazy var sliderTimer: CLGCDTimer = {
let timer = CLGCDTimer(interval: 0.1) { [weak self] _ in
self?.sliderTimerAction()
}
return timer
}()
private var waitReadyToPlayState: CLWaitReadyToPlayState = .nomal

private var sliderTimer: CLGCDTimer?

private var bufferTimer: CLGCDTimer?

private var config = CLPlayerConfigure()

Expand Down Expand Up @@ -85,12 +92,6 @@ public class CLPlayer: UIView {
statusObserve = playerItem.observe(\.status, options: [.new]) { [weak self] _, _ in
self?.observeStatusAction()
}
loadedTimeRangesObserve = playerItem.observe(\.loadedTimeRanges, options: [.new]) { [weak self] _, _ in
self?.observeLoadedTimeRangesAction()
}
playbackBufferEmptyObserve = playerItem.observe(\.isPlaybackBufferEmpty, options: [.new]) { [weak self] _, _ in
self?.observePlaybackBufferEmptyAction()
}
}
}

Expand All @@ -115,7 +116,9 @@ public class CLPlayer: UIView {
let oldIntValue = Int(oldValue * 100)
let intValue = Int(playbackProgress * 100)
if intValue != oldIntValue {
delegate?.player(self, playbackProgressChanged: CGFloat(intValue) / 100)
DispatchQueue.main.async {
self.delegate?.player(self, playProgressChanged: CGFloat(intValue) / 100)
}
}
}
}
Expand All @@ -133,7 +136,7 @@ public class CLPlayer: UIView {
playerLayer?.videoGravity = videoGravity
}
}

public var isFullScreen: Bool {
return contentView.screenState == .fullScreen
}
Expand Down Expand Up @@ -229,8 +232,10 @@ private extension CLPlayer {
currentDuration = totalDuration
playbackProgress = 1.0
contentView.playState = .ended
sliderTimer.suspend()
delegate?.didPlayToEndTime(in: self)
sliderTimer?.suspend()
DispatchQueue.main.async {
self.delegate?.didPlayToEnd(in: self)
}
}

func deviceOrientationDidChange() {
Expand All @@ -253,6 +258,7 @@ private extension CLPlayer {

func appDidEnterPlayground() {
isEnterBackground = false
guard contentView.playState != .ended else { return }
play()
}
}
Expand All @@ -261,13 +267,37 @@ private extension CLPlayer {

private extension CLPlayer {
func observeStatusAction() {
if player?.currentItem?.status == .readyToPlay {
guard let playerItem = playerItem else { return }
guard let playerItem = playerItem else { return }
if playerItem.status == .readyToPlay {
contentView.playState = .readyToPlay
totalDuration = TimeInterval(playerItem.duration.value) / TimeInterval(playerItem.duration.timescale)
sliderTimer.start()
} else if player?.currentItem?.status == .failed {

sliderTimer = CLGCDTimer(interval: 0.1) { [weak self] _ in
self?.sliderTimerAction()
}
sliderTimer?.start()

loadedTimeRangesObserve = playerItem.observe(\.loadedTimeRanges, options: [.new]) { [weak self] _, _ in
self?.observeLoadedTimeRangesAction()
}

playbackBufferEmptyObserve = playerItem.observe(\.isPlaybackBufferEmpty, options: [.new]) { [weak self] _, _ in
self?.observePlaybackBufferEmptyAction()
}

switch waitReadyToPlayState {
case .nomal:
break
case .pause:
pause()
case .play:
play()
}
} else if playerItem.status == .failed {
contentView.playState = .failed
DispatchQueue.main.async {
self.delegate?.player(self, playFailed: playerItem.error)
}
}
}

Expand All @@ -286,18 +316,30 @@ private extension CLPlayer {

private extension CLPlayer {
func availableDuration() -> TimeInterval? {
guard let timeRange = player?.currentItem?.loadedTimeRanges.first?.timeRangeValue else { return nil }
guard let timeRange = playerItem?.loadedTimeRanges.first?.timeRangeValue else { return nil }
let startSeconds = CMTimeGetSeconds(timeRange.start)
let durationSeconds = CMTimeGetSeconds(timeRange.duration)
return .init(startSeconds + durationSeconds)
}

func bufferingSomeSecond() {
guard playerItem?.status == .readyToPlay else { return }
guard contentView.playState != .failed else { return }

player?.pause()
sliderTimer?.suspend()
bufferTimer?.cancel()

contentView.playState = .buffering
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { [weak self] in
self?.play()
}
bufferTimer = CLGCDTimer(interval: 0, delaySecs: 3.0, repeats: false, action: { [weak self] _ in
guard let playerItem = self?.playerItem else { return }
if playerItem.isPlaybackLikelyToKeepUp {
self?.play()
} else {
self?.bufferingSomeSecond()
}
})
bufferTimer?.start()
}

func sliderTimerAction() {
Expand Down Expand Up @@ -345,25 +387,36 @@ private extension CLPlayer {
public extension CLPlayer {
func play() {
guard !isEnterBackground else { return }
guard let playerItem = playerItem else { return }
guard !isUserPause else { return }
if contentView.playState == .ended {
player?.seek(to: CMTimeMake(value: 0, timescale: 1), toleranceBefore: .zero, toleranceAfter: .zero)
guard let playerItem = playerItem else { return }
guard playerItem.status == .readyToPlay else {
waitReadyToPlayState = .play
return
}
guard playerItem.isPlaybackLikelyToKeepUp else {
bufferingSomeSecond()
return
}
if contentView.playState == .ended {
player?.seek(to: CMTimeMake(value: 0, timescale: 1), toleranceBefore: .zero, toleranceAfter: .zero)
}
contentView.playState = .playing
player?.play()
player?.rate = rate
sliderTimer.resume()
sliderTimer?.resume()
waitReadyToPlayState = .nomal
}

func pause() {
guard playerItem?.status == .readyToPlay else {
waitReadyToPlayState = .pause
return
}
contentView.playState = .pause
player?.pause()
sliderTimer.suspend()
sliderTimer?.suspend()
bufferTimer?.cancel()
waitReadyToPlayState = .nomal
}

func stop() {
Expand All @@ -379,12 +432,16 @@ public extension CLPlayer {
player = nil
playerLayer = nil

isUserPause = false

waitReadyToPlayState = .nomal

contentView.playState = .unknow
contentView.setProgress(0, animated: false)
contentView.setSliderProgress(0, animated: false)
contentView.setTotalDuration(0)
contentView.setCurrentDuration(0)
sliderTimer.resume()
sliderTimer?.cancel()
}
}

Expand Down Expand Up @@ -434,7 +491,9 @@ extension CLPlayer: CLPlayerContentViewDelegate {
func didClickBackButton(in contentView: CLPlayerContentView) {
guard contentView.screenState == .fullScreen else { return }
dismiss()
delegate?.didClickBackButton(in: self)
DispatchQueue.main.async {
self.delegate?.didClickBackButton(in: self)
}
}

func didClickPlayButton(isPlay: Bool, in _: CLPlayerContentView) {
Expand Down
2 changes: 1 addition & 1 deletion CLPlayer/CLPlayerConfigure.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public struct CLPlayerConfigure {
/// 顶部工具条隐藏风格
public var topBarHiddenStyle: CLPlayerTopBarHiddenStyle = .onlySmall
/// 工具条自动消失时间
public var autoFadeOut: TimeInterval = 5
public var autoFadeOut: TimeInterval = 8
/// 默认拉伸方式
public var videoGravity: AVLayerVideoGravity = .resizeAspectFill
/// 顶部工具条背景颜色
Expand Down
2 changes: 1 addition & 1 deletion CLPlayer/CLPlayerContentView/CLPlayerContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ class CLPlayerContentView: UIImageView {
playButton.isSelected = false
loadingView.startAnimation()
case .readyToPlay:
sliderView.isUserInteractionEnabled = false
sliderView.isUserInteractionEnabled = true
case .playing:
sliderView.isUserInteractionEnabled = true
failButton.isHidden = true
Expand Down
13 changes: 8 additions & 5 deletions CLPlayer/CLPlayerDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@ public protocol CLPlayerDelegate: AnyObject {
/// 点击顶部工具条返回按钮
func didClickBackButton(in player: CLPlayer)
/// 视频播放结束
func didPlayToEndTime(in player: CLPlayer)
func didPlayToEnd(in player: CLPlayer)
/// 播放器播放进度变化
func player(_ player: CLPlayer, playbackProgressChanged: CGFloat)
func player(_ player: CLPlayer, playProgressChanged value: CGFloat)
/// 播放器播放失败
func player(_ player: CLPlayer, playFailed error: Error?)
}

public extension CLPlayerDelegate {
func didClickBackButton(in _: CLPlayer) {}
func didPlayToEndTime(in _: CLPlayer) {}
func player(_: CLPlayer, playbackProgressChanged _: CGFloat) {}
func didClickBackButton(in player: CLPlayer) {}
func didPlayToEnd(in player: CLPlayer) {}
func player(_ player: CLPlayer, playProgressChanged value: CGFloat) {}
func player(_ player: CLPlayer, playFailed error: Error?) {}
}
2 changes: 0 additions & 2 deletions CLTableViewController/Controller/CLTableViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,6 @@ private extension CLTableViewController {
"http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4",
"http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4",
"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4",
"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4",
"http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4",
"http://vfx.mtime.cn/Video/2019/03/18/mp4/190318214226685784.mp4",
"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319104618910544.mp4",
"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319125415785691.mp4",
Expand Down
Loading

0 comments on commit dbbdf90

Please sign in to comment.