Explorar o código

优化缩略图
修正摄像头1s左右录制的同步问题

胡志强 %!s(int64=3) %!d(string=hai) anos
pai
achega
58a6487271

+ 1 - 1
BFRecordScreenKit/Classes/BFVoiceRecordManager.swift

@@ -82,7 +82,7 @@ class BFVoiceRecordManager: NSObject {
     /// 停止录制
     /// - Parameter isCancel: 是否为取消 ,取消操作会把录制的文件删除和字幕删除
     func stopRecord(isCancel: Bool) {
-        BFLog(2, message: "\(debugHeader)结束录音::: \(Date().timeIntervalSince1970)")
+//        BFLog(1, message: "\(debugHeader)结束录音::: \(Date().timeIntervalSince1970)")
 
         isStoping = true
         mIsCancel = isCancel

+ 30 - 37
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -65,6 +65,11 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         
     }()
     
+    lazy var gropQueue : DispatchGroup = {
+        let group = DispatchGroup() //创建group
+        return group
+    }()
+    
     var avplayerTimeObserver: NSKeyValueObservation?
     
     lazy var avplayer : AVPlayer = {
@@ -154,9 +159,9 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             startRecord()
             DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: { [weak self] in
                 guard let wself = self else { return }
-
+                wself.gropQueue.leave()
+                wself.gropQueue.leave()
                 wself.endRecord()
-                BFRecordScreenCameraManager.firstOpenCamera = false
             })
         }
         
@@ -216,6 +221,25 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 //            wself.getThumImage()
         })
         RunLoop.current.add(timerr!, forMode: .common)
+        
+        gropQueue.enter() // 录音
+        gropQueue.enter() // 录像
+        gropQueue.notify(queue: DispatchQueue.main) {[weak self] in
+            guard let wself = self else { return }
+            if BFRecordScreenCameraManager.firstOpenCamera{
+                BFRecordScreenCameraManager.firstOpenCamera = false
+                return
+            }
+            let cameraSuccess = wself.recordFinishedResult && ((wself.videoModel.timelineCMOut - wself.videoModel.timelineCMIn).seconds > 1)
+            if cameraSuccess {
+                wself.currentAssetProgress = wself.videoModel.timelineCMOut
+                wself.recordEndCallBack?(true, wself.videoModel)
+            }else {
+                wself.videoModel.locationPath = "nil"
+                wself.revertLast()
+                wself.recordEndCallBack?(false, nil)
+            }
+        }
     }
     
     override func endRecord(){
@@ -237,28 +261,12 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
                         wself.videoModel.timelineCMOut = wself.videoModel.timelineCMIn + CMTime(seconds: dur.duration.seconds, preferredTimescale: 1000)
                         BFLog(1, message: "文件时长camera:\(wself.recordItem?.videoStickers.count ?? 0),   \(wself.videoModel.timelineCMIn.seconds)~\(wself.videoModel.timelineCMOut.seconds),  \(dur.duration.seconds)")
                         wself.videoModel.locationPath = finalPath
-                        if (wself.videoModel.timelineCMOut - wself.videoModel.timelineCMIn).seconds <= 1 {
-                            wself.videoModel.locationPath = "nil"
-                            wself.revertLast()
-                            wself.recordEndCallBack?(false, nil)
-
-                        }else{
-                            if wself.recordFinishedResult {
-                                // 代表录制成功了
-                                wself.currentAssetProgress = wself.videoModel.timelineCMOut
-                                wself.recordEndCallBack?(true, wself.videoModel)
-                            }
-                        }
                     }else{
-                        // 录制失败后恢复原样
-                        wself.revertLast()
-                        wself.recordEndCallBack?(false, nil)
                         cShowHUB(superView: nil, msg: "shoot_tips_least".BFLocale)
-
                     }
+                    wself.gropQueue.leave()
                     DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {[weak self] in
                         guard let wself = self else { return }
-                        
                         wself.updateUI(progress:  wself.currentAssetProgress)
                     }
 
@@ -272,23 +280,8 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     }
     
     override func recordFinished(isSuccess:Bool) {
-
         recordFinishedResult = isSuccess
-        
-        //
-        if videoModel.locationPath != "nil" {
-            if isSuccess {
-                currentAssetProgress = videoModel.timelineCMOut
-                recordEndCallBack?(true, videoModel)
-            }else{
-                if (videoModel.thumImgs?.count ?? 0) > 0 { //用图片数量来判断是否已经删除了当次录制
-                    revertLast()
-                    recordEndCallBack?(false, nil)
-                }
-                BFLog(1, message: "摄像录制小于1s")
-            }
-
-        }
+        gropQueue.leave()
     }
     
     func dealCamera(_ isSuccess: Bool) {
@@ -448,8 +441,8 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     func prepareToPlayNext(needPlay:Bool = true){
         if let mod = recordItem?.videoStickers.sorted(by: { m1, m2 in
             m1.timelineCMIn.seconds < m2.timelineCMIn.seconds
-        }).first(where: { mod in
-            CMTimeCompare(mod.timelineCMIn, currentAssetProgress + CMTime(seconds: 0.33, preferredTimescale: 1000)) <= 0 && CMTimeCompare((currentAssetProgress + CMTime(seconds: 0.33, preferredTimescale: 1000)), mod.timelineCMOut) < 0
+        }).first(where: { mode in
+            CMTimeCompare(mode.timelineCMIn, currentAssetProgress + CMTime(seconds: 0.33, preferredTimescale: 1000)) <= 0 && CMTimeCompare((currentAssetProgress + CMTime(seconds: 0.33, preferredTimescale: 1000)), mode.timelineCMOut) < 0
         }){
             currPlayTime = mod.timelineCMIn
             locationTo(time: currentAssetProgress)

+ 2 - 4
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -76,7 +76,7 @@ public class BFRecordScreenController: BFBaseViewController {
                     (mod.timelineCMOut - mod.timelineCMIn).seconds + partialResult
                 })
                 wself.rscmanager.recordItem?.materialDuraion = CMTime(seconds: dur ?? 0, preferredTimescale: 1000)
-                BFLog(1, message: "camera:\(sticker.timelineCMIn.seconds) ~ \(sticker.timelineCMOut.seconds)")
+//                BFLog(1, message: "camera:\(sticker.timelineCMIn.seconds) ~ \(sticker.timelineCMOut.seconds)")
             }
         }
         return m
@@ -986,6 +986,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 BFLog(3, message: "重置播放index-\(#function) = \(wself.currentPlayRecordIndex)")
                 recorderManager?.voiceModel = nil
             } else {
+                wself.rscurrentManager.recordFinished(isSuccess: false)
                 BFLog(2, message: "数据出错!!!!\(voideModel?.wavFilePath ?? "")")
             }
         }
@@ -1282,9 +1283,6 @@ public class BFRecordScreenController: BFBaseViewController {
         UIApplication.shared.keyWindow?.isUserInteractionEnabled = false
         AudioServicesPlaySystemSound(1520)
 
-//        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
-//            self.endRecord()
-//        }
         
         if !avatarView.isHidden {
             avatarView.beginRecord()

+ 1 - 1
BFRecordScreenKit/Classes/RecordScreen/View/BFIndirectionProgressView.swift

@@ -162,7 +162,7 @@ class BFIndirectionProgressView: UIView {
         if width.isNaN || width.isInfinite {
             newW = 0
         }
-        let lineV = UIView(frame: CGRect(x: minX < 0 ? 0 : minX, y: 0, width: newW, height: progressHeight))
+        let lineV = BFThumImageView(frame: CGRect(x: minX < 0 ? 0 : minX, y: 0, width: newW, height: progressHeight))
         lineV.backgroundColor = indirec ? indirecColor : themeColor
         addSubview(lineV)
         return lineV

+ 24 - 3
BFRecordScreenKit/Classes/RecordScreen/View/BFThumImageView.swift

@@ -7,7 +7,7 @@
 
 import Foundation
 
-class BFThumImageView: UIImageView {
+class BFThumImageView: UIView {
     var isHiddenBord = false{
         didSet{
             if let v = self.viewWithTag(12333){
@@ -15,6 +15,19 @@ class BFThumImageView: UIImageView {
             }
         }
     }
+    
+    fileprivate let iv : UIImageView = {
+        let iv = UIImageView()
+        iv.frame = CGRect(x: 0, y: 0, width: 79, height: 50)
+        return iv
+    }()
+    
+    var image: UIImage? {
+        didSet{
+            iv.image = image
+        }
+    }
+    
     override init(frame: CGRect) {
         super.init(frame: frame)
         addIndicationView()
@@ -24,12 +37,20 @@ class BFThumImageView: UIImageView {
         fatalError("init(coder:) has not been implemented")
     }
     
-    override init(image: UIImage?) {
-        super.init(image: image)
+    init(image: UIImage?) {
+        super.init(frame: CGRect.zero)
+        self.image =  image
+        self.clipsToBounds = true
         addIndicationView()
     }
     
     func addIndicationView(){
+        subviews.forEach { v in
+            v.removeFromSuperview()
+        }
+        
+        addSubview(iv)
+        
         let bottomView = UIView()
         bottomView.backgroundColor = ThemeStyleColor
         addSubview(bottomView)

+ 2 - 0
BFRecordScreenKit/Classes/RecordScreen/View/ProgressView/BFVideoThumbProgressView.swift

@@ -275,6 +275,7 @@ class BFVideoThumbProgressView: BFProgressBaseView {
 
 extension BFVideoThumbProgressView: UIScrollViewDelegate {
     func scrollViewDidScroll(_ scrollView: UIScrollView) {
+        BFLog(1, message: "scrollViewDidScroll")
         let totalW = recordItem?.mediaType == .Video ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion.seconds ?? 0) * thumbImageWidth / 2.0)
         if recordItem?.mediaType == .Video {
             if isDrag {
@@ -291,6 +292,7 @@ extension BFVideoThumbProgressView: UIScrollViewDelegate {
     }
 
     func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
+        BFLog(1, message: "scrollViewWillBeginDragging")
         isDrag = true
         let totalW = recordItem?.mediaType == .Video ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion.seconds ?? 0) * thumbImageWidth / 2.0)
         dragStartHandle?()