Przeglądaj źródła

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

# Conflicts:
#	BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift合并代码
jsonwang 3 lat temu
rodzic
commit
965e8c1cab

+ 1 - 1
BFRecordScreenKit/Classes/BFRecordItemModel.swift

@@ -45,6 +45,7 @@ public class BFRecordItemModel: NSObject {
     func initOriginData(phasset: PHAsset) {
         width = phasset.pixelWidth
         height = phasset.pixelHeight
+        materialDuraion = phasset.duration
         
         fetchCoverImage(phasset)
         fetchAVUrlAsset(phasset)
@@ -87,7 +88,6 @@ public class BFRecordItemModel: NSObject {
                 self?.fetchPlayItemCallBack?(self)
                 return
             }
-            self?.materialDuraion =  item.duration.seconds
             self?.playItem = item
             self?.fetchPlayItemCallBack?(self)
         })

+ 46 - 23
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -75,7 +75,7 @@ public class BFRecordScreenController: BFBaseViewController {
     var recordStartPlayTime: CMTime = .zero
     // 某个录音开始播放时间
     var currenStartPlayTime: CMTime = .zero
-    var recordStartTime: Double = 0 // 录制开始时间
+//    var recordStartTime: Double = 0 // 录制开始时间
     var pauseTime: Double = 0 // 停止无操作的时间点
 
     var assetPlayer: AVPlayer? // 原视频音频播放器
@@ -432,8 +432,9 @@ public class BFRecordScreenController: BFBaseViewController {
 
         // 录音进度
         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)
+ 
         }
 
         // 录音字幕回调
@@ -537,11 +538,12 @@ public class BFRecordScreenController: BFBaseViewController {
                     self?.resetCurrentProgress()
                     self?.deleteRecordBtn.isHidden = true
                     self?.recordBtn.isHidden = (self?.itemModels[self?.currItemModelIndex ?? 0].mediaType == .IMAGE && (self?.isEndPlay ?? false)) ? false : (self?.isEndPlay ?? false)
+                    self?.recorderManager?.voiceModel = nil
                 }
                 sself.currentPlayRecordIndex = -3 // 刚录音完,不需要播放录音
                 BFLog(3, message: "重置播放index-\(#function) = \(sself.currentPlayRecordIndex)")
-                // 重置录制开始时间
-                sself.recordStartTime = 0
+//                // 重置录制开始时间
+//                sself.recordStartTime = 0
             }
         }
         recorderManager?.cancelRecordHandle = { [weak self] voiceModel in
@@ -560,12 +562,15 @@ public class BFRecordScreenController: BFBaseViewController {
             subtitleCount = self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.count ?? 0
             BFLog(2, message: "删除\(voiceModel?.wavFilePath ?? "")对应的字幕  后 count\(subtitleCount)")
 
-            // 重置录制开始时间
-            self?.recordStartTime = 0
+//            // 重置录制开始时间
+//            self?.recordStartTime = 0
             /// 重置进度
+            self?.currentAssetProgress = CMTime(seconds: voiceModel?.startTime ?? 0, preferredTimescale: 1000)
             self?.resetCurrentProgress()
             // 移除
             self?.indirectionView?.deleteItem(isCurrent: true)
+            self?.recorderManager?.voiceModel = nil
+
         }
 
         recorderManager?.NeoNuiDebugHandle = { [weak self] msg in
@@ -938,9 +943,9 @@ public class BFRecordScreenController: BFBaseViewController {
         recorderManager?.voiceModel = model
         recorderManager?.startRecord()
         recorderManager?.audioRecorder?.startNeoNui(NeoNuiToken ?? "", appid: NeoNuiAPPID ?? "")
-        if recordStartTime <= 0 {
-            recordStartTime = currentAssetProgress.seconds
-        }
+//        if recordStartTime <= 0 {
+//            recordStartTime = currentAssetProgress.seconds
+//        }
 
         isRecording = true
 
@@ -971,7 +976,14 @@ public class BFRecordScreenController: BFBaseViewController {
         
         view.isUserInteractionEnabled = true
         recorderManager?.stopRecord(isCancel: false)
-//        changeWithDrawBtnLayout(2)
+
+        if currentAssetProgress.seconds - (recorderManager?.voiceModel?.startTime ?? 0 ) >= 1.0 {
+            
+        }else{
+            let startTime = recorderManager?.voiceModel?.startTime ?? 0
+            changeProgress(progress: Float(startTime / itemModels[currItemModelIndex].materialDuraion))
+        }
+        
         /*
          if currentAssetProgress.seconds - (recorderManager?.voiceModel?.startTime ?? 0 ) >= 1.0 {
              recorderManager?.stopRecord(isCancel: false)
@@ -1162,7 +1174,7 @@ public class BFRecordScreenController: BFBaseViewController {
 
         // TODO: 滑动,播放暂停,撤销时,判断是否停止录音区间,是则删除相关录音,画笔,头像,字幕
         let elems = itemModels[currItemModelIndex].voiceStickers.enumerated().filter { elem in
-            (elem.1.startTime) <= self.currentAssetProgress.seconds && (elem.1.endTime) > self.currentAssetProgress.seconds
+            (elem.1.startTime) <= self.currentAssetProgress.seconds && (elem.1.endTime - 0.001) > self.currentAssetProgress.seconds
         }
 
         isEndPlay = false
@@ -1198,7 +1210,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 {
@@ -1548,19 +1560,28 @@ public class BFRecordScreenController: BFBaseViewController {
         }
 
         NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: assetPlayer?.currentItem, queue: .main) { [weak self] notify in
-            BFLog(1, message: "AVPlayerItemDidPlayToEndTime = \(notify)")
+            guard let sself = self else {
+                return
+            }
 
-            self?.isNormalPlaying = false
-            self?.isEndPlay = true
+            // 非录音的播放状态,结束时自动跳下一段落
+            if !sself.isRecording && (sself.currItemModelIndex < (sself.itemModels.count - 1)){
+//                self?.collectionView.setContentOffset(CGPoint(x: CGFloat((self?.currItemModelIndex ?? 0) + 1) * (self?.collectionView.frame.width ?? 0), y: 0), animated: true)
+            } else {
+                
+            } // 
+            
+            sself.isNormalPlaying = false
+            sself.isEndPlay = true
 
-            self?.subtitleBtn.isHidden = false
-            self?.soundSettingBtn.isHidden = false
+            sself.subtitleBtn.isHidden = false
+            sself.soundSettingBtn.isHidden = false
 
-            if self?.isRecording ?? false {
-                self?.endRecord()
+            if sself.isRecording {
+                sself.endRecord()
                 cShowHUB(superView: nil, msg: "此视频已录制到头了哦")
             }
-            self?.playBtn.isSelected = false
+            sself.playBtn.isSelected = false
         }
     }
 
@@ -1574,7 +1595,7 @@ public class BFRecordScreenController: BFBaseViewController {
         if itemModels[currItemModelIndex].mediaType == .VIDEO {
             if CMTimeGetSeconds(item?.duration ?? CMTime.zero) > 0 {
                 currentAssetProgress = CMTime(seconds: time.seconds, preferredTimescale: 1000)
-                BFLog(1, message: "curr:\(CMTimeGetSeconds(currentAssetProgress))")
+                BFLog(1, message: "video curr:\(CMTimeGetSeconds(currentAssetProgress))")
                 DispatchQueue.main.async { [weak self] in
                     BFLog(message: "更新录音进度\(#function)-\(self?.currentAssetProgress.seconds ?? 0)")
                     self?.progreddL.text = String(format: "%@", CMTimeGetSeconds(time).formatDurationToHMS())
@@ -1622,6 +1643,7 @@ public class BFRecordScreenController: BFBaseViewController {
     }
 
     // 通过缩略图进度条控制播放进度
+    // progress : 图片且isback为true时,表示是时长;  其他情况: 0 - 1,百分比
     func changeProgress(isBack: Bool = false, progress: Float) {
         var newProgress = progress
         if progress.isNaN || progress.isInfinite {
@@ -1638,7 +1660,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
             }
         } else {
-            currentAssetProgress = isBack ? CMTime(value: CMTimeValue(progress * 1000), timescale: 1000) : CMTime(value: CMTimeValue(progress * Float(itemModels[currItemModelIndex].materialDuraion) * 1000), timescale: 1000)
+            currentAssetProgress = isBack ? CMTime(value: CMTimeValue(newProgress * 1000), timescale: 1000) : CMTime(value: CMTimeValue(newProgress * Float(itemModels[currItemModelIndex].materialDuraion) * 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,7 +1688,8 @@ public class BFRecordScreenController: BFBaseViewController {
         // 注:在录制停止时,视频播放器进度依然在走,误差在80毫秒左右
         if isRecording {
             let ratioX = 0.08
-            indirectionView?.setProgress(start: recordStartTime, progress: max(0, progress - ratioX))
+            let startTime = recorderManager?.voiceModel?.startTime ?? 0
+            indirectionView?.setProgress(start: startTime, progress: max(0, progress - ratioX))
         }
         if itemModels[currItemModelIndex].mediaType == .IMAGE {
             imageRecordProgress(isRecord: true, progress: progress)

+ 1 - 1
BFRecordScreenKit/Classes/RecordScreen/View/BFVideoThumbProgressView.swift

@@ -234,7 +234,7 @@ class BFVideoThumbProgressView: UIView {
             return
         }
         if recordItem?.mediaType == .VIDEO {
-            if let second = recordItem?.videoAsset?.duration.seconds, second > 0 {
+            if let second = recordItem?.materialDuraion, second > 0 {
                 let w = progressView.contentSize.width - width
                 BFLog(message: "录音进度--指示器:progress=\(progress),duration=\(second),w=\(w),perW=\(Double(w) / second),totalW:\(progress * Double(w) / second)")
                 progressView.contentOffset = CGPoint(x: progress * Double(w) / second, y: 0)