123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- //
- // INVideoExportController.swift
- // Introduce
- //
- // Created by 胡志强 on 2021/11/29.
- //
- import Foundation
- import BFUIKit
- import Photos
- import BFRecordScreenKit
- class INVideoExportController: BFBaseViewController {
-
- var videoAsset : AVURLAsset?
- var avplayerTimeObserver: NSKeyValueObservation?
- lazy var progreddL : UILabel = {
- let l = UILabel(frame: CGRect(x: 0, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth, height: 14))
- l.textAlignment = .center
- l.font = UIFont.systemFont(ofSize: 10)
- l.textColor = .white
- l.shadowColor = .black
- l.shadowOffset = CGSize(width: 1, height: 1)
- return l
- }()
-
-
- lazy var progressView : UIView = {
- let v = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: 0, height: 10))
- v.backgroundColor = .red
- return v
- }()
-
- lazy var progressL : UILabel = {
- let la = UILabel(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
- la.textColor = .white
- la.textAlignment = .center
- la.text = "0%"
- la.font = UIFont.systemFont(ofSize: 8)
- return la
- }()
-
- lazy var avplayer : AVPlayer = {
- let avplayer = AVPlayer()
- avplayerTimeObserver = avplayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 100), queue: DispatchQueue.global()) {[weak self, weak avplayer] time in
- // 进度监控
- if let item = avplayer?.currentItem {
- DispatchQueue.main.async { [weak self] in
- self?.progreddL.text = String(format: "%.2f / %.2f", CMTimeGetSeconds(time), CMTimeGetSeconds(item.duration))
- }
-
- }
- } as? NSKeyValueObservation
-
- NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem, queue: .main) { [weak avplayer] notify in
- avplayer?.seek(to: CMTime.zero)
- }
-
- return avplayer
- }()
-
- lazy var export : BFRecordExport = {
- let export = BFRecordExport()
-
- export.progress = {[weak self] progress in
- DispatchQueue.main.async { [weak self] in
- self?.progressView.frame = CGRect(x: 0, y: self?.navHeadImageView?.bottomY ?? 0, width: (cScreenWidth) * CGFloat(progress), height: 10)
- self?.progressL.text = String(format: "%d%%", Int(progress*100))
- }
- }
- export.exportCompletion = {[weak self] (error, url) in
- guard let strongSelf = self else {
- return
- }
-
- if let fileUrl = url {
- DispatchQueue.main.async { [weak self] in
- let item = AVPlayerItem(url: fileUrl)
- self?.avplayer.replaceCurrentItem(with: item)
- self?.avplayer.play()
- }
- }
- }
- return export
- }()
-
- deinit {
- avplayerTimeObserver?.invalidate()
- NotificationCenter.default.removeObserver(self)
- }
-
- override func viewWillAppear(_ animated: Bool) {
- super.viewWillAppear(animated)
- showNavigation()
- }
-
- override func backBtnClick() {
- export.cancelExport()
- super.backBtnClick()
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- view.backgroundColor = .black
- navHeadImageView?.backgroundColor = .black
- leftButton(image: nil, imageName: nil, tintColor: UIColor.white)
-
- let backV = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
- backV.backgroundColor = .gray
- view.addSubview(backV)
- view.addSubview(progressView)
- view.addSubview(progressL)
- view.addSubview(progreddL)
- progreddL.snp.makeConstraints { make in
- make.top.equalTo(progressView.snp.bottom).offset(10)
- make.centerX.equalTo(progressL)
- make.width.equalTo(100)
- make.height.equalTo(20)
- }
- let playerLayer = AVPlayerLayer(player: avplayer)
- playerLayer.frame = CGRect(x: 10, y: self.progressView.bottomY, width: cScreenWidth - 20, height: cScreenHeigth - self.progressView.bottomY - 10)
- view.layer.addSublayer(playerLayer)
-
- export.startExprot()
-
- view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
- }
-
- @objc func play(){
- if self.avplayer.currentItem != nil {
- if self.avplayer.timeControlStatus == .playing {
- self.avplayer.pause()
- }else if self.avplayer.timeControlStatus == .paused{
- self.avplayer.play()
- }
- }
- }
- }
|