Swift Media Player
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

361 lines
13 KiB

//
// Created by Marco Schmickler on 26.05.15.
// Copyright (c) 2015 Marco Schmickler. All rights reserved.
//
import Foundation
import UIKit
import MediaPlayer
import ALMoviePlayerController
import Haneke
class VideoPlayerController: UIViewController {
var moviePlayer: ALMoviePlayerController?
var currentItem: MediaItem?
var completionHandler: ((Void) -> Void)?
var buttons = Dictionary<UIButton, MediaItem>()
var barbutton: UIBarButtonItem?
var speedButton: UIBarButtonItem?
var playButton: UIBarButtonItem?
var backButton: UIBarButtonItem?
var reviewButton: UIBarButtonItem?
let speedOptions = [ 0.25, 0.5, 1.0, 2.0 ]
var speedOption = 2
var thumbnailTime: NSTimeInterval = 0.0
var edit = true
var index = 0
override func viewDidLoad() {
super.viewDidLoad()
var url = NetworkManager.sharedInstance.playerURL(currentItem!)
println(url)
barbutton = UIBarButtonItem(barButtonSystemItem: .Action, target: self, action: Selector("twoFingersTwoTaps"));
navigationItem.rightBarButtonItems = [barbutton!]
backButton = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: Selector("back:"))
speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItemStyle.Plain, target: self, action: Selector("speed:"))
playButton = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: Selector("startstop:"))
reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItemStyle.Plain, target: self, action: Selector("doEdit:"))
navigationItem.leftBarButtonItems = [backButton!, playButton!, speedButton!, reviewButton!]
play(url)
}
func doEdit(sender: AnyObject) {
if (edit) {
edit = false
reviewButton!.tintColor = UIColor.blueColor()
}
else {
edit = true
reviewButton!.tintColor = UIColor.yellowColor()
}
}
func startstop(sender: AnyObject) {
if moviePlayer!.playbackState == MPMoviePlaybackState.Playing {
moviePlayer!.pause()
}
else {
moviePlayer!.play()
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
println("play")
}
func speed(sender: AnyObject) {
if ++speedOption > 3 {
speedOption = 0
}
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
speedButton!.title = "\(moviePlayer!.currentPlaybackRate)"
println("speed \(moviePlayer!.currentPlaybackRate)")
}
@IBAction func back(sender: AnyObject) {
if let player = self.moviePlayer {
player.stop()
}
completionHandler!()
}
func play(url: String) {
self.moviePlayer = ALMoviePlayerController(frame: CGRectMake(0, 0, 1024, 768))
if let player = self.moviePlayer {
let movieControls = ALMoviePlayerControls(moviePlayer: player, style: ALMoviePlayerControlsStyleDefault);
movieControls.fadeDelay = 60
player.controls = movieControls
movieControls.style = ALMoviePlayerControlsStyleEmbedded
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("exitedFullscreen"), name: MPMoviePlayerDidExitFullscreenNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("enteredFullscreen"), name: MPMoviePlayerDidEnterFullscreenNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("showThumbnail:"), name: MPMoviePlayerThumbnailImageRequestDidFinishNotification, object: nil);
player.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
player.view.sizeToFit()
player.scalingMode = MPMovieScalingMode.AspectFit
// player.controlStyle = MPMovieControlStyle.Embedded
player.movieSourceType = MPMovieSourceType.Streaming
player.repeatMode = MPMovieRepeatMode.One
player.contentURL = NSURL(string: url)
// player.play()
// var timer = NSTimer.scheduledTimerWithTimeInterval(0.8, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
// view.autolayout(["controls": movieControls, "player": player.view],
// constraints:
// "H:|-[player]-|",
// "H:|-[controls]-|",
// "V:|-[player]-[controls(<=50)]-|" )
self.view.addSubview(player.view)
installGestures(player.view)
update()
// view.addSubview(movieControls)
// player.setFrame(view.frame)
}
}
func showThumbnail(note: NSNotification) {
let userInfo = note.userInfo! as NSDictionary
let thumbnail = userInfo.objectForKey(MPMoviePlayerThumbnailImageKey) as! UIImage
let time = userInfo.objectForKey(MPMoviePlayerThumbnailTimeKey) as! NSTimeInterval
let newItem = MediaItem(name: currentItem!.name, path: currentItem!.path, root: currentItem!.root, type: ItemType.SNAPSHOT)
newItem.image = thumbnail
newItem.time = time
newItem.parent = currentItem!
currentItem!.children.append(newItem)
println(newItem.time)
addItemButton(newItem)
}
func addItemButton(newItem: MediaItem) {
let frame = CGRectMake(0, 0, 66.0, 44.0);
let button = UIButton(frame: frame)
button.showsTouchWhenHighlighted = true
button.addTarget(self, action: "thumbnailClicked:", forControlEvents: .TouchDown)
if newItem.image != nil {
let icon = newItem.image!.scaleToSize(66.0, height: 44.0)
button.setBackgroundImage(icon, forState: UIControlState.Normal);
} else {
if newItem.thumbUrl != nil {
let URL = NSURL(string: newItem.thumbUrlAbsolute)!
Shared.imageCache.fetch(URL: URL).onSuccess {
i in
let icon = i.scaleToSize(66.0, height: 44.0)
button.setBackgroundImage(icon, forState: UIControlState.Normal);
}
}
}
let barbutton = UIBarButtonItem(customView: button);
if navigationItem.rightBarButtonItems == nil {
navigationItem.rightBarButtonItems = []
}
navigationItem.rightBarButtonItems!.append(barbutton)
buttons[button] = newItem
}
func thumbnailClicked(source: UIButton) {
moviePlayer!.currentPlaybackTime = buttons[source]!.time!
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
println("goto \(buttons[source]!.time!) is \(moviePlayer!.currentPlaybackTime)")
}
func update() {
if let player = self.moviePlayer {
if !(player.duration > 0.0) { // player.loadState == MPMovieLoadState.Unknown || player.loadState == MPMovieLoadState.Stalled {
println("again")
var timer = NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
return
}
reviewButton!.title = currentItem!.name
if currentItem!.type == ItemType.SNAPSHOT {
player.currentPlaybackTime = currentItem!.time!
currentItem = currentItem!.parent
} else {
if !currentItem!.children.isEmpty {
player.currentPlaybackTime = currentItem!.children[0].time!
}
else {
println(player.duration)
player.currentPlaybackTime = player.duration / 2
}
}
navigationItem.rightBarButtonItems = [barbutton!]
for c in currentItem!.children {
addItemButton(c)
}
player.play()
// player.fullscreen = true
}
}
func enteredFullscreen() {
let mp = UIApplication.sharedApplication().keyWindow;
if let moviePlayerContainer = mp!.recursiveSearchForViewWithName("MPVideoContainerView") {
if (moviePlayerContainer.gestureRecognizers != nil) {
return;
}
installGestures(moviePlayerContainer)
}
}
func exitedFullscreen() {
moviePlayer!.view.removeFromSuperview();
moviePlayer = nil;
NSNotificationCenter.defaultCenter().removeObserver(self);
}
func installGestures(moviePlayer: UIView) {
let twoFingersTwoTaps = UITapGestureRecognizer(target: self, action: "twoFingersTwoTaps")
twoFingersTwoTaps.numberOfTapsRequired = 2
twoFingersTwoTaps.numberOfTouchesRequired = 2
moviePlayer.addGestureRecognizer(twoFingersTwoTaps)
let sR = UISwipeGestureRecognizer(target: self, action: "swipeRight")
sR.direction = UISwipeGestureRecognizerDirection.Right
sR.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR)
let sL = UISwipeGestureRecognizer(target: self, action: "swipeLeft")
sL.direction = UISwipeGestureRecognizerDirection.Left
sL.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sL)
let sR2 = UISwipeGestureRecognizer(target: self, action: "swipeDown")
sR2.direction = UISwipeGestureRecognizerDirection.Down
sR2.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR2)
let sR3 = UISwipeGestureRecognizer(target: self, action: "swipeUp")
sR3.direction = UISwipeGestureRecognizerDirection.Up
sR3.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR3)
}
func swipeUp() {
println("u")
if let player = self.moviePlayer {
println("Type: \(currentItem!.type) Count: \(count(currentItem!.children)) Index: \(index) Current: \(currentItem!.index)")
if !edit && (currentItem!.children.isEmpty || !(index < count(currentItem!.children) - 1)) {
println ("switch")
var newIndex = currentItem!.index + 1
if count(currentItem!.parent!.children) <= newIndex {
newIndex = 0
}
currentItem = currentItem!.parent!.children[newIndex]
println("'Switched Type: \(currentItem!.type) Count: \(count(currentItem!.children)) Index: \(index) Current: \(currentItem!.index)")
index = 0
player.contentURL = NSURL(string: NetworkManager.sharedInstance.playerURL(currentItem!))
player.play()
var timer = NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
return
}
if !(currentItem!.children.isEmpty) {
println ("switch internal")
if index < count(currentItem!.children) - 1 {
index++;
} else {
index = 0;
}
let child = currentItem!.children[index]
player.currentPlaybackTime = child.time!
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
}
}
func swipeRight() {
println("r")
if let player = self.moviePlayer {
player.currentPlaybackTime = player.currentPlaybackTime - 30.0
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
}
func swipeDown() {
println("d")
if let player = self.moviePlayer {
if !edit {
var newIndex = currentItem!.index - 1
if newIndex < 0 {
newIndex = 0
}
currentItem = currentItem!.parent!.children[newIndex]
index = 0;
player.contentURL = NSURL(string: NetworkManager.sharedInstance.playerURL(currentItem!))
player.play()
var timer = NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
return
}
player.currentPlaybackTime = player.currentPlaybackTime + 10.0
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
}
func swipeLeft() {
println("l")
if let player = self.moviePlayer {
player.currentPlaybackTime = player.currentPlaybackTime + 30.0
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
}
func twoFingersTwoTaps() {
if edit {
thumbnailTime = moviePlayer!.currentPlaybackTime
println("tap \(thumbnailTime)")
moviePlayer!.requestThumbnailImagesAtTimes([thumbnailTime],
timeOption: MPMovieTimeOption.Exact);
}
else {
NetworkManager.sharedInstance.favItem(currentItem!)
}
}
}