wenweiwei 3 年之前
父節點
當前提交
8777bb3284

+ 2 - 1
BFRecordScreenKit/Classes/BFRecordItemModel.swift

@@ -142,7 +142,7 @@ public class BFRecordItemModel: NSObject {
     /// - parameter frames                          : 需要取的帧数
     /// - parameter firstImagesCount             : 获取首先N张连续视频帧后先返回给调用方使用作为缓冲
     /// - parameter splitCompleteClosure    : 回调
-    func splitVideoFileUrlFps(frames: Int, firstImagesCount:Int = 0, splitCompleteClosure: @escaping ((Bool, [UIImage]) -> Void)) {
+    func splitVideoFileUrlFps(frames: Int, firstImagesCount:Int = 0, maxSize:CGSize = CGSize(width: 200, height: 200), splitCompleteClosure: @escaping ((Bool, [UIImage]) -> Void)) {
         guard let urlAsset = videoAsset, urlAsset.duration.seconds > 0 else {
             return
         }
@@ -165,6 +165,7 @@ public class BFRecordItemModel: NSObject {
         imgGenerator.requestedTimeToleranceBefore = CMTime.zero
         imgGenerator.requestedTimeToleranceAfter = CMTime.zero
         imgGenerator.appliesPreferredTrackTransform = true
+        imgGenerator.maximumSize = CGSize(width: 200, height: 200)
         let timesCount = times.count
         var cocu = 0
         // 获取每一帧的图片

+ 28 - 12
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -427,6 +427,9 @@ public class BFRecordScreenController: BFBaseViewController {
             self?.NeoNuiAPPID = appkey
             self?.NeoNuiToken = token
         }
+
+        // MARK: - 录音机初始化
+
         recorderManager = BFVoiceRecordManager()
 
         // 录音进度
@@ -486,8 +489,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 // 要删除的字幕
                 var deletedTitlesTemp = [(PQEditSubTitleModel, Int)]()
                 for (i, m) in sself.itemModels[sself.currItemModelIndex].voiceStickers.enumerated() {
-                    BFLog(message: "录制结束查询时间重合录音文件:\(i)-\(m.wavFilePath ?? "")-\(m.startTime)-\(m.endTime)-\(m.endTime - m.startTime)")
-                    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))
                         deletedTitlesTemp += sself.deleteTitles(voiceModel: m)
@@ -1174,8 +1176,6 @@ public class BFRecordScreenController: BFBaseViewController {
 
     // 是否吸附在录音首尾处
     func searchStopAtRecordRange(needAdsorb: Bool = false) {
-        pauseTime = currentAssetProgress.seconds
-
         // TODO: 滑动,播放暂停,撤销时,判断是否停止录音区间,是则删除相关录音,画笔,头像,字幕
         let elems = itemModels[currItemModelIndex].voiceStickers.enumerated().filter { elem in
             elem.1.startTime <= self.currentAssetProgress.seconds && (elem.1.endTime - 0.001) > self.currentAssetProgress.seconds
@@ -1192,10 +1192,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: "吸附在录音开始")
@@ -1207,7 +1208,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
@@ -1224,6 +1225,7 @@ public class BFRecordScreenController: BFBaseViewController {
             isStopAtRecordRange = -1
             BFLog(1, message: "停在了录音区间外 \(isStopAtRecordRange)")
         }
+        pauseTime = currentAssetProgress.seconds
     }
 
     // MARK: - 权限申请
@@ -1610,6 +1612,16 @@ 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() {
@@ -1652,8 +1664,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())
@@ -1674,6 +1687,7 @@ public class BFRecordScreenController: BFBaseViewController {
         }
     }
 
+    // 画进度线
     func drawProgressIndication(progress: Double) {
         if indirectionView == nil {
             var percenWidth: CGFloat = 0
@@ -1688,9 +1702,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 {

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

@@ -102,6 +102,8 @@ class BFVideoThumbProgressView: UIView {
     /// 处理视频缩略图
     func dealWithVideoThumb() {
         guard let videoAsset = recordItem?.videoAsset else {
+            // 可能icloud资源没回来,清空原有内容
+            self.addThumbImages(images: [UIImage]())
             return
         }
         self.addThumbImages(images: recordItem!.thumbImgs)