Browse Source

Slideshow

master
marcoschmickler 5 years ago
parent
commit
d0304cc37e
  1. 4
      kplayer.xcodeproj/project.pbxproj
  2. 1
      kplayer/AppDelegate.swift
  3. 11
      kplayer/core/MediaItem.swift
  4. 9
      kplayer/core/NetworkManager.swift
  5. 104
      kplayer/detail/AVPlayerController.swift
  6. 11
      kplayer/master/MasterViewController.swift
  7. 253
      kplayer/video/BMPlayer.swift
  8. 111
      kplayer/video/KBMPlayer.swift

4
kplayer.xcodeproj/project.pbxproj

@ -27,7 +27,6 @@
1C73691A9C7174E0C6B57267 /* stringutil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736B794396F2E50387B8F2 /* stringutil.swift */; }; 1C73691A9C7174E0C6B57267 /* stringutil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736B794396F2E50387B8F2 /* stringutil.swift */; };
1C73693A1334A7792856FC58 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73611D226B48C24DB37535 /* MasterViewController.swift */; }; 1C73693A1334A7792856FC58 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73611D226B48C24DB37535 /* MasterViewController.swift */; };
1C736953BDBBAFC40884132A /* BrowserController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73602350ACE2436736F981 /* BrowserController.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 */; }; 1C7369ABC44CFB530EA71FB6 /* HeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */; };
1C736A5FA5BA53B2597F2ED7 /* Kirschkeks-256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */; }; 1C736A5FA5BA53B2597F2ED7 /* Kirschkeks-256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */; };
1C736CB96577F6A9A7BA03E8 /* BMPlayerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7364F924BD979294C3EE4A /* BMPlayerItem.swift */; }; 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 = "<group>"; }; 1C736B794396F2E50387B8F2 /* stringutil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = stringutil.swift; sourceTree = "<group>"; };
1C736BC4450890C45F8FBC63 /* LayoutTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutTools.swift; sourceTree = "<group>"; }; 1C736BC4450890C45F8FBC63 /* LayoutTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutTools.swift; sourceTree = "<group>"; };
1C736C7FFBDAC665AE04CB65 /* AVPlayerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AVPlayerController.swift; sourceTree = "<group>"; }; 1C736C7FFBDAC665AE04CB65 /* AVPlayerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AVPlayerController.swift; sourceTree = "<group>"; };
1C736D981F8315FFD7D40695 /* KBMPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KBMPlayer.swift; sourceTree = "<group>"; };
1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderCell.swift; sourceTree = "<group>"; }; 1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderCell.swift; sourceTree = "<group>"; };
1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = "<group>"; }; 1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = "<group>"; };
1C736DFBD072763248412F74 /* BMPlayerClearityChooseButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BMPlayerClearityChooseButton.swift; sourceTree = "<group>"; }; 1C736DFBD072763248412F74 /* BMPlayerClearityChooseButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BMPlayerClearityChooseButton.swift; sourceTree = "<group>"; };
@ -189,7 +187,6 @@
1C736F3946A38499113D351A /* video */ = { 1C736F3946A38499113D351A /* video */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
1C736D981F8315FFD7D40695 /* KBMPlayer.swift */,
1C736927EA28AFBEB25D7487 /* BMPlayer.swift */, 1C736927EA28AFBEB25D7487 /* BMPlayer.swift */,
1C736DFBD072763248412F74 /* BMPlayerClearityChooseButton.swift */, 1C736DFBD072763248412F74 /* BMPlayerClearityChooseButton.swift */,
1C736E51F1A03E3A1200BDB6 /* BMPlayerControlView.swift */, 1C736E51F1A03E3A1200BDB6 /* BMPlayerControlView.swift */,
@ -467,7 +464,6 @@
1C73691A9C7174E0C6B57267 /* stringutil.swift in Sources */, 1C73691A9C7174E0C6B57267 /* stringutil.swift in Sources */,
1C736821D6DF2237A3EABCC1 /* ViewControllerExtensions.swift in Sources */, 1C736821D6DF2237A3EABCC1 /* ViewControllerExtensions.swift in Sources */,
1C7361D2B6E0AE689FAAF4F4 /* AVPlayerController.swift in Sources */, 1C7361D2B6E0AE689FAAF4F4 /* AVPlayerController.swift in Sources */,
1C7369763AB6C73472E11B55 /* KBMPlayer.swift in Sources */,
1C736953BDBBAFC40884132A /* BrowserController.swift in Sources */, 1C736953BDBBAFC40884132A /* BrowserController.swift in Sources */,
1C7362A6FA1C5DA0B0677F1E /* readme.md in Sources */, 1C7362A6FA1C5DA0B0677F1E /* readme.md in Sources */,
1C73671FC2CCCACAA2FFC153 /* ThumbnailCache.swift in Sources */, 1C73671FC2CCCACAA2FFC153 /* ThumbnailCache.swift in Sources */,

1
kplayer/AppDelegate.swift

@ -51,6 +51,7 @@ google
MediaItem(name: "series", path:"", root: "/srv/samba/ren/series", type: ItemType.PICROOT), 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: "bm", path:"", root: "/srv/samba/ren/bm", type: ItemType.PICROOT),
MediaItem(name: "medieval", path:"", root: "/srv/samba/ren/medieval", type: ItemType.PICROOT), MediaItem(name: "medieval", path:"", root: "/srv/samba/ren/medieval", type: ItemType.PICROOT),
NetworkManager.sharedInstance.favorites,
web, web,
] ]

11
kplayer/core/MediaItem.swift

@ -17,6 +17,8 @@ enum ItemType: String, CustomStringConvertible {
*/ */
case VIDEOROOT = "videoroot" case VIDEOROOT = "videoroot"
case FAVROOT = "favroot"
/** /**
Repräsentiert eine Wurzel, in der nur Webseiten angezeigt werden. Repräsentiert eine Wurzel, in der nur Webseiten angezeigt werden.
*/ */
@ -90,6 +92,8 @@ class MediaItem: CustomDebugStringConvertible {
// Nutzinhalt // Nutzinhalt
var image: UIImage? var image: UIImage?
var time: TimeInterval? var time: TimeInterval?
var length: TimeInterval?
var loop = true
var thumbUrl: String? var thumbUrl: String?
init(name: String, path: String, root: String, type: ItemType) { init(name: String, path: String, root: String, type: ItemType) {
@ -102,6 +106,8 @@ class MediaItem: CustomDebugStringConvertible {
children = [MediaItem]() children = [MediaItem]()
sortName = computeSortName(name) sortName = computeSortName(name)
length = 5.0
} }
fileprivate func computeSortName(_ sname: String) -> String { fileprivate func computeSortName(_ sname: String) -> String {
@ -210,9 +216,12 @@ class MediaItem: CustomDebugStringConvertible {
} }
func isVideo() -> Bool { 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 { func isFolder() -> Bool {
return type == ItemType.PICROOT || type == ItemType.VIDEOROOT || type == ItemType.FOLDER || type == ItemType.WEBROOT return type == ItemType.PICROOT || type == ItemType.VIDEOROOT || type == ItemType.FOLDER || type == ItemType.WEBROOT
} }

9
kplayer/core/NetworkManager.swift

@ -15,6 +15,9 @@ class NetworkManager {
var authenticated = false 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 = { lazy var operationQueue: OperationQueue = {
var queue = OperationQueue() var queue = OperationQueue()
queue.name = "Backup queue" queue.name = "Backup queue"
@ -25,6 +28,12 @@ class NetworkManager {
internal typealias Weiter = ([MediaItem]) -> Void 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 { func loadVideoDirs(_ rootParam: String, completionHandler: @escaping Weiter) -> Void {
var root = rootParam var root = rootParam

104
kplayer/detail/AVPlayerController.swift

@ -14,20 +14,25 @@ protocol ItemController {
func setCompletionHandler(handler: @escaping (() -> Void)) func setCompletionHandler(handler: @escaping (() -> Void))
} }
class AVPlayerController: UIViewController, ItemController {
var player = KBMPlayer()
class AVPlayerController: UIViewController, ItemController, BMPlayerDelegate {
var player = BMPlayer()
var currentItem: MediaItem? var currentItem: MediaItem?
var currentSnapshot: MediaItem?
var allItems = [MediaItem]() var allItems = [MediaItem]()
var loopStart = 0.0
var loopEnd = 0.0
var completionHandler: (() -> Void)? var completionHandler: (() -> Void)?
var buttons = Dictionary<UIButton, MediaItem>() var buttons = Dictionary<UIButton, MediaItem>()
var barbutton: UIBarButtonItem? var barbutton: UIBarButtonItem?
var speedButton: UIBarButtonItem? var speedButton: UIBarButtonItem?
var zoomButton: UIBarButtonItem?
var loopButton: UIBarButtonItem?
var aspectButton: UIBarButtonItem? var aspectButton: UIBarButtonItem?
var playButton: UIBarButtonItem? var playButton: UIBarButtonItem?
var favButton: UIBarButtonItem?
var backButton: UIBarButtonItem? var backButton: UIBarButtonItem?
var reviewButton: UIBarButtonItem? var reviewButton: UIBarButtonItem?
@ -36,8 +41,7 @@ class AVPlayerController: UIViewController, ItemController {
var aspect = 1 var aspect = 1
let zoomOptions = [ 1, 2.0 ]
var zoomOption = 0
var loopOption = 0
var thumbnailTime: TimeInterval = 0.0 var thumbnailTime: TimeInterval = 0.0
@ -53,12 +57,13 @@ class AVPlayerController: UIViewController, ItemController {
backButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(AVPlayerController.back(_:))) 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(_:))) 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(_:))) aspectButton = UIBarButtonItem(title:"1", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.aspect(_:)))
playButton = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(AVPlayerController.startstop(_:))) 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(_:))) 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) view.addSubview(player)
player.snp.makeConstraints { (make) in 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 // 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) make.height.equalTo(player.snp.width).multipliedBy(9.0/16.0).priority(750)
} }
player.delegate = self
// Back button event // Back button event
player.backBlock = { (b) in player.backBlock = { (b) in
let _ = self.navigationController?.popViewController(animated: true) let _ = self.navigationController?.popViewController(animated: true)
@ -78,6 +85,7 @@ class AVPlayerController: UIViewController, ItemController {
update() update()
} }
updateLoop()
} }
func setItems(items: [MediaItem]) { 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) { @objc func startstop(_ sender: AnyObject) {
if player.isPlaying { if player.isPlaying {
player.pause() player.pause()
@ -129,18 +145,27 @@ class AVPlayerController: UIViewController, ItemController {
print("play") 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) { @objc func aspect(_ sender: AnyObject) {
@ -162,7 +187,7 @@ print("play")
print("aspect") print("aspect")
} }
// todo player.verticalMoved(0) // todo player.verticalMoved(0)
player.transformLayer()
aspectButton!.title = "\(aspect)" aspectButton!.title = "\(aspect)"
} }
@ -249,8 +274,11 @@ print("finish")
} }
@objc func thumbnailClicked(_ source: UIButton) { @objc func thumbnailClicked(_ source: UIButton) {
currentSnapshot = buttons[source]
player.seek(buttons[source]!.time!) player.seek(buttons[source]!.time!)
loopStart = buttons[source]!.time!
loopOption = 0
loopButton!.title = "loop"
// moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption]) // moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
// print("goto \(buttons[source]!.time!) is \(moviePlayer!.currentPlaybackTime)") // print("goto \(buttons[source]!.time!) is \(moviePlayer!.currentPlaybackTime)")
@ -262,6 +290,11 @@ print("finish")
if currentItem!.type == ItemType.SNAPSHOT { if currentItem!.type == ItemType.SNAPSHOT {
player.seek(currentItem!.time!) player.seek(currentItem!.time!)
if currentItem!.loop {
loopStart = currentItem!.time!
loopEnd = currentItem!.time! + currentItem!.length!
loopOption = 1
}
currentItem = currentItem!.parent currentItem = currentItem!.parent
} else { } else {
if !currentItem!.children.isEmpty { if !currentItem!.children.isEmpty {
@ -462,5 +495,38 @@ print("finish")
addItemButton(newItem) 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")
}
} }

11
kplayer/master/MasterViewController.swift

@ -111,7 +111,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
let selectedItem = model.items[indexPath.row] let selectedItem = model.items[indexPath.row]
if selectedItem.type == ItemType.DETAILS {
if selectedItem.isDetails() {
gotoDetails(selectedItem) gotoDetails(selectedItem)
return return
} }
@ -216,12 +216,17 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
return return
} }
selectedItem.type = ItemType.DETAILS
if selectedItem.type != ItemType.FAVROOT {
selectedItem.type = ItemType.DETAILS
}
let p = selectedItem.superRoot() let p = selectedItem.superRoot()
let dir = selectedItem.encodedDir! 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) NetworkManager.sharedInstance.loadVideoDirs(dir, completionHandler: weiter)
} }
else if p.type == ItemType.WEBROOT { else if p.type == ItemType.WEBROOT {

253
kplayer/video/BMPlayer.swift

@ -12,6 +12,7 @@ import MediaPlayer
/// BMPlayerDelegate to obserbe player state /// BMPlayerDelegate to obserbe player state
public protocol BMPlayerDelegate : class { public protocol BMPlayerDelegate : class {
func bmPlayer(player: BMPlayer)
func bmPlayer(player: BMPlayer, playerStateDidChange state: BMPlayerState) func bmPlayer(player: BMPlayer, playerStateDidChange state: BMPlayerState)
func bmPlayer(player: BMPlayer, loadedTimeDidChange loadedDuration: TimeInterval, totalDuration: TimeInterval) func bmPlayer(player: BMPlayer, loadedTimeDidChange loadedDuration: TimeInterval, totalDuration: TimeInterval)
func bmPlayer(player: BMPlayer, playTimeDidChange currentTime : TimeInterval, totalTime: TimeInterval) func bmPlayer(player: BMPlayer, playTimeDidChange currentTime : TimeInterval, totalTime: TimeInterval)
@ -24,21 +25,67 @@ public protocol BMPlayerDelegate : class {
- horizontal: horizontal - horizontal: horizontal
- vertical: vertical - vertical: vertical
*/
enum BMPanDirection: Int { enum BMPanDirection: Int {
case horizontal = 0 case horizontal = 0
case vertical = 1 case vertical = 1
} }
*/
open class BMPlayer: UIView { 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 weak var delegate: BMPlayerDelegate?
open var backBlock:((Bool) -> Void)? open var backBlock:((Bool) -> Void)?
/// Gesture to change volume / brightness /// Gesture to change volume / brightness
open var panGesture: UIPanGestureRecognizer! 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 /// AVLayerVideoGravityType
open var videoGravity = AVLayerVideoGravity.resizeAspect { open var videoGravity = AVLayerVideoGravity.resizeAspect {
didSet { didSet {
@ -167,6 +214,8 @@ open class BMPlayer: UIView {
panGesture.isEnabled = true panGesture.isEnabled = true
playerLayer?.play() playerLayer?.play()
isPauseByUser = false isPauseByUser = false
if let d = delegate { d.bmPlayer(player: self) }
} }
/** /**
@ -234,95 +283,103 @@ open class BMPlayer: UIView {
// MARK: - Action Response // MARK: - Action Response
@objc open func panDirection(_ pan: UIPanGestureRecognizer) { @objc open func panDirection(_ pan: UIPanGestureRecognizer) {
// viewPan
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 {
// viewPan
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 { } 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) { if (value < -100) {
// controlView(controlView: controlView, didChooseDefinition: currentDefinition+1); // 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) { open func horizontalMoved(_ value: CGFloat) {
@ -345,27 +399,6 @@ print(value)
isSliderSliding = true isSliderSliding = true
if !isSkip { 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 { else {
skipAmount += Double(value) skipAmount += Double(value)
@ -408,6 +441,7 @@ print(value)
initUIData() initUIData()
configureVolume() configureVolume()
preparePlayer() preparePlayer()
initGesture()
} }
@available(*, deprecated:3.0, message:"Use newer init(customControlView:_)") @available(*, deprecated:3.0, message:"Use newer init(customControlView:_)")
@ -422,6 +456,7 @@ print(value)
initUIData() initUIData()
configureVolume() configureVolume()
preparePlayer() preparePlayer()
initGesture()
} }
public convenience init() { public convenience init() {

111
kplayer/video/KBMPlayer.swift

@ -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();
// }
}
Loading…
Cancel
Save