Created
December 17, 2018 04:39
-
-
Save trilliwon/0d0f698012b496136466458302ecbb9c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ViewController.swift | |
// Playback | |
// | |
// Created by kyle.jo on 12/12/2018. | |
// Copyright © 2018 kyle.jo. All rights reserved. | |
// | |
import AVFoundation | |
import UIKit | |
import AVKit | |
class ViewController: UIViewController { | |
@IBOutlet weak var slider: UISlider! { | |
didSet { | |
slider.value = 0.0 | |
} | |
} | |
var player: AVPlayer? | |
var asset: AVAsset! | |
var playerLayer: AVPlayerLayer? | |
var playerItem: AVPlayerItem! | |
private var playerItemContext = 0 | |
var observation: NSKeyValueObservation? | |
let requiredAssetKeys = [ | |
"playable", | |
"hasProtectedContent" | |
] | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
prepareToPlay() | |
addPeriodicTimeObserver() | |
// slider.addTarget(self, action: #selector(sliderValueChanged(slider:)), for: .valueChanged) | |
slider.addTarget(self, action: #selector(sliderValueChanged(slider:)), for: .touchDown) | |
} | |
@objc | |
func sliderValueChanged(slider: UISlider) { | |
print(#function) | |
player?.seek(to: CMTime(seconds: Double(slider.value), preferredTimescale: 1)) | |
} | |
var url: URL? | |
func prepareToPlay() { | |
// URL of a bundle asset called 'example.mp4' | |
guard let url = Bundle.main.url(forResource: "example", withExtension: "mp4") else { | |
print("Asset not found!!!") | |
return | |
} | |
self.url = url | |
asset = AVAsset(url: url) | |
slider.maximumValue = Float(asset.duration.seconds) | |
slider.minimumValue = 0.0 | |
// Player item is ready to play. | |
// Create a new AVPlayerItem with the asset and an | |
// array of asset keys to be automatically loaded | |
playerItem = AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: requiredAssetKeys) | |
observation = playerItem.observe(\.status, options: [.old, .new]) { state, change in | |
print(change.newValue ?? "", change.oldValue ?? "") | |
if change.newValue == .readyToPlay { | |
print("readyToPlay") | |
} else { | |
// Player item failed. See error. | |
// Player item is not yet ready. | |
} | |
print(state, change) | |
} | |
player = AVPlayer(playerItem: playerItem) | |
playerLayer = AVPlayerLayer(player: player!) | |
playerLayer?.frame = view.frame | |
view.layer.insertSublayer(playerLayer!, at: 0) | |
} | |
var timeObserverToken: Any? | |
func addPeriodicTimeObserver() { | |
// Notify every half second | |
let timeScale = CMTimeScale(NSEC_PER_SEC) | |
let time = CMTime(seconds: 0.1, preferredTimescale: timeScale) | |
timeObserverToken = player?.addPeriodicTimeObserver(forInterval: time, queue: .main) { [weak self] time in | |
// update player transport UI | |
self?.slider.value = Float(time.seconds) | |
} | |
} | |
func removePeriodicTimeObserver() { | |
if let timeObserverToken = timeObserverToken { | |
player?.removeTimeObserver(timeObserverToken) | |
self.timeObserverToken = nil | |
} | |
} | |
@IBAction func pauseVideo(_ sender: UIButton) { | |
player?.pause() | |
} | |
@IBAction func playVideo(_ sender: UIButton) { | |
// player?.play() | |
if UIVideoEditorController.canEditVideo(atPath: self.url!.absoluteString) { | |
let editController = UIVideoEditorController() | |
editController.videoPath = self.url!.absoluteString | |
editController.delegate = self | |
present(editController, animated:true) | |
} | |
} | |
} | |
// guard let url = URL(string: "https://devimages-cdn.apple.com/samplecode/avfoundationMedia/AVFoundationQueuePlayer_HLS2/master.m3u8") else { | |
// return | |
// } | |
// // Create an AVPlayer, passing it the HTTP Live Streaming URL. | |
// let player = AVPlayer(url: url) | |
// | |
// // Create a new AVPlayerViewController and pass it a reference to the player. | |
// let controller = AVPlayerViewController() | |
// controller.player = player | |
// | |
// // Modally present the player and call the player's play() method when complete. | |
// present(controller, animated: true) { | |
// player.play() | |
// } | |
extension ViewController: UIVideoEditorControllerDelegate, UINavigationControllerDelegate { | |
func videoEditorController(_ editor: UIVideoEditorController, didSaveEditedVideoToPath editedVideoPath: String) { | |
dismiss(animated:true) | |
} | |
func videoEditorControllerDidCancel(_ editor: UIVideoEditorController) { | |
dismiss(animated:true) | |
} | |
func videoEditorController(_ editor: UIVideoEditorController, didFailWithError error: Error) { | |
print("an error occurred: \(error.localizedDescription)") | |
dismiss(animated:true) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment