Files
MetalVideoProcess/Examples/SimpleVideoTransitionSwitch/SimpleVideoTransition/ViewController+MetalVideoProcessPlayerDelegate.swift

144 lines
5.2 KiB
Swift

//
// ViewController+MetalVideoProcessPlayerDelegate.swift
// SimpleVideoEditor
//
// Created by RenZhu Macro on 2020/7/9.
// Copyright © 2020 RenZhu Macro. All rights reserved.
//
import Foundation
import MetalVideoProcess
import AVFoundation
import AVKit
extension ViewController: MetalVideoProcessPlayerDelegate {
func playbackFrameTimeChanged(frameTime time: CMTime, player: AVPlayer) {
DispatchQueue.main.async {
self.progress.value = Float(time.seconds)
}
}
func playEnded(currentPlayer player: AVPlayer) {
}
func finishExport(error: NSError?) {
DispatchQueue.main.async { [weak self] in
guard let `self` = self else { return }
if error != nil {
MBProgressHUD.hide(for: self.view, animated: true)
guard let source = self.movieWriter?.sources.sources[0] else {
return
}
source.removeAllTargets()
source --> self.renderView
self.view.isUserInteractionEnabled = true
let alertVC = UIAlertController(title: "", message: "导出失败, 请重新尝试", preferredStyle: .alert)
let alertBtn = UIAlertAction(title: "确认", style: .cancel) { (_) in
alertVC.dismiss(animated: true, completion: nil)
}
alertVC.addAction(alertBtn)
self.present(alertVC, animated: true) {
}
return
}
}
if error != nil {
self.view.isUserInteractionEnabled = true
return
}
//writer
self.movieWriter?.finishRecording({
//
DispatchQueue.main.async {
MBProgressHUD.hide(for: self.view, animated: true)
guard let source = self.movieWriter?.sources.sources[0] else {
return
}
source.removeAllTargets()
source --> self.renderView
let playerVC = AVPlayerViewController()
playerVC.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Info", style: .done, target: self, action: #selector(self.showInfo))
playerVC.player = AVPlayer.init(url: self.movieWriter!.fileURL)
self.present(playerVC, animated: true, completion: nil)
self.view.isUserInteractionEnabled = true
}
})
}
func exportProgressChanged(_ progress: Float) {
DispatchQueue.main.async {
self.progressHUD?.progress = progress
}
}
@objc func showInfo() {
let data = NSData(contentsOf: self.movieWriter!.fileURL)
guard let size = data?.length else {
return
}
let mSize = Double(size) / (1024 * 1024)
let message = NSString(format: "%..2f MB", mSize) as String
let alertVC = UIAlertController(title: "Video file size", message: message, preferredStyle: .alert)
let alertBtn = UIAlertAction(title: "OK", style: .cancel) { (_) in
alertVC.dismiss(animated: true, completion: nil)
}
alertVC.addAction(alertBtn)
self.present(alertVC, animated: true) {
}
}
func initWriter() {
self.movieWriter?.removeSourceAtIndex(0)
self.movieWriter = nil
//
do {
let documentsDir = try FileManager.default.url(for:.documentDirectory, in:.userDomainMask, appropriateFor:nil, create:true)
let fileURL = URL(string:"test.mp4", relativeTo:documentsDir)!
do {
try FileManager.default.removeItem(at:fileURL)
} catch {
}
let cgSize = MetalVideoProcessBackground.canvasSize
self.movieWriter = try MetalVideoProcessMovieWriter(URL: fileURL,
size: Size(width: Float(cgSize.width),
height: Float(cgSize.height)),
liveVideo: false)
self.player?.audioEncodingTarget = nil
self.player?.audioEncodingTarget = self.movieWriter
//writer
} catch {
}
}
@IBAction func export(_ sender: Any) {
self.progressHUD = MBProgressHUD.showHub(with: .loading("exporting..."), self.view, isUserInteractionEnabled: false)
guard let source = self.renderView?.sources.sources[0] else {
return
}
initWriter()
source.removeAllTargets()
source --> self.movieWriter!
self.view.isUserInteractionEnabled = false
try? self.player?.startExport()
self.movieWriter?.activateAudioTrack()
self.movieWriter?.startRecording()
}
}