瀏覽代碼

Merge branch 'master' of https://git.yishihui.com/iOS/BFRecordScreenKit

* 'master' of https://git.yishihui.com/iOS/BFRecordScreenKit:
  1.图片录制结束的删除操作
  1.图片录制结束的删除操作
  1.update
harry 3 年之前
父節點
當前提交
ba0d5efe28

+ 4 - 0
BFRecordScreenKit/Classes/BFVoiceRecordManager.swift

@@ -43,6 +43,10 @@ class BFVoiceRecordManager: NSObject {
         audioRecorder = BFRecorderManager()
         audioRecorder?.delegate = self
     }
+    
+    deinit{
+        audioRecorder?.delegate = nil
+    }
 
     /// 开始录音
     func startRecord() {

+ 35 - 30
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -75,7 +75,6 @@ public class BFRecordScreenController: BFBaseViewController {
     var recordStartPlayTime: CMTime = .zero
     // 某个录音开始播放时间
     var currenStartPlayTime: CMTime = .zero
-//    var recordStartTime: Double = 0 // 录制开始时间
     var pauseTime: Double = 0 // 停止无操作的时间点
 
     var assetPlayer: AVPlayer? // 原视频音频播放器
@@ -428,13 +427,14 @@ public class BFRecordScreenController: BFBaseViewController {
             self?.NeoNuiAPPID = appkey
             self?.NeoNuiToken = token
         }
-        
-        //MARK: - 录音机初始化
+
+        // MARK: - 录音机初始化
+
         recorderManager = BFVoiceRecordManager()
 
         // 录音进度
         recorderManager?.recorderProgrossHandle = { [weak self] progress in
-//            BFLog(1, message: "curr:录音进度--\(progress) \(self?.recordStartTime ?? 0) \(self?.isRecording ?? false)")
+            BFLog(1, message: "curr:录音进度--\(progress),\(self?.isRecording ?? false)")
             self?.drawProgressIndication(progress: (progress.isNaN || progress.isInfinite) ? 0 : progress)
         }
 
@@ -481,6 +481,7 @@ public class BFRecordScreenController: BFBaseViewController {
             if let sself = self, let model = voideModel, FileManager.default.fileExists(atPath: model.wavFilePath ?? "") {
                 // 加入到语音数组里
                 model.endTime = sself.currentAssetProgress.seconds
+                BFLog(message: "录制结束当前录音文件:\(model.wavFilePath ?? "")-\(model.startTime)-\(model.endTime)-\(model.endTime - model.startTime)")
                 // ********** 开始处理冲突的录制部分
                 let newRange = CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 1000), end: CMTime(seconds: model.endTime, preferredTimescale: 1000))
 
@@ -488,24 +489,39 @@ 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-0.001, 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))
                         deletedTitlesTemp += sself.deleteTitles(voiceModel: m)
                         continue
                     }
                 }
-
                 // 删除冲突的音频
-                sself.itemModels[sself.currItemModelIndex].voiceStickers.removeAll { m in
-                    let originRange = CMTimeRange(start: CMTime(seconds: m.startTime, preferredTimescale: 1000), end: CMTime(seconds: m.endTime, preferredTimescale: 1000))
-                    return CMTimeRangeGetIntersection(originRange, otherRange: newRange).duration.seconds > 0
+                deletedVoices.forEach { m, _ in
+                    sself.itemModels[sself.currItemModelIndex].voiceStickers.removeAll { tempM in
+                        m.wavFilePath == tempM.wavFilePath
+                    }
                 }
                 BFLog(1, message: "添加录音文件:\(model.startTime) -- \(model.endTime)")
-
                 sself.itemModels[sself.currItemModelIndex].voiceStickers.append(model)
-
+                // 如果是图片素材同时有需要删除的录音时需要调整录音文件开始结束时间
+                if sself.itemModels[sself.currItemModelIndex].mediaType == .IMAGE {
+                    if deletedVoices.count > 0 {
+                        // 如果是图片先排序在计算区间
+                        sself.itemModels[sself.currItemModelIndex].voiceStickers = sself.itemModels[sself.currItemModelIndex].voiceStickers.sorted { voice1, voice2 in
+                            voice1.startTime < voice2.startTime
+                        }
+                        for (index, item) in sself.itemModels[sself.currItemModelIndex].voiceStickers.enumerated() {
+                            if index > 0 {
+                                // 注:开始时间减去duration or 等一前一段录音的结束时间
+                                let tempDuration = item.endTime - item.startTime
+                                item.startTime = sself.itemModels[sself.currItemModelIndex].voiceStickers[index - 1].endTime
+                                item.endTime = item.startTime + tempDuration
+                            }
+                            BFLog(message: "录制结束重新排序录音文件:\(index)-\(item.wavFilePath ?? "")-\(item.startTime)-\(item.endTime)-\(item.endTime - item.startTime)")
+                        }
+                    }
+                }
                 // ***********处理冲突的录音部分资源 end
 
                 // 添加撤销记录点
@@ -517,6 +533,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 if sself.itemModels[sself.currItemModelIndex].mediaType == .IMAGE {
                     var duration: Double = 0
                     sself.itemModels[sself.currItemModelIndex].voiceStickers.forEach { temp in
+                        BFLog(message: "录制结束-最终:\(temp.wavFilePath ?? "")-\(temp.startTime)-\(temp.endTime)-\(temp.endTime - temp.startTime)")
                         temp.duration = "\(temp.endTime - temp.startTime)"
                         duration = duration + (temp.endTime - temp.startTime)
                     }
@@ -542,8 +559,6 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
                 sself.currentPlayRecordIndex = -3 // 刚录音完,不需要播放录音
                 BFLog(3, message: "重置播放index-\(#function) = \(sself.currentPlayRecordIndex)")
-//                // 重置录制开始时间
-//                sself.recordStartTime = 0
             }
         }
         recorderManager?.cancelRecordHandle = { [weak self] voiceModel in
@@ -561,9 +576,6 @@ public class BFRecordScreenController: BFBaseViewController {
             }
             subtitleCount = self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.count ?? 0
             BFLog(2, message: "删除\(voiceModel?.wavFilePath ?? "")对应的字幕  后 count\(subtitleCount)")
-
-//            // 重置录制开始时间
-//            self?.recordStartTime = 0
             /// 重置进度
             self?.currentAssetProgress = CMTime(seconds: voiceModel?.startTime ?? 0, preferredTimescale: 1000)
             self?.resetCurrentProgress()
@@ -942,10 +954,6 @@ public class BFRecordScreenController: BFBaseViewController {
         recorderManager?.voiceModel = model
         recorderManager?.startRecord()
         recorderManager?.audioRecorder?.startNeoNui(NeoNuiToken ?? "", appid: NeoNuiAPPID ?? "")
-//        if recordStartTime <= 0 {
-//            recordStartTime = currentAssetProgress.seconds
-//        }
-
         isRecording = true
 
         if !avatarView.isHidden {
@@ -1168,7 +1176,6 @@ public class BFRecordScreenController: BFBaseViewController {
 
     // 是否吸附在录音首尾处
     func searchStopAtRecordRange(needAdsorb: Bool = false) {
-
         // TODO: 滑动,播放暂停,撤销时,判断是否停止录音区间,是则删除相关录音,画笔,头像,字幕
         let elems = itemModels[currItemModelIndex].voiceStickers.enumerated().filter { elem in
             elem.1.startTime <= self.currentAssetProgress.seconds && (elem.1.endTime - 0.001) > self.currentAssetProgress.seconds
@@ -1219,7 +1226,6 @@ public class BFRecordScreenController: BFBaseViewController {
             BFLog(1, message: "停在了录音区间外 \(isStopAtRecordRange)")
         }
         pauseTime = currentAssetProgress.seconds
-
     }
 
     // MARK: - 权限申请
@@ -1606,8 +1612,8 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
             }
         }
-        
-        if isRecording{
+
+        if isRecording {
             let ratioX = 0.08
             let startTime = recorderManager?.voiceModel?.startTime ?? 0
             let progress = currentAssetProgress.seconds - startTime // - ratioX
@@ -1616,7 +1622,6 @@ public class BFRecordScreenController: BFBaseViewController {
                 self?.indirectionView?.setProgress(start: startTime, progress: max(0, progress))
             }
         }
-        
     }
 
     func cleanMovieTarget() {
@@ -1660,7 +1665,7 @@ public class BFRecordScreenController: BFBaseViewController {
         }
         if itemModels[currItemModelIndex].mediaType == .VIDEO {
             let duration = itemModels[currItemModelIndex].materialDuraion
-            if  duration > 0{
+            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)")
@@ -1697,10 +1702,10 @@ public class BFRecordScreenController: BFBaseViewController {
         // 更新录制进度
         // 注:视频无法以录制进度驱动,因当录音开始录音时播放器还未播放,导致进度不一致
         // 注:在录制停止时,视频播放器进度依然在走,误差在80毫秒左右
-        if isRecording && itemModels[currItemModelIndex].mediaType == .IMAGE{
+        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))
         }
@@ -1923,7 +1928,7 @@ public extension BFRecordScreenController {
     /// 处理图片素材录音
     func imageRecordProgress(isRecord: Bool = false, progress: Float64) {
         if isRecord {
-            currentAssetProgress = CMTime(seconds: itemModels[currItemModelIndex].materialDuraion + progress, preferredTimescale: 1000)
+            currentAssetProgress = CMTime(seconds: (recorderManager?.voiceModel?.startTime ?? 0) + progress, preferredTimescale: 1000)
         } else {
             currentAssetProgress = CMTime(seconds: recordStartPlayTime.seconds + progress, preferredTimescale: 1000)
         }