From d0304cc37ec390d023e574f17144313bd514647d Mon Sep 17 00:00:00 2001 From: marcoschmickler Date: Wed, 28 Apr 2021 17:58:01 +0200 Subject: [PATCH] Slideshow --- kplayer.xcodeproj/project.pbxproj | 4 - kplayer/AppDelegate.swift | 1 + kplayer/core/MediaItem.swift | 11 +- kplayer/core/NetworkManager.swift | 9 + kplayer/detail/AVPlayerController.swift | 104 +++++++-- kplayer/master/MasterViewController.swift | 11 +- kplayer/video/BMPlayer.swift | 253 ++++++++++++---------- kplayer/video/KBMPlayer.swift | 111 ---------- 8 files changed, 257 insertions(+), 247 deletions(-) delete mode 100644 kplayer/video/KBMPlayer.swift diff --git a/kplayer.xcodeproj/project.pbxproj b/kplayer.xcodeproj/project.pbxproj index 5be3ace..9251153 100644 --- a/kplayer.xcodeproj/project.pbxproj +++ b/kplayer.xcodeproj/project.pbxproj @@ -27,7 +27,6 @@ 1C73691A9C7174E0C6B57267 /* stringutil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736B794396F2E50387B8F2 /* stringutil.swift */; }; 1C73693A1334A7792856FC58 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73611D226B48C24DB37535 /* MasterViewController.swift */; }; 1C736953BDBBAFC40884132A /* BrowserController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73602350ACE2436736F981 /* BrowserController.swift */; }; - 1C7369763AB6C73472E11B55 /* KBMPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736D981F8315FFD7D40695 /* KBMPlayer.swift */; }; 1C7369ABC44CFB530EA71FB6 /* HeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */; }; 1C736A5FA5BA53B2597F2ED7 /* Kirschkeks-256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */; }; 1C736CB96577F6A9A7BA03E8 /* BMPlayerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7364F924BD979294C3EE4A /* BMPlayerItem.swift */; }; @@ -88,7 +87,6 @@ 1C736B794396F2E50387B8F2 /* stringutil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = stringutil.swift; sourceTree = ""; }; 1C736BC4450890C45F8FBC63 /* LayoutTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutTools.swift; sourceTree = ""; }; 1C736C7FFBDAC665AE04CB65 /* AVPlayerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AVPlayerController.swift; sourceTree = ""; }; - 1C736D981F8315FFD7D40695 /* KBMPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KBMPlayer.swift; sourceTree = ""; }; 1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderCell.swift; sourceTree = ""; }; 1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = ""; }; 1C736DFBD072763248412F74 /* BMPlayerClearityChooseButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BMPlayerClearityChooseButton.swift; sourceTree = ""; }; @@ -189,7 +187,6 @@ 1C736F3946A38499113D351A /* video */ = { isa = PBXGroup; children = ( - 1C736D981F8315FFD7D40695 /* KBMPlayer.swift */, 1C736927EA28AFBEB25D7487 /* BMPlayer.swift */, 1C736DFBD072763248412F74 /* BMPlayerClearityChooseButton.swift */, 1C736E51F1A03E3A1200BDB6 /* BMPlayerControlView.swift */, @@ -467,7 +464,6 @@ 1C73691A9C7174E0C6B57267 /* stringutil.swift in Sources */, 1C736821D6DF2237A3EABCC1 /* ViewControllerExtensions.swift in Sources */, 1C7361D2B6E0AE689FAAF4F4 /* AVPlayerController.swift in Sources */, - 1C7369763AB6C73472E11B55 /* KBMPlayer.swift in Sources */, 1C736953BDBBAFC40884132A /* BrowserController.swift in Sources */, 1C7362A6FA1C5DA0B0677F1E /* readme.md in Sources */, 1C73671FC2CCCACAA2FFC153 /* ThumbnailCache.swift in Sources */, diff --git a/kplayer/AppDelegate.swift b/kplayer/AppDelegate.swift index 65d9ff4..a4c9c9e 100644 --- a/kplayer/AppDelegate.swift +++ b/kplayer/AppDelegate.swift @@ -51,6 +51,7 @@ google MediaItem(name: "series", path:"", root: "/srv/samba/ren/series", type: ItemType.PICROOT), MediaItem(name: "bm", path:"", root: "/srv/samba/ren/bm", type: ItemType.PICROOT), MediaItem(name: "medieval", path:"", root: "/srv/samba/ren/medieval", type: ItemType.PICROOT), + NetworkManager.sharedInstance.favorites, web, ] diff --git a/kplayer/core/MediaItem.swift b/kplayer/core/MediaItem.swift index 0fc4570..56b67ed 100644 --- a/kplayer/core/MediaItem.swift +++ b/kplayer/core/MediaItem.swift @@ -17,6 +17,8 @@ enum ItemType: String, CustomStringConvertible { */ case VIDEOROOT = "videoroot" + case FAVROOT = "favroot" + /** Repräsentiert eine Wurzel, in der nur Webseiten angezeigt werden. */ @@ -90,6 +92,8 @@ class MediaItem: CustomDebugStringConvertible { // Nutzinhalt var image: UIImage? var time: TimeInterval? + var length: TimeInterval? + var loop = true var thumbUrl: String? init(name: String, path: String, root: String, type: ItemType) { @@ -102,6 +106,8 @@ class MediaItem: CustomDebugStringConvertible { children = [MediaItem]() sortName = computeSortName(name) + + length = 5.0 } fileprivate func computeSortName(_ sname: String) -> String { @@ -210,9 +216,12 @@ class MediaItem: CustomDebugStringConvertible { } func isVideo() -> Bool { - return superRoot().type == ItemType.VIDEOROOT && (type == ItemType.VIDEO || type == ItemType.SNAPSHOT) + return (superRoot().type == ItemType.VIDEOROOT || superRoot().type == ItemType.FAVROOT) && (type == ItemType.VIDEO || type == ItemType.SNAPSHOT) } + func isDetails() -> Bool { + return type == ItemType.FAVROOT || type == ItemType.DETAILS + } func isFolder() -> Bool { return type == ItemType.PICROOT || type == ItemType.VIDEOROOT || type == ItemType.FOLDER || type == ItemType.WEBROOT } diff --git a/kplayer/core/NetworkManager.swift b/kplayer/core/NetworkManager.swift index c18965d..f1b6d64 100644 --- a/kplayer/core/NetworkManager.swift +++ b/kplayer/core/NetworkManager.swift @@ -15,6 +15,9 @@ class NetworkManager { var authenticated = false + var favorites = MediaItem(name: "fav", path:"", root: "", type: ItemType.FAVROOT) + var currentFav = MediaItem(name: "current", path:"", root: "", type: ItemType.VIDEO) + lazy var operationQueue: OperationQueue = { var queue = OperationQueue() queue.name = "Backup queue" @@ -25,6 +28,12 @@ class NetworkManager { internal typealias Weiter = ([MediaItem]) -> Void + func loadFavDirs(_ rootParam: String, completionHandler: @escaping Weiter) -> Void { + var res = [MediaItem]() + res.append(currentFav) + completionHandler(res) + } + func loadVideoDirs(_ rootParam: String, completionHandler: @escaping Weiter) -> Void { var root = rootParam diff --git a/kplayer/detail/AVPlayerController.swift b/kplayer/detail/AVPlayerController.swift index 125b0f7..87622cc 100644 --- a/kplayer/detail/AVPlayerController.swift +++ b/kplayer/detail/AVPlayerController.swift @@ -14,20 +14,25 @@ protocol ItemController { func setCompletionHandler(handler: @escaping (() -> Void)) } -class AVPlayerController: UIViewController, ItemController { - var player = KBMPlayer() +class AVPlayerController: UIViewController, ItemController, BMPlayerDelegate { + var player = BMPlayer() var currentItem: MediaItem? + var currentSnapshot: MediaItem? var allItems = [MediaItem]() + var loopStart = 0.0 + var loopEnd = 0.0 + var completionHandler: (() -> Void)? var buttons = Dictionary() var barbutton: UIBarButtonItem? var speedButton: UIBarButtonItem? - var zoomButton: UIBarButtonItem? + var loopButton: UIBarButtonItem? var aspectButton: UIBarButtonItem? var playButton: UIBarButtonItem? + var favButton: UIBarButtonItem? var backButton: UIBarButtonItem? var reviewButton: UIBarButtonItem? @@ -36,8 +41,7 @@ class AVPlayerController: UIViewController, ItemController { var aspect = 1 - let zoomOptions = [ 1, 2.0 ] - var zoomOption = 0 + var loopOption = 0 var thumbnailTime: TimeInterval = 0.0 @@ -53,12 +57,13 @@ class AVPlayerController: UIViewController, ItemController { backButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(AVPlayerController.back(_:))) speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.speed(_:))) - zoomButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.zoom(_:))) + loopButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.loop(_:))) aspectButton = UIBarButtonItem(title:"1", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.aspect(_:))) playButton = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(AVPlayerController.startstop(_:))) + favButton = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(AVPlayerController.favorite(_:))) reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.doEdit(_:))) - navigationItem.leftBarButtonItems = [backButton!, speedButton!, playButton!, zoomButton!, aspectButton!, reviewButton!] + navigationItem.leftBarButtonItems = [backButton!, speedButton!, playButton!, loopButton!, aspectButton!, favButton!, reviewButton!] view.addSubview(player) player.snp.makeConstraints { (make) in @@ -67,6 +72,8 @@ class AVPlayerController: UIViewController, ItemController { // Note here, the aspect ratio 16:9 priority is lower than 1000 on the line, because the 4S iPhone aspect ratio is not 16:9 make.height.equalTo(player.snp.width).multipliedBy(9.0/16.0).priority(750) } + + player.delegate = self // Back button event player.backBlock = { (b) in let _ = self.navigationController?.popViewController(animated: true) @@ -78,6 +85,7 @@ class AVPlayerController: UIViewController, ItemController { update() } + updateLoop() } func setItems(items: [MediaItem]) { @@ -107,6 +115,14 @@ class AVPlayerController: UIViewController, ItemController { } } + @objc func favorite(_ sender: AnyObject) { + print("favorite") + + if let c = currentSnapshot { + NetworkManager.sharedInstance.currentFav.children.append(currentItem!) + } + } + @objc func startstop(_ sender: AnyObject) { if player.isPlaying { player.pause() @@ -129,18 +145,27 @@ class AVPlayerController: UIViewController, ItemController { print("play") } - @objc func zoom(_ sender: AnyObject) { - zoomOption += 1 - if zoomOption >= zoomOptions.count { - zoomOption = 0 + @objc func loop(_ sender: AnyObject) { + loopOption += 1 + if loopOption >= 2 { + loopOption = 0 + } + + if loopOption == 1 { + let t = player.playerLayer!.player!.currentTime() + loopEnd = (Double(t.value) / Double(t.timescale)) - 2.0 + } + updateLoop() + } + + func updateLoop() { + if loopOption == 1 { + loopButton!.title = "cont" + } + else { + loopButton!.title = "loop" } - let zoom = Float(zoomOptions[zoomOption]) -// player.playerLayer!.layer.transform = CATransform3DMakeScale(CGFloat(zoom), CGFloat(zoom), 1.0) -// -// player.zoom = zoom - zoomButton!.title = "\(zoom)" - print("zoom \(zoom)") } @objc func aspect(_ sender: AnyObject) { @@ -162,7 +187,7 @@ print("play") print("aspect") } // todo player.verticalMoved(0) - + player.transformLayer() aspectButton!.title = "\(aspect)" } @@ -249,8 +274,11 @@ print("finish") } @objc func thumbnailClicked(_ source: UIButton) { - + currentSnapshot = buttons[source] player.seek(buttons[source]!.time!) + loopStart = buttons[source]!.time! + loopOption = 0 + loopButton!.title = "loop" // moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption]) // print("goto \(buttons[source]!.time!) is \(moviePlayer!.currentPlaybackTime)") @@ -262,6 +290,11 @@ print("finish") if currentItem!.type == ItemType.SNAPSHOT { player.seek(currentItem!.time!) + if currentItem!.loop { + loopStart = currentItem!.time! + loopEnd = currentItem!.time! + currentItem!.length! + loopOption = 1 + } currentItem = currentItem!.parent } else { if !currentItem!.children.isEmpty { @@ -462,5 +495,38 @@ print("finish") addItemButton(newItem) } + func bmPlayer(player: BMPlayer) { + let speed = Float(speedOptions[speedOption]) + if let pl = player.playerLayer!.player { + pl.rate = speed + } + } + + func bmPlayer(player: BMPlayer, playerStateDidChange state: BMPlayerState) { + print("state") + + } + + func bmPlayer(player: BMPlayer, loadedTimeDidChange loadedDuration: TimeInterval, totalDuration: TimeInterval) { + print("load") + } + func bmPlayer(player: BMPlayer, playTimeDidChange currentTime: TimeInterval, totalTime: TimeInterval) { + if loopOption == 1 { + if currentTime > loopEnd { + print("loop") + + player.seek(loopStart) + } + } + print("Time") + } + + func bmPlayer(player: BMPlayer, playerIsPlaying playing: Bool) { + print("playing") + } + + func bmPlayer(player: BMPlayer, playerOrientChanged isFullscreen: Bool) { + print("orient") + } } diff --git a/kplayer/master/MasterViewController.swift b/kplayer/master/MasterViewController.swift index eead07e..dfc4275 100644 --- a/kplayer/master/MasterViewController.swift +++ b/kplayer/master/MasterViewController.swift @@ -111,7 +111,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating { let selectedItem = model.items[indexPath.row] - if selectedItem.type == ItemType.DETAILS { + if selectedItem.isDetails() { gotoDetails(selectedItem) return } @@ -216,12 +216,17 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating { return } - selectedItem.type = ItemType.DETAILS + if selectedItem.type != ItemType.FAVROOT { + selectedItem.type = ItemType.DETAILS + } let p = selectedItem.superRoot() let dir = selectedItem.encodedDir! - if p.type == ItemType.VIDEOROOT { + if p.type == ItemType.FAVROOT { + NetworkManager.sharedInstance.loadFavDirs(dir, completionHandler: weiter) + } + else if p.type == ItemType.VIDEOROOT { NetworkManager.sharedInstance.loadVideoDirs(dir, completionHandler: weiter) } else if p.type == ItemType.WEBROOT { diff --git a/kplayer/video/BMPlayer.swift b/kplayer/video/BMPlayer.swift index d51f058..e6ac9c6 100644 --- a/kplayer/video/BMPlayer.swift +++ b/kplayer/video/BMPlayer.swift @@ -12,6 +12,7 @@ import MediaPlayer /// BMPlayerDelegate to obserbe player state public protocol BMPlayerDelegate : class { + func bmPlayer(player: BMPlayer) func bmPlayer(player: BMPlayer, playerStateDidChange state: BMPlayerState) func bmPlayer(player: BMPlayer, loadedTimeDidChange loadedDuration: TimeInterval, totalDuration: TimeInterval) func bmPlayer(player: BMPlayer, playTimeDidChange currentTime : TimeInterval, totalTime: TimeInterval) @@ -24,21 +25,67 @@ public protocol BMPlayerDelegate : class { - horizontal: horizontal - vertical: vertical - +*/ enum BMPanDirection: Int { case horizontal = 0 case vertical = 1 } - */ + open class BMPlayer: UIView { - + open var zoom = Float(1.0) + open var aspectx = Float(1.0) + open var aspecty = Float(1.0) + var xpos = 0.0 + var ypos = 0.0 + + open var pinchGesture: UIPinchGestureRecognizer! + open var moveGesture: UIPanGestureRecognizer! + open weak var delegate: BMPlayerDelegate? open var backBlock:((Bool) -> Void)? /// Gesture to change volume / brightness open var panGesture: UIPanGestureRecognizer! - + + private func initGesture() { + pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(self.pinched(_:))) + self.addGestureRecognizer(pinchGesture) + // moveGesture = UIPanGestureRecognizer(target: self, action: #selector(self.moved(_:))) + // moveGesture.minimumNumberOfTouches = 2 + // moveGesture.maximumNumberOfTouches = 2 + // self.addGestureRecognizer(moveGesture) + } + + func panDir(_ pan: UIPanGestureRecognizer) { + + let velocityPoint = pan.velocity(in: self) + + xpos += (Double(velocityPoint.x) / 50.0) + ypos += (Double(velocityPoint.y) / 50.0) + + transformLayer() + } + + @objc fileprivate func moved(_ gestureRecognizer: UIPanGestureRecognizer) { + } + + @objc fileprivate func pinched(_ gestureRecognizer: UIPinchGestureRecognizer) { + if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { + zoom *= Float(gestureRecognizer.scale) + + gestureRecognizer.scale = 1.0 + + transformLayer() + } + + } + + func transformLayer() { + let t = CATransform3DMakeTranslation(CGFloat(xpos), CGFloat(ypos), 0.0) + playerLayer!.layer.transform = CATransform3DScale(t, CGFloat(zoom * aspectx), CGFloat(zoom * aspecty), 1.0) + } + /// AVLayerVideoGravityType open var videoGravity = AVLayerVideoGravity.resizeAspect { didSet { @@ -167,6 +214,8 @@ open class BMPlayer: UIView { panGesture.isEnabled = true playerLayer?.play() isPauseByUser = false + + if let d = delegate { d.bmPlayer(player: self) } } /** @@ -234,95 +283,103 @@ open class BMPlayer: UIView { // MARK: - Action Response @objc open func panDirection(_ pan: UIPanGestureRecognizer) { - // 根据在view上Pan的位置,确定是调音量还是亮度 - let locationPoint = pan.location(in: self) - - // 我们要响应水平移动和垂直移动 - // 根据上次和本次移动的位置,算出一个速率的point - let velocityPoint = pan.velocity(in: self) - - // 判断是垂直移动还是水平移动 - switch pan.state { - case UIGestureRecognizer.State.began: - // 使用绝对值来判断移动的方向 - let x = abs(velocityPoint.x) - let y = abs(velocityPoint.y) - - if x > y { - if BMPlayerConf.enablePlaytimeGestures { - self.panDirection = BMPanDirection.horizontal - - if locationPoint.y > self.bounds.size.height * 2 / 3 { - self.isSkip = false - } else { - self.isSkip = true - self.skipAmount = 0.0 - } + if pan.numberOfTouches <= 1 { + // 根据在view上Pan的位置,确定是调音量还是亮度 + let locationPoint = pan.location(in: self) - // 给sumTime初值 - if let player = playerLayer?.player { - let time = player.currentTime() - self.sumTime = TimeInterval(time.value) / TimeInterval(time.timescale) - } - } - } else { - self.panDirection = BMPanDirection.vertical - if locationPoint.x > self.bounds.size.width / 2 { - self.isVolume = false + // 我们要响应水平移动和垂直移动 + // 根据上次和本次移动的位置,算出一个速率的point + let velocityPoint = pan.velocity(in: self) + + // 判断是垂直移动还是水平移动 + switch pan.state { + case UIGestureRecognizer.State.began: + // 使用绝对值来判断移动的方向 + let x = abs(velocityPoint.x) + let y = abs(velocityPoint.y) + + if (zoom > 1.0) && (locationPoint.y < self.bounds.size.height * 1 / 8) { + self.isSkip = false } else { - self.isVolume = false + self.isSkip = true + self.skipAmount = 0.0 } - } - case UIGestureRecognizer.State.changed: - switch self.panDirection { - case BMPanDirection.horizontal: - self.horizontalMoved(velocityPoint.x) - case BMPanDirection.vertical: - self.verticalMoved(velocityPoint.y) - } + if x > y { + if BMPlayerConf.enablePlaytimeGestures { + self.panDirection = BMPanDirection.horizontal - case UIGestureRecognizer.State.ended: - // 移动结束也需要判断垂直或者平移 - // 比如水平移动结束时,要快进到指定位置,如果这里没有判断,当我们调节音量完之后,会出现屏幕跳动的bug - switch (self.panDirection) { - case BMPanDirection.horizontal: - controlView.hideSeekToView() - isSliderSliding = false - - if isSkip { - print( skipAmount) - if (skipAmount > 1000) { - self.sumTime += TimeInterval(30) - } - else if skipAmount > 0 { - self.sumTime += TimeInterval(10) - } - else if skipAmount > -1000 { - self.sumTime -= TimeInterval(10) + + // 给sumTime初值 + if let player = playerLayer?.player { + let time = player.currentTime() + self.sumTime = TimeInterval(time.value) / TimeInterval(time.timescale) + } } - else { - self.sumTime -= TimeInterval(30) + } else { + self.panDirection = BMPanDirection.vertical + if locationPoint.x > self.bounds.size.width / 2 { + self.isVolume = false + } else { + self.isVolume = false } } - if isPlayToTheEnd { - isPlayToTheEnd = false - seek(self.sumTime, completion: {[weak self] in - self?.play() - }) - } else { - seek(self.sumTime, completion: {[weak self] in - self?.autoPlay() - }) + + case UIGestureRecognizer.State.changed: + if !self.isSkip { + xpos += (Double(velocityPoint.x) * 0.1); + ypos += (Double(velocityPoint.y) * 0.1); + transformLayer() } - // 把sumTime滞空,不然会越加越多 - self.sumTime = 0.0 + switch self.panDirection { + case BMPanDirection.horizontal: + self.horizontalMoved(velocityPoint.x) + case BMPanDirection.vertical: + self.verticalMoved(velocityPoint.y) + } + + case UIGestureRecognizer.State.ended: + // 移动结束也需要判断垂直或者平移 + // 比如水平移动结束时,要快进到指定位置,如果这里没有判断,当我们调节音量完之后,会出现屏幕跳动的bug + switch (self.panDirection) { + case BMPanDirection.horizontal: + controlView.hideSeekToView() + isSliderSliding = false - case BMPanDirection.vertical: - self.isVolume = false + if isSkip { + print(skipAmount) + if (skipAmount > 1500) { + self.sumTime += TimeInterval(30) + } else if skipAmount > 0 { + self.sumTime += TimeInterval(10) + } else if skipAmount > -1500 { + self.sumTime -= TimeInterval(10) + } else { + self.sumTime -= TimeInterval(30) + } + } + if isPlayToTheEnd { + isPlayToTheEnd = false + seek(self.sumTime, completion: { [weak self] in + self?.play() + }) + } else { + seek(self.sumTime, completion: { [weak self] in + self?.autoPlay() + }) + } + // 把sumTime滞空,不然会越加越多 + self.sumTime = 0.0 + + case BMPanDirection.vertical: + self.isVolume = false + } + default: + break } - default: - break + } + else { + panDir(pan) } } @@ -331,12 +388,9 @@ print(value) if (value < -100) { // controlView(controlView: controlView, didChooseDefinition: currentDefinition+1); } -// if BMPlayerConf.enableVolumeGestures && self.isVolume{ -// self.volumeViewSlider.value -= Float(value / 10000) -// } -// else if BMPlayerConf.enableBrightnessGestures && !self.isVolume{ -// UIScreen.main.brightness -= value / 10000 -// } + + if !isSkip { + } } open func horizontalMoved(_ value: CGFloat) { @@ -345,27 +399,6 @@ print(value) isSliderSliding = true if !isSkip { - if let playerItem = playerLayer?.playerItem { - // 每次滑动需要叠加时间,通过一定的比例,使滑动一直处于统一水平 - self.sumTime = self.sumTime + TimeInterval(value) / 100.0 * (TimeInterval(self.totalDuration) / 400) - - let totalTime = playerItem.duration - - // 防止出现NAN - if totalTime.timescale == 0 { - return - } - - let totalDuration = TimeInterval(totalTime.value) / TimeInterval(totalTime.timescale) - if (self.sumTime >= totalDuration) { - self.sumTime = totalDuration - } - if (self.sumTime <= 0) { - self.sumTime = 0 - } - - controlView.showSeekToView(to: sumTime, total: totalDuration, isAdd: value > 0) - } } else { skipAmount += Double(value) @@ -408,6 +441,7 @@ print(value) initUIData() configureVolume() preparePlayer() + initGesture() } @available(*, deprecated:3.0, message:"Use newer init(customControlView:_)") @@ -422,6 +456,7 @@ print(value) initUIData() configureVolume() preparePlayer() + initGesture() } public convenience init() { diff --git a/kplayer/video/KBMPlayer.swift b/kplayer/video/KBMPlayer.swift deleted file mode 100644 index 07204bd..0000000 --- a/kplayer/video/KBMPlayer.swift +++ /dev/null @@ -1,111 +0,0 @@ -// -// BMPlayer.swift -// Pods -// -// Created by BrikerMan on 16/4/28. -// -// - -import UIKit -//import SnapKit -import MediaPlayer - -/** - internal enum to check the pan direction - - - horizontal: horizontal - - vertical: vertical - */ -enum BMPanDirection: Int { - case horizontal = 0 - case vertical = 1 -} - -open class KBMPlayer: BMPlayer { - open var zoom = Float(1.0) - open var aspectx = Float(1.0) - open var aspecty = Float(1.0) - var xpos = 0.0 - var ypos = 0.0 - - open var pinchGesture: UIPinchGestureRecognizer! - open var moveGesture: UIPanGestureRecognizer! - - public override init(customControlView: BMPlayerControlView?) { - super.init(customControlView: customControlView) - initGesture() - - } - - private func initGesture() { - pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(self.pinched(_:))) - self.addGestureRecognizer(pinchGesture) - // moveGesture = UIPanGestureRecognizer(target: self, action: #selector(self.moved(_:))) - // moveGesture.minimumNumberOfTouches = 2 - // moveGesture.maximumNumberOfTouches = 2 - // self.addGestureRecognizer(moveGesture) - } - - required public init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - initGesture() - } - @objc open override func panDirection(_ pan: UIPanGestureRecognizer) { - if pan.numberOfTouches <= 1 { - super.panDirection(_: pan) - } - else { - let velocityPoint = pan.velocity(in: self) - - xpos += (Double(velocityPoint.x) / 50.0) - ypos += (Double(velocityPoint.y) / 50.0) - - transformLayer() - } - } - - @objc fileprivate func moved(_ gestureRecognizer: UIPanGestureRecognizer) { - } - - @objc fileprivate func pinched(_ gestureRecognizer: UIPinchGestureRecognizer) { - if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { - zoom *= Float(gestureRecognizer.scale) - - gestureRecognizer.scale = 1.0 - - transformLayer() - } - - } - -// open override func horizontalMoved(_ value: CGFloat) { -// if zoom <= -1.0 { -// super.horizontalMoved(value) -// xpos = 0.0 -// ypos = 0.0 -// } -// else { -// xpos += (Double(value) / 50.0) -// } -// transformLayer() -// } - - private func transformLayer() { - let t = CATransform3DMakeTranslation(CGFloat(xpos), CGFloat(ypos), 0.0) - playerLayer!.layer.transform = CATransform3DScale(t, CGFloat(zoom * aspectx), CGFloat(zoom * aspecty), 1.0) - } - - -// open override func verticalMoved(_ value: CGFloat) { -// if zoom <= -1.0 { -// // super.verticalMoved(value) -// xpos = 0.0 -// ypos = 0.0 -// } -// else { -// ypos += (Double(value) / 50.0) -// } -// transformLayer(); -// } - -}