Files
RenZhu Macro 1515f6761b Add new motions
Move up, move right, move left, zoom in ...
2020-07-29 18:19:03 +08:00

134 lines
4.1 KiB
Swift

//
// ViewController.swift
// SimpleVideoAnimation
//
// Created by RenZhu Macro on 2020/7/20.
// Copyright © 2020 RenZhu Macro. All rights reserved.
//
import UIKit
import AVFoundation
import MetalVideoProcess
import PryntTrimmerView
class ViewController: UIViewController {
@IBOutlet weak var renderView: MetalVideoProcessRenderView!
@IBOutlet weak var progressView: TrimmerView!
var player: MetalVideoProcessPlayer?
var editor: MetalVideoEditor?
public var motionIn: MetalVideoProcessMotion = MetalVideoProcessMoveUpMotion()
override func viewDidLoad() {
super.viewDidLoad()
let asset1 = AVAsset(url: Bundle.main.url(forResource: "853", withExtension: "mp4")!)
let item1 = MetalVideoEditorItem(asset: asset1)
do {
let editor = try MetalVideoEditor(videoItems: [item1])
self.editor = editor
let playerItem = editor.buildPlayerItem()
let fadeIn = motionIn
fadeIn.timingType = .quadraticEaseOut
let fadeOut = MetalVideoProcessFadeOutMotion()
fadeOut.timingType = .quarticEaseOut
let fadeInTimeRange = CMTimeRangeMake(start: CMTime(seconds: 0.0), duration: CMTime(seconds: 2.0))
fadeIn.saveUniformSettings(forTimelineRange: fadeInTimeRange, trackID: item1.trackID)
let fadeOutTimeRange = CMTimeRange(start: item1.timeRange.end - CMTime(seconds: 4.0), duration: CMTime(seconds: 1.5))
fadeOut.saveUniformSettings(forTimelineRange: fadeOutTimeRange, trackID: item1.trackID)
let player = try MetalVideoProcessPlayer(playerItem: playerItem)
player.playerDelegate = self
let background = MetalVideoProcessBackground(trackID: 0)
background.aspectRatioType = .Ratio9_16
background.canvasSizeType = .Type720p
background.setBackgroundType(type: .Blur)
let transform = MetalVideoProcessTransformFilter()
transform.saveUniformSettings(forTimelineRange: item1.timeRange, trackID: item1.trackID)
transform.roi = CGRect(x: 0.5, y: 0.5, width: 0.5, height: 0.5)
fadeIn.roi = transform.roi
player.addTarget(background, atTargetIndex: 0, trackID: item1.trackID, targetTrackId: 0)
background --> fadeIn //source 0
player.addTarget(transform, atTargetIndex: nil, trackID: item1.trackID, targetTrackId: 0) //source 1
transform --> fadeIn --> renderView //source 1
self.player = player
} catch {
}
}
override func viewDidAppear(_ animated: Bool) {
guard let asset = self.editor?.playerItem?.asset else {
return
}
self.progressView.asset = asset
self.progressView.delegate = self
}
override func viewDidDisappear(_ animated: Bool) {
self.player?.suspend()
self.player?.dispose()
}
@IBAction func play(_ sender: Any) {
self.player?.play()
}
@IBAction func pause(_ sender: Any) {
self.player?.pause()
}
@IBAction func progressChanged(_ sender: Any) {
}
}
extension ViewController: TrimmerViewDelegate {
func didChangePositionBar(_ playerTime: CMTime) {
self.player?.seekTo(time: playerTime.seconds)
}
func positionBarStoppedMoving(_ playerTime: CMTime) {
}
}
extension ViewController: MetalVideoProcessPlayerDelegate {
func playbackFrameTimeChanged(frameTime time: CMTime, player: AVPlayer) {
if player.rate == 0.0 {
return
}
DispatchQueue.main.async { [weak self] in
guard let `self` = self else { return }
self.progressView.seek(to: time)
}
}
func playEnded(currentPlayer player: AVPlayer) {
}
func finishExport(error: NSError?) {
}
func exportProgressChanged(_ progress: Float) {
}
}