INVideoExportController.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //
  2. // INVideoExportController.swift
  3. // Introduce
  4. //
  5. // Created by 胡志强 on 2021/11/29.
  6. //
  7. import Foundation
  8. import BFUIKit
  9. import Photos
  10. import BFRecordScreenKit
  11. class INVideoExportController: BFBaseViewController {
  12. var videoAsset : AVURLAsset?
  13. var avplayerTimeObserver: NSKeyValueObservation?
  14. lazy var progreddL : UILabel = {
  15. let l = UILabel(frame: CGRect(x: 0, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth, height: 14))
  16. l.textAlignment = .center
  17. l.font = UIFont.systemFont(ofSize: 10)
  18. l.textColor = .white
  19. l.shadowColor = .black
  20. l.shadowOffset = CGSize(width: 1, height: 1)
  21. return l
  22. }()
  23. lazy var progressView : UIView = {
  24. let v = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: 0, height: 10))
  25. v.backgroundColor = .red
  26. return v
  27. }()
  28. lazy var progressL : UILabel = {
  29. let la = UILabel(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
  30. la.textColor = .white
  31. la.textAlignment = .center
  32. la.text = "0%"
  33. la.font = UIFont.systemFont(ofSize: 8)
  34. return la
  35. }()
  36. lazy var avplayer : AVPlayer = {
  37. let avplayer = AVPlayer()
  38. avplayerTimeObserver = avplayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 100), queue: DispatchQueue.global()) {[weak self, weak avplayer] time in
  39. // 进度监控
  40. if let item = avplayer?.currentItem {
  41. DispatchQueue.main.async { [weak self] in
  42. self?.progreddL.text = String(format: "%.2f / %.2f", CMTimeGetSeconds(time), CMTimeGetSeconds(item.duration))
  43. }
  44. }
  45. } as? NSKeyValueObservation
  46. NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem, queue: .main) { [weak avplayer] notify in
  47. avplayer?.seek(to: CMTime.zero)
  48. }
  49. return avplayer
  50. }()
  51. lazy var export : BFRecordExport = {
  52. let export = BFRecordExport()
  53. export.progress = {[weak self] progress in
  54. DispatchQueue.main.async { [weak self] in
  55. self?.progressView.frame = CGRect(x: 0, y: self?.navHeadImageView?.bottomY ?? 0, width: (cScreenWidth) * CGFloat(progress), height: 10)
  56. self?.progressL.text = String(format: "%d%%", Int(progress*100))
  57. }
  58. }
  59. export.exportCompletion = {[weak self] (error, url) in
  60. guard let strongSelf = self else {
  61. return
  62. }
  63. if let fileUrl = url {
  64. DispatchQueue.main.async { [weak self] in
  65. let item = AVPlayerItem(url: fileUrl)
  66. self?.avplayer.replaceCurrentItem(with: item)
  67. self?.avplayer.play()
  68. }
  69. }
  70. }
  71. return export
  72. }()
  73. deinit {
  74. avplayerTimeObserver?.invalidate()
  75. NotificationCenter.default.removeObserver(self)
  76. }
  77. override func viewWillAppear(_ animated: Bool) {
  78. super.viewWillAppear(animated)
  79. showNavigation()
  80. }
  81. override func backBtnClick() {
  82. export.cancelExport()
  83. super.backBtnClick()
  84. }
  85. override func viewDidLoad() {
  86. super.viewDidLoad()
  87. view.backgroundColor = .black
  88. navHeadImageView?.backgroundColor = .black
  89. leftButton(image: nil, imageName: nil, tintColor: UIColor.white)
  90. let backV = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
  91. backV.backgroundColor = .gray
  92. view.addSubview(backV)
  93. view.addSubview(progressView)
  94. view.addSubview(progressL)
  95. view.addSubview(progreddL)
  96. progreddL.snp.makeConstraints { make in
  97. make.top.equalTo(progressView.snp.bottom).offset(10)
  98. make.centerX.equalTo(progressL)
  99. make.width.equalTo(100)
  100. make.height.equalTo(20)
  101. }
  102. let playerLayer = AVPlayerLayer(player: avplayer)
  103. playerLayer.frame = CGRect(x: 10, y: self.progressView.bottomY, width: cScreenWidth - 20, height: cScreenHeigth - self.progressView.bottomY - 10)
  104. view.layer.addSublayer(playerLayer)
  105. export.startExprot()
  106. view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
  107. }
  108. @objc func play(){
  109. if self.avplayer.currentItem != nil {
  110. if self.avplayer.timeControlStatus == .playing {
  111. self.avplayer.pause()
  112. }else if self.avplayer.timeControlStatus == .paused{
  113. self.avplayer.play()
  114. }
  115. }
  116. }
  117. }