Skip to content

Instantly share code, notes, and snippets.

@trilliwon
Created December 17, 2018 04:39
Show Gist options
  • Save trilliwon/0d0f698012b496136466458302ecbb9c to your computer and use it in GitHub Desktop.
Save trilliwon/0d0f698012b496136466458302ecbb9c to your computer and use it in GitHub Desktop.
//
// 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