Переглянути джерело

1.add videoplaySliderView

wenweiwei 3 роки тому
батько
коміт
1c70708b51
1 змінених файлів з 52 додано та 46 видалено
  1. 52 46
      Introduce/Record/INVideoExportController.swift

+ 52 - 46
Introduce/Record/INVideoExportController.swift

@@ -5,13 +5,13 @@
 //  Created by 胡志强 on 2021/11/29.
 //
 
+import BFAnalyzeKit
 import BFCommonKit
 import BFRecordScreenKit
 import BFUIKit
 import Foundation
 import Photos
 import UIKit
-import BFAnalyzeKit
 
 class INVideoExportController: BFBaseViewController {
     var avplayerTimeObserver: NSKeyValueObservation?
@@ -31,15 +31,7 @@ class INVideoExportController: BFBaseViewController {
     }
 
     // 预览播放进度
-    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
-    }()
+    var sliderView: BFVideoPlayerSliderView?
 
     // 合成进度指示条
     lazy var progressView: UIView = {
@@ -105,17 +97,18 @@ class INVideoExportController: BFBaseViewController {
 
     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
+        avplayerTimeObserver = avplayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 100), queue: DispatchQueue.global()) { [weak self, weak avplayer] _ in
             //    进度监控
             if let item = avplayer?.currentItem {
                 DispatchQueue.main.async { [weak self] in
-                    self?.progreddL.text = String(format: "%@ / %@", CMTimeGetSeconds(time).formatDurationToHMS(), CMTimeGetSeconds(item.duration).formatDurationToHMS())
+                    self?.sliderView?.progress = CMTimeGetSeconds(item.currentTime()) / CMTimeGetSeconds(item.duration)
                 }
             }
         } as? NSKeyValueObservation
 
-        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem, queue: .main) { [weak avplayer] _ in
+        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem, queue: .main) { [weak avplayer,weak self] _ in
             avplayer?.seek(to: CMTime.zero)
+            self?.sliderView?.playEnd()
         }
 
         return avplayer
@@ -150,7 +143,7 @@ class INVideoExportController: BFBaseViewController {
                 sself.saveToPhotoBtn.isEnabled = true
                 sself.completeBtn.isEnabled = true
 
-                sself.progreddL.isHidden = false
+                sself.sliderView?.isHidden = false
                 sself.progressView.isHidden = true
                 sself.progressL.isHidden = true
 
@@ -168,10 +161,12 @@ class INVideoExportController: BFBaseViewController {
                         sself.saveOnlyUlr = fileUrl
                         sself.hasExportOnly = true
                     }
+                    // 添加播放进度视图
+                    self?.addVideoSliderView()
                 }
             }
             // 合成成功上报
-            BFEventTrackAdaptor.baseReportUpload(businessType: nil, objectType: .ot_composeSuccess, pageSource: .sp_composePage,commonParams: commonParams())
+            BFEventTrackAdaptor.baseReportUpload(businessType: nil, objectType: .ot_composeSuccess, pageSource: .sp_composePage, commonParams: commonParams())
         }
         return export
     }()
@@ -201,9 +196,7 @@ class INVideoExportController: BFBaseViewController {
             }
             return
         }
-        if !(hasExportAll || hasExportOnly) {
-            
-        }
+        if !(hasExportAll || hasExportOnly) {}
         export.cancelExport()
         super.backBtnClick()
     }
@@ -216,7 +209,7 @@ class INVideoExportController: BFBaseViewController {
 
 //        backV.frame = CGRect(x: 0, y: navHeadImageView?.bottomY ?? 0, width: cScreenWidth, height: cScreenWidth)
         backV.backgroundColor = .clear
-        backV.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
+//        backV.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
 
         addSubviews()
 
@@ -236,7 +229,6 @@ class INVideoExportController: BFBaseViewController {
 
         backV.addSubview(progressView)
         backV.addSubview(progressL)
-        backV.addSubview(progreddL)
 
         bottomView.addSubview(saveAllBtn)
         bottomView.addSubview(saveOnlyBtn)
@@ -259,13 +251,6 @@ class INVideoExportController: BFBaseViewController {
             make.height.equalTo(28)
         }
 
-        progreddL.snp.makeConstraints { make in
-            make.bottom.equalToSuperview().offset(-10)
-            make.centerX.equalTo(backV)
-            make.width.equalTo(100)
-            make.height.equalTo(20)
-        }
-
         bottomView.snp.makeConstraints { make in
             make.left.right.equalToSuperview()
             if #available(iOS 11.0, *) {
@@ -306,6 +291,28 @@ class INVideoExportController: BFBaseViewController {
         }
     }
 
+    /// 添加播放进度视图
+    func addVideoSliderView() {
+        if sliderView == nil {
+            sliderView = BFVideoPlayerSliderView(frame: CGRect(x: 0, y: backV.frame.height - 60, width: backV.frame.width, height: 50))
+            sliderView?.valueChangeBloc = { [weak self] sender in
+                let cmtime = CMTime(value: CMTimeValue(Float64(sender.value) * Float64(self?.avplayer.currentItem?.asset.duration.seconds ?? 0) * 1000.0), timescale: CMTimeScale(1000.0))
+                BFLog(message: "cmtime == \(cmtime),\(cmtime.seconds)")
+                self?.avplayer.seek(to: cmtime)
+            }
+            sliderView?.btnClickBloc = { [weak self] sender in
+                // 按钮点击
+                if sender.tag == 1 {
+                    self?.play(sender: sender)
+                }
+            }
+        }
+        sliderView?.duration = avplayer.currentItem?.asset.duration.seconds ?? 0
+        if sliderView?.superview == nil {
+            backV.addSubview(sliderView!)
+        }
+    }
+
     // MARK: - 按钮事件
 
     func exportNow() {
@@ -322,11 +329,11 @@ class INVideoExportController: BFBaseViewController {
 
         progressView.isHidden = false
         progressL.isHidden = false
-        progreddL.isHidden = true
+        sliderView?.isHidden = true
         export.startExprot(synthesisAll: saveAllBtn.isSelected)
         UIApplication.shared.isIdleTimerDisabled = true
         // 开始合成上报
-        BFEventTrackAdaptor.baseReportUpload(businessType: nil, objectType: .ot_startCompose, pageSource: .sp_composePage,commonParams: commonParams())
+        BFEventTrackAdaptor.baseReportUpload(businessType: nil, objectType: .ot_startCompose, pageSource: .sp_composePage, commonParams: commonParams())
     }
 
     @objc func saveToPhotoNow() {
@@ -337,7 +344,7 @@ class INVideoExportController: BFBaseViewController {
         if let url = (avplayer.currentItem?.asset as? AVURLAsset)?.url {
             PHPhotoLibrary.shared().performChanges {
                 PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
-            } completionHandler: {[weak self] isFinished, _ in
+            } completionHandler: { [weak self] isFinished, _ in
                 guard let sself = self else {
                     return
                 }
@@ -354,7 +361,7 @@ class INVideoExportController: BFBaseViewController {
             }
         }
         // 点击保存至相册上报
-        BFEventTrackAdaptor.baseReportUpload(businessType: .bt_buttonClick, objectType: .ot_saveToAblum, pageSource: .sp_composePage,extParams: (saveAllBtn.isSelected ? ["saveAll":true] : ["saveRecord":true]),commonParams: commonParams())
+        BFEventTrackAdaptor.baseReportUpload(businessType: .bt_buttonClick, objectType: .ot_saveToAblum, pageSource: .sp_composePage, extParams: saveAllBtn.isSelected ? ["saveAll": true] : ["saveRecord": true], commonParams: commonParams())
     }
 
     @objc func saveAllAction(btn: UIButton) {
@@ -391,8 +398,10 @@ class INVideoExportController: BFBaseViewController {
 
     @objc func completeAction() {
         // MARK: 删除所有录制资源. 现在放在了选择相册展示时清理cache
-        if (!self.hasSaveOnly && self.saveOnlyUlr.absoluteString != "aaa")
-            || (!self.hasSaveAll && self.saveAllUlr.absoluteString != "aaa") {
+
+        if (!hasSaveOnly && saveOnlyUlr.absoluteString != "aaa")
+            || (!hasSaveAll && saveAllUlr.absoluteString != "aaa")
+        {
             let remindData = BFBaseModel()
             remindData.summary = "合成的视频尚未保存到相册"
             let alertV = BFRemindView(frame: view.bounds)
@@ -405,47 +414,45 @@ class INVideoExportController: BFBaseViewController {
                     return
                 }
                 if item.tag == 1 { // 确定返回到上一层
-                    if sself.hasExportOnly{
+                    if sself.hasExportOnly {
                         PHPhotoLibrary.shared().performChanges {
                             PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: sself.saveOnlyUlr)
-                        } completionHandler: { isFinished, _ in
-                            
+                        } completionHandler: { _, _ in
                         }
                     }
-                    if sself.hasExportAll{
+                    if sself.hasExportAll {
                         PHPhotoLibrary.shared().performChanges {
                             PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: sself.saveAllUlr)
-                        } completionHandler: { isFinished, _ in
-                            
+                        } completionHandler: { _, _ in
                         }
                     }
                 }
-                
+
                 sself.export.cancelExport()
                 sself.navigationController?.popToRootViewController(animated: true)
             }
             UIApplication.shared.keyWindow?.addSubview(alertV)
-        }else{
+        } else {
             export.cancelExport()
             navigationController?.popToRootViewController(animated: true)
         }
     }
 
-    @objc func play() {
+    @objc func play(sender: UIButton) {
         if isExporting {
             avplayer.pause()
             return
         }
         if avplayer.currentItem != nil {
-            if avplayer.timeControlStatus == .playing {
+            if avplayer.timeControlStatus == .playing || sender.isSelected {
                 avplayer.pause()
             } else if avplayer.timeControlStatus == .paused {
                 avplayer.play()
             }
         }
     }
-    
-    func whetherCancelExport(comfirm:(()->Void)?){
+
+    func whetherCancelExport(comfirm: (() -> Void)?) {
         let remindData = BFBaseModel()
         remindData.summary = "正在合成中,是否取消?"
         let alertV = BFRemindView(frame: view.bounds)
@@ -461,7 +468,6 @@ class INVideoExportController: BFBaseViewController {
                 sself.export.cancelExport()
                 comfirm?()
             }
-
         }
         UIApplication.shared.keyWindow?.addSubview(alertV)
     }