浏览代码

录制排序修复;
多素材缩略图修改

harry 3 年之前
父节点
当前提交
480cb3aa47

+ 36 - 8
BFRecordScreenKit/Classes/BFRecordExport.swift

@@ -46,20 +46,39 @@ public class BFRecordExport {
         if let itemModels = data {
             
             var totalDur = 0.0
-            for (index, itemModel) in itemModels.enumerated() {
+            
+            // 切割视频素材
+            for (_, itemModel) in itemModels.enumerated() {
                 itemModel.videoStickers.removeAll()
                 let asset = itemModel.baseMaterial
                 if let dur = asset?.duration.seconds {
                     if synthesisAll {
-                        let bgMovieInfo = splitBaseMaterial(timelineIn: totalDur, model_in: 0, duration: dur)
-                        bgMovieInfo.volumeGain = 0
-                        itemModel.videoStickers.append(bgMovieInfo)
-                        totalDur += dur
+//                        let bgMovieInfo = splitBaseMaterial(timelineIn: totalDur, model_in: 0, duration: dur)
+//                        bgMovieInfo.volumeGain = 0
+//                        itemModel.videoStickers.append(bgMovieInfo)
+//                        totalDur += dur
+                        var subDur = 0.0
+                        let drangs = itemModel.dealedDurationRanges
+                        for srange in drangs {
+                            let range = srange.range
+                            let sticker = splitBaseMaterial(timelineIn: (totalDur + subDur), model_in: range.start.seconds, duration: range.duration.seconds)
+                            sticker.volumeGain = srange.isRecord ? 0 : 100
+                            itemModel.videoStickers.append(sticker)
+                            subDur += range.duration.seconds
+                        }
+                        totalDur += subDur
+//                        assert(totalDur == dur)
                     } else {
                         var subDur = 0.0
-                        let drangs = itemModel.dealedDurationRanges.filter { ranges in
-                            ranges.isRecord == true
+                        let drangs = itemModel.dealedDurationRanges.filter { srange in
+                            srange.isRecord == true
                         }
+                        let needSort = false
+//                        if needSort {
+//                            drangs.sort { range1, range2 in
+//                                <#code#>
+//                            }
+//                        }
                         for srange in drangs {
                             let range = srange.range
                             let sticker = splitBaseMaterial(timelineIn: (totalDur + subDur), model_in: range.start.seconds, duration: range.duration.seconds)
@@ -128,10 +147,19 @@ public class BFRecordExport {
         guard let itemModel = data?.first else {
             return
         }
+        
         // 处理导出
         let voiceList = itemModel.voiceStickers
         let videoStickers = itemModel.videoStickers
-        if voiceList.count > 0 || videoStickers.count > 1 {
+        
+        guard let voiceCount = data?.reduce(0, { partialResult, itemModell in
+            itemModell.voiceStickers.count + partialResult
+        }) else {
+            BFLog(1, message: "voiceStickers count += nil")
+            return
+        }
+        // 有录音操作或者多个视频,就会进入合成步骤,否则就是一个没有处理的素材,直接导出就行了
+        if voiceCount > 0 || videoStickers.count > 1 {
 
             let (audioMix, composition) = mergeAudio(videoStickers: videoStickers, audios: voiceList,synthesisAll:synthesisAll)
             

+ 15 - 6
BFRecordScreenKit/Classes/BFRecordItemModel.swift

@@ -12,12 +12,13 @@ import BFFramework
 struct SplitRecordRange {
     var isRecord:Bool = false
     var range:CMTimeRange
+    var index:Int
 }
 
 public class BFRecordItemModel: NSObject {
     var baseMaterial : AVURLAsset?
     var dealedDurationRanges = [SplitRecordRange]()
-    public var voiceStickers = [PQVoiceModel]()
+    public var voiceStickers = [PQVoiceModel]()                         //
     public var videoStickers = [PQEditVisionTrackMaterialsModel]()
     public var imageStickers = [PQEditVisionTrackMaterialsModel]()
     public var titleStickers = [PQEditSubTitleModel]()
@@ -25,25 +26,33 @@ public class BFRecordItemModel: NSObject {
     public var width = 0
     public var height = 0
     
-    func generationTimeRanges() {
+    func generationTimeRanges(needSort:Bool = false) {
         
         dealedDurationRanges.removeAll()
         
         var start : Double = 0
-        for model in voiceStickers {
+        
+        var list: [PQVoiceModel]
+        list = voiceStickers.sorted { model1, model2 in
+            model1.startTime < model2.startTime
+        }
+        
+        for model in list {
+            
             if model.startTime > start{
                 //
                 let range = CMTimeRange(start: CMTime(seconds: start, preferredTimescale: 100), duration: CMTime(seconds: model.startTime - start, preferredTimescale: 100))
-                dealedDurationRanges.append(SplitRecordRange(isRecord: false, range: range))
+                dealedDurationRanges.append(SplitRecordRange(isRecord: false, range: range, index: -1))
             }
 
+            let ind = voiceStickers.firstIndex(of: model)
             let range = CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 100), end: CMTime(seconds: model.endTime, preferredTimescale: 100))
-            dealedDurationRanges.append(SplitRecordRange(isRecord: true, range: range))
+            dealedDurationRanges.append(SplitRecordRange(isRecord: true, range: range, index: ind ?? -1))
             start = model.endTime
         }
         if start < baseMaterial?.duration.seconds ?? 0 {
             let range = CMTimeRange(start: CMTime(seconds: start, preferredTimescale: 100), end: CMTime(seconds: baseMaterial?.duration.seconds ?? 0, preferredTimescale: 100))
-            dealedDurationRanges.append(SplitRecordRange(isRecord: false, range: range))
+            dealedDurationRanges.append(SplitRecordRange(isRecord: false, range: range, index: -1))
         }
         
     }

+ 2 - 1
BFRecordScreenKit/Classes/BFVoiceRecordManager.swift

@@ -22,7 +22,8 @@ class BFVoiceRecordManager {
     var beginRecordTime:Date = Date()
     var voiceModel : PQVoiceModel?
     
-    /// 录制音频
+    /// 录制音频。 index初衷是记录录音顺序,废弃了
+    ///
     func startRecord(index:Int){
         
         recorderFilePath = exportAudiosDirectory

+ 16 - 26
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -91,19 +91,10 @@ public class BFRecordScreenController: BFBaseViewController {
             if let sself = self, let model = model, FileManager.default.fileExists(atPath: model.wavFilePath ?? ""){
                 // 加入到语音数组里
                 // TODO: 原逻辑要删除新录音后边的数据, 新逻辑是覆盖则删除
-                var index = sself.itemModels[sself.currItemModelIndex].voiceStickers.count - 1
-                while index >= 0{
-                    let m = sself.itemModels[sself.currItemModelIndex].voiceStickers[index]
-                    
-                    // 找到比新录的早的录音,跳出判断
-                    if model.startTime >= m.endTime {
-                        break
-                    }
-                    
-                    index -= 1
+                for (i, m) in sself.itemModels[sself.currItemModelIndex].voiceStickers.enumerated(){
                     if model.endTime > m.startTime && model.endTime <= m.endTime
                         || model.startTime <= m.startTime && model.startTime > m.endTime{
-                        sself.itemModels[sself.currItemModelIndex].voiceStickers.remove(at: index+1)
+                        sself.itemModels[sself.currItemModelIndex].voiceStickers.remove(at: i)
                         continue
                     }
                 }
@@ -302,7 +293,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
                 sself.isDragingProgressSlder = true
 
-                BFLog(1, message: "drag 进行中")
+//                BFLog(1, message: "drag 进行中")
  
                 sself.changeProgress(progress: process)
             }
@@ -596,19 +587,11 @@ public class BFRecordScreenController: BFBaseViewController {
         BFLog(1, message: "start \(UIControl.Event.touchDown)")
         
         let point = progressThumV.progressView.contentOffset
-        progressThumV.progressView .setContentOffset(point, animated: false)
+        progressThumV.progressView.setContentOffset(point, animated: false)
         
         isRecording = true
         pause()
-        
-        events.append(WithDrawModel(type: 2, timestamp: self.currentAssetProgress.seconds))
-        
-        let model = PQVoiceModel()
-        model.startTime = self.currentAssetProgress.seconds
-        model.volume = 100
-        
-        //        recorderManager.voiceModel = model
-        //        recorderManager.startRecord(index: recordList.count)
+
         movie?.startProcessing()
         assetPlayer?.volume = 0
         assetPlayer?.play()
@@ -617,16 +600,21 @@ public class BFRecordScreenController: BFBaseViewController {
         if(!avatarView.isHidden){
             avatarView.beginRecord()
         }
-        
+                
+        let model = PQVoiceModel()
+        model.startTime = self.currentAssetProgress.seconds
+        model.volume = 100
         recorderManager.voiceModel = model
         recorderManager.startRecord(index: 1)
+        
+        // 添加撤销记录点
+        events.append(WithDrawModel(type: 2, timestamp: model.startTime))
  
 //        movie?.startProcessing()
 //        assetPlayer?.volume = 0
  
         assetPlayer?.play()
         
-        
         speechTranscriberUtil?.delegate = self
         speechTranscriberUtil?.startTranscriber()
         
@@ -962,7 +950,9 @@ public class BFRecordScreenController: BFBaseViewController {
                         self?.avasset = urlasset
                         itemModel.baseMaterial = urlasset
                         DispatchQueue.main.async {[weak self] in
-                            self?.progressThumV.videoAsset = urlasset
+                            if index == 0 {
+                                self?.progressThumV.videoAsset = urlasset
+                            }
                             self?.progressThumV.isHidden = false
                         }
                     }
@@ -1003,7 +993,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 if CMTimeGetSeconds(item.duration) > 0 {
                     DispatchQueue.main.async { [weak self] in
                         self?.progreddL.text = String(format: "%@", CMTimeGetSeconds(time).formatDurationToHMS())
-                        let su = !(self?.isDragingProgressSlder ?? false) || !(self?.isRecording ?? false && self?.isNormalPlaying ?? false)
+                        let su = !(self?.isDragingProgressSlder ?? false) || (self?.isRecording ?? false && self?.isNormalPlaying ?? false)
                         if su{
                             self?.progressThumV.progress = time.seconds
                         }