浏览代码

录制进度条使用实际播放的进度来计算,不使用录音的进度,它有延迟;
判断停止时的录音按钮状态

harry 3 年之前
父节点
当前提交
41b811e48c
共有 1 个文件被更改,包括 29 次插入10 次删除
  1. 29 10
      BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

+ 29 - 10
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -428,6 +428,8 @@ public class BFRecordScreenController: BFBaseViewController {
             self?.NeoNuiAPPID = appkey
             self?.NeoNuiToken = token
         }
+        
+        //MARK: - 录音机初始化
         recorderManager = BFVoiceRecordManager()
 
         // 录音进度
@@ -486,7 +488,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 // 要删除的字幕
                 var deletedTitlesTemp = [(PQEditSubTitleModel, Int)]()
                 for (i, m) in sself.itemModels[sself.currItemModelIndex].voiceStickers.enumerated() {
-                    let originRange = CMTimeRange(start: CMTime(seconds: m.startTime, preferredTimescale: 1000), end: CMTime(seconds: m.endTime, preferredTimescale: 1000))
+                    let originRange = CMTimeRange(start: CMTime(seconds: m.startTime, preferredTimescale: 1000), end: CMTime(seconds: m.endTime-0.001, preferredTimescale: 1000))
 
                     if CMTimeRangeGetIntersection(originRange, otherRange: newRange).duration.seconds > 0 {
                         deletedVoices.append((m, i))
@@ -1166,7 +1168,6 @@ public class BFRecordScreenController: BFBaseViewController {
 
     // 是否吸附在录音首尾处
     func searchStopAtRecordRange(needAdsorb: Bool = false) {
-        pauseTime = currentAssetProgress.seconds
 
         // TODO: 滑动,播放暂停,撤销时,判断是否停止录音区间,是则删除相关录音,画笔,头像,字幕
         let elems = itemModels[currItemModelIndex].voiceStickers.enumerated().filter { elem in
@@ -1184,10 +1185,11 @@ public class BFRecordScreenController: BFBaseViewController {
                     changeProgress(progress: Float(elems[0].1.endTime / itemModels[currItemModelIndex].materialDuraion))
                     progressThumV.progress = elems[0].1.endTime
 
-                    deleteRecordBtn.isHidden = true
-                    recordBtn.isHidden = false
-                    isStopAtRecordRange = -1
-                    BFLog(1, message: "停在了录音区间外 \(isStopAtRecordRange)")
+//                    deleteRecordBtn.isHidden = true
+//                    recordBtn.isHidden = false
+//                    isStopAtRecordRange = -1
+//                    BFLog(1, message: "停在了录音区间外 \(isStopAtRecordRange)")
+                    searchStopAtRecordRange(needAdsorb: false)
                 } else {
                     if fabs(elems[0].1.startTime - currentAssetProgress.seconds) < 0.5 {
                         BFLog(1, message: "吸附在录音开始")
@@ -1199,7 +1201,7 @@ public class BFRecordScreenController: BFBaseViewController {
                     recordBtn.isHidden = true
                     isStopAtRecordRange = elems.first!.0
 
-                    BFLog(1, message: "停在了录音区间里 \(isStopAtRecordRange)")
+                    BFLog(1, message: "停在了录音区间里 \(isStopAtRecordRange), currTime:\(currentAssetProgress.seconds), 录音范围:\(elems[0].1.startTime) - \(elems[0].1.endTime)")
                 }
             } else {
                 deleteRecordBtn.isHidden = false
@@ -1216,6 +1218,8 @@ public class BFRecordScreenController: BFBaseViewController {
             isStopAtRecordRange = -1
             BFLog(1, message: "停在了录音区间外 \(isStopAtRecordRange)")
         }
+        pauseTime = currentAssetProgress.seconds
+
     }
 
     // MARK: - 权限申请
@@ -1602,6 +1606,17 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
             }
         }
+        
+        if isRecording{
+            let ratioX = 0.08
+            let startTime = recorderManager?.voiceModel?.startTime ?? 0
+            let progress = currentAssetProgress.seconds - startTime // - ratioX
+            // 使用播放器的进度来画线,因为进度是跟着播放器来了
+            DispatchQueue.main.async { [weak self] in
+                self?.indirectionView?.setProgress(start: startTime, progress: max(0, progress))
+            }
+        }
+        
     }
 
     func cleanMovieTarget() {
@@ -1644,8 +1659,9 @@ public class BFRecordScreenController: BFBaseViewController {
             newProgress = 0
         }
         if itemModels[currItemModelIndex].mediaType == .VIDEO {
-            if let duration = assetPlayer?.currentItem?.duration {
-                currentAssetProgress = CMTime(value: CMTimeValue(newProgress * Float(CMTimeGetSeconds(duration)) * 1000), timescale: 1000)
+            let duration = itemModels[currItemModelIndex].materialDuraion
+            if  duration > 0{
+                currentAssetProgress = CMTime(value: CMTimeValue(newProgress * Float(duration) * 1000), timescale: 1000)
                 DispatchQueue.main.async { [weak self] in
                     BFLog(message: "更新录音进度\(#function)-\(self?.currentAssetProgress.seconds ?? 0)")
                     self!.progreddL.text = String(format: "%@", CMTimeGetSeconds(self!.currentAssetProgress).formatDurationToHMS())
@@ -1666,6 +1682,7 @@ public class BFRecordScreenController: BFBaseViewController {
         }
     }
 
+    // 画进度线
     func drawProgressIndication(progress: Double) {
         if indirectionView == nil {
             var percenWidth: CGFloat = 0
@@ -1680,9 +1697,11 @@ public class BFRecordScreenController: BFBaseViewController {
         // 更新录制进度
         // 注:视频无法以录制进度驱动,因当录音开始录音时播放器还未播放,导致进度不一致
         // 注:在录制停止时,视频播放器进度依然在走,误差在80毫秒左右
-        if isRecording {
+        if isRecording && itemModels[currItemModelIndex].mediaType == .IMAGE{
             let ratioX = 0.08
             let startTime = recorderManager?.voiceModel?.startTime ?? 0
+            
+            // 使用播放器的进度来画线,因为进度是跟着播放器来了
             indirectionView?.setProgress(start: startTime, progress: max(0, progress - ratioX))
         }
         if itemModels[currItemModelIndex].mediaType == .IMAGE {