Bläddra i källkod

录音时长和摄像时长不一致在1s附件引起的问题

harry 3 år sedan
förälder
incheckning
dfd9977030

+ 4 - 0
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenBaseManager.swift

@@ -74,6 +74,10 @@ class BFRecordScreenBaseManager : NSObject{
     func cancelRecord(){
     func cancelRecord(){
         
         
         
         
+    }
+    
+    func recordFinished(isSuccess:Bool){
+        
     }
     }
     
     
     func dragEnd(){
     func dragEnd(){

+ 43 - 24
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -50,6 +50,8 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     var currPlayTime : CMTime = .zero
     var currPlayTime : CMTime = .zero
     
     
     fileprivate var timerr:Timer?
     fileprivate var timerr:Timer?
+    
+    var writerlock = false
    
    
     var movieWrite : GPUImageMovieWriter?
     var movieWrite : GPUImageMovieWriter?
     
     
@@ -165,7 +167,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     }
     }
     
     
     override func startRecord(){
     override func startRecord(){
-        guard let movieWrite = movieWrite else {
+        guard let movieWrite = movieWrite, !writerlock else {
             cShowHUB(superView: nil, msg: "option_fail_record".BFLocale)
             cShowHUB(superView: nil, msg: "option_fail_record".BFLocale)
             return
             return
         }
         }
@@ -181,6 +183,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         videoModel.thumImgs = [UIImage]()
         videoModel.thumImgs = [UIImage]()
         videoModel.timelineCMIn = currentAssetProgress
         videoModel.timelineCMIn = currentAssetProgress
         videoModel.timelineCMOut = currentAssetProgress
         videoModel.timelineCMOut = currentAssetProgress
+        videoModel.locationPath = "nil"
         currVideoIndex = recordItem?.videoStickers.count ?? 0
         currVideoIndex = recordItem?.videoStickers.count ?? 0
         
         
         // 为了第一时间能更新collection view数据
         // 为了第一时间能更新collection view数据
@@ -212,7 +215,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     
     
     override func endRecord(){
     override func endRecord(){
         super.endRecord()
         super.endRecord()
-        
+        writerlock = true
         timerr?.invalidate()
         timerr?.invalidate()
         timerr = nil
         timerr = nil
 //        BFLog(1, message: " 拍摄时长 \(Date().timeIntervalSince(startTime))")
 //        BFLog(1, message: " 拍摄时长 \(Date().timeIntervalSince(startTime))")
@@ -227,21 +230,14 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
                         let dur = AVURLAsset(url: URL(fileURLWithPath: finalPath))
                         let dur = AVURLAsset(url: URL(fileURLWithPath: finalPath))
                         wself.videoModel.timelineCMOut = wself.videoModel.timelineCMIn + CMTime(seconds: dur.duration.seconds, preferredTimescale: 1000)
                         wself.videoModel.timelineCMOut = wself.videoModel.timelineCMIn + CMTime(seconds: dur.duration.seconds, preferredTimescale: 1000)
                         BFLog(1, message: "拍摄文件时长:\(wself.videoModel.timelineCMIn.seconds)~\(wself.videoModel.timelineCMOut.seconds),  \(dur.duration.seconds)")
                         BFLog(1, message: "拍摄文件时长:\(wself.videoModel.timelineCMIn.seconds)~\(wself.videoModel.timelineCMOut.seconds),  \(dur.duration.seconds)")
-                        if (wself.videoModel.timelineCMOut - wself.videoModel.timelineCMIn).seconds > 1 {
-                            wself.videoModel.locationPath = finalPath
-                            wself.currentAssetProgress = wself.videoModel.timelineCMOut
-                            wself.recordEndCallBack?(true, wself.videoModel)
-                        }else{
-                            wself.revertLast()
-                            BFLog(1, message: "摄像录制小于1s")
-                            wself.recordEndCallBack?(false, nil)
+                        wself.videoModel.locationPath = finalPath
+                        if (wself.videoModel.timelineCMOut - wself.videoModel.timelineCMIn).seconds < 1 {
+                            wself.recordFinished(isSuccess: false)
                         }
                         }
-
                     }else{
                     }else{
                         // 录制失败后恢复原样
                         // 录制失败后恢复原样
-                        wself.revertLast()
-                        cShowHUB(superView: nil, msg: "option_fail_file".BFLocale)
-                        wself.recordEndCallBack?(false, nil)
+                        wself.recordFinished(isSuccess: false)
+                        cShowHUB(superView: nil, msg: "shoot_tips_least".BFLocale)
 
 
                     }
                     }
                     DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {[weak self] in
                     DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {[weak self] in
@@ -250,16 +246,28 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
                         wself.updateUI(progress:  wself.currentAssetProgress)
                         wself.updateUI(progress:  wself.currentAssetProgress)
                     }
                     }
 
 
-                }else{
-                    wself.hasInitCallBack?()
                 }
                 }
             }
             }
             
             
             // 重置writer,提前为下次录制做准备
             // 重置writer,提前为下次录制做准备
             wself.initerlizeWriter()
             wself.initerlizeWriter()
+            wself.writerlock = false
         })
         })
     }
     }
     
     
+    override func recordFinished(isSuccess:Bool){
+        if isSuccess {
+            currentAssetProgress = videoModel.timelineCMOut
+            recordEndCallBack?(true, videoModel)
+        }else{
+            if (videoModel.thumImgs?.count ?? 0) > 0 {
+                revertLast()
+                recordEndCallBack?(false, nil)
+            }
+            BFLog(1, message: "摄像录制小于1s")
+        }
+    }
+    
     override func cancelRecord(){
     override func cancelRecord(){
         
         
         revertLast()
         revertLast()
@@ -329,20 +337,31 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         if vmod != nil {
         if vmod != nil {
             vmod!.timelineCMOut = vmod!.timelineCMIn
             vmod!.timelineCMOut = vmod!.timelineCMIn
             currentAssetProgress = vmod!.timelineCMOut
             currentAssetProgress = vmod!.timelineCMOut
-            recordItem?.thumbImgs.removeAll(where: { img in
-                vmod!.thumImgs?.contains(img) ?? false
-            })
-            DispatchQueue.main.async {[weak self] in
-                guard let wself = self else { return }
-                
-                wself.cameraProgressV?.collectionV.reloadData()
-            }
 //            vmod.thumImgs?.removeAll()
 //            vmod.thumImgs?.removeAll()
             recordItem?.videoStickers.removeAll(where: { mod in
             recordItem?.videoStickers.removeAll(where: { mod in
                 mod == vmod
                 mod == vmod
             })
             })
         }
         }
         
         
+        resetThumbImg()
+    }
+    
+    func resetThumbImg(){
+        videoModel.thumImgs?.removeAll()
+        let vidos = recordItem?.videoStickers
+        var tmpThumbs = [UIImage]()
+        vidos?.forEach({ mod in
+            if let imgs = mod.thumImgs{
+                tmpThumbs.append(contentsOf: imgs)
+            }
+        })
+        recordItem?.thumbImgs = tmpThumbs
+        DispatchQueue.main.async {[weak self] in
+            guard let wself = self else { return }
+            
+            wself.cameraProgressV?.collectionV.reloadData()
+        }
+        
     }
     }
     
     
     // 使用avplayer进行播放视频和音频
     // 使用avplayer进行播放视频和音频

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

@@ -874,13 +874,17 @@ public class BFRecordScreenController: BFBaseViewController {
                 // 加入到语音数组里
                 // 加入到语音数组里
 
 
                 model.endCMTime = wself.currentAssetProgress
                 model.endCMTime = wself.currentAssetProgress
-                BFLog(1, message: "录音地址:\((model.wavFilePath ?? "").replacingOccurrences(of: documensDirectory, with: "")) -  \(model.startCMTime.seconds)~\(model.endCMTime.seconds), dur: \(model.endCMTime.seconds - model.startCMTime.seconds)")
+                BFLog(1, message: "录音地址:\((model.wavFilePath ?? "").replacingOccurrences(of: documensDirectory, with: ""))")
+                BFLog(1, message: "录音文件时长:\(model.startCMTime.seconds) -- \(model.endCMTime.seconds), dur: \(model.endCMTime.seconds - model.startCMTime.seconds)")
+
                 /// 注:录音机回调的录音时长大于一秒,而业务逻辑计算的会小于一秒
                 /// 注:录音机回调的录音时长大于一秒,而业务逻辑计算的会小于一秒
                 if (model.endCMTime.seconds - model.startCMTime.seconds) < 1 {
                 if (model.endCMTime.seconds - model.startCMTime.seconds) < 1 {
                     // 取消录制
                     // 取消录制
                     wself.recordManagerCancelRecord(voiceModel: model)
                     wself.recordManagerCancelRecord(voiceModel: model)
+                    wself.rscurrentManager.recordFinished(isSuccess: false)
                     return
                     return
                 }
                 }
+                wself.rscurrentManager.recordFinished(isSuccess:true)
                 // ********** 开始处理冲突的录制部分
                 // ********** 开始处理冲突的录制部分
                 let newRange = CMTimeRange(start: model.startCMTime, end: model.endCMTime)
                 let newRange = CMTimeRange(start: model.startCMTime, end: model.endCMTime)
 
 
@@ -904,7 +908,6 @@ public class BFRecordScreenController: BFBaseViewController {
                     }
                     }
                 }
                 }
 
 
-                BFLog(1, message: "录音文件时长:\(model.startCMTime.seconds) -- \(model.endCMTime.seconds)")
                 wself.itemModels[wself.currItemModelIndex].voiceStickers.append(model)
                 wself.itemModels[wself.currItemModelIndex].voiceStickers.append(model)
                 // 录制结束回调
                 // 录制结束回调
                 wself.recordEndHandle?(model)
                 wself.recordEndHandle?(model)
@@ -1372,6 +1375,8 @@ public class BFRecordScreenController: BFBaseViewController {
             guard let wself = self else { return }
             guard let wself = self else { return }
             wself.recordBtn.isHidden = false
             wself.recordBtn.isHidden = false
             
             
+            
+            
             if voiceModel?.currIndex == wself.currItemModelIndex {
             if voiceModel?.currIndex == wself.currItemModelIndex {
                 if wself.currMediaType == .Image {
                 if wself.currMediaType == .Image {
                     wself.rscurrentManager.currentAssetProgress = CMTime(seconds: wself.recorderManager?.voiceModel?.startCMTime.seconds ?? 0, preferredTimescale: 1000)
                     wself.rscurrentManager.currentAssetProgress = CMTime(seconds: wself.recorderManager?.voiceModel?.startCMTime.seconds ?? 0, preferredTimescale: 1000)

+ 0 - 1
BFRecordScreenKit/Classes/RecordScreen/View/ProgressView/BFCameraProgressView.swift

@@ -78,7 +78,6 @@ class BFCameraProgressView: BFProgressBaseView {
 
 
 extension BFCameraProgressView: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
 extension BFCameraProgressView: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
-        BFLog(1, message: "numb:\(recordItem?.thumbImgs.count ?? 0)")
         return recordItem?.thumbImgs.count ?? 0
         return recordItem?.thumbImgs.count ?? 0
     }
     }