Browse Source

拖动跳跃的问题

harry 3 years ago
parent
commit
7fbf133e36

+ 5 - 1
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenBaseManager.swift

@@ -30,7 +30,11 @@ class BFRecordScreenBaseManager : NSObject{
     var playView : GPUImageView?
     var filter = GPUImageFilter()
     
-    var currentAssetProgress: CMTime = .zero
+    var currentAssetProgress: CMTime = .zero{
+        didSet{
+            self.dele?.currentAssetProgress = currentAssetProgress
+        }
+    }
 
     var recording = false
     // MARK: -

+ 25 - 12
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -69,9 +69,11 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             
             guard let wself = self else { return }
             
-            wself.currentAssetProgress = CMTime(seconds: (currTime + wself.currPlayTime).seconds, preferredTimescale: 1000)
-            wself.dele?.currentAssetProgress = wself.currentAssetProgress
-//            BFLog(1, message: "camera currTime: \(currTime.seconds)")
+            // 拖动的跳跃,不要修改时间点
+            if (wself.dele?.isNormalPlaying ?? false){
+                wself.currentAssetProgress = CMTime(seconds: (currTime + wself.currPlayTime).seconds, preferredTimescale: 1000)
+                BFLog(1, message: "拖动 currTime: \(currTime.seconds)")
+            }
             DispatchQueue.main.async {[weak self] in
                 guard let wself = self else { return }
                 wself.dele?.updateSubtitle(time: wself.currentAssetProgress)
@@ -273,7 +275,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             let currDuration = videoS.1.timelineCMOut - videoS.1.timelineCMIn
             item.materialDuraion = item.materialDuraion - currDuration
             currentAssetProgress = videoS.1.timelineCMIn
-            
+                        
             // 更新音频的时间点
             for model in item.voiceStickers {
                 if CMTimeCompare(currentAssetProgress, model.startCMTime) < 0 {
@@ -364,7 +366,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         }
     }
     
-    func prepareToPlayNext(){
+    func prepareToPlayNext(_ tt:CMTime = .zero, needPlay:Bool = true){
         if let mod = recordItem?.videoStickers.sorted(by: { m1, m2 in
             m1.timelineCMIn.seconds < m2.timelineCMIn.seconds
         }).first(where: { mod in
@@ -373,23 +375,33 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             currPlayTime = mod.timelineCMIn
             locationTo(time: mod.timelineCMIn)
             avplayerReplaceItem(newItem: AVPlayerItem(url: URL(fileURLWithPath: mod.locationPath)))
-            avplayer.play()
-            playRecordVoice(.zero)
+            
+            avplayer.currentItem?.seek(to: tt, toleranceBefore: CMTime(seconds: 1, preferredTimescale: 1000), toleranceAfter: CMTime(seconds: 1, preferredTimescale: 1000), completionHandler: {[weak avplayer] _ in
+                if needPlay {
+                    avplayer?.play()
+                }
+            })
+            
+            playRecordVoice(.zero, needPlay: needPlay)
         }
     }
     
-    func avplayerReplaceItem(newItem: AVPlayerItem){
+    func avplayerReplaceItem(newItem: AVPlayerItem?){
         if let item = avplayer.currentItem {
             NotificationCenter.default.removeObserver(self as Any, name: .AVPlayerItemDidPlayToEndTime, object: item)
         }
         
         avplayer.replaceCurrentItem(with: newItem)
+        if newItem == nil {
+            return
+        }
+        
         NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem, queue: .main) { [weak self] notice in
             guard let wself = self else {
                 return
             }
             
-            BFLog(1, message: "endPlay:\(wself.currentAssetProgress.seconds), 总时长:\(wself.recordItem!.materialDuraion.seconds), currplayer:\(wself.avplayer.currentItem?.currentTime().seconds)")
+            BFLog(1, message: "endPlay:\(wself.currentAssetProgress.seconds), 总时长:\(wself.recordItem!.materialDuraion.seconds), currplayer:\(wself.avplayer.currentItem?.currentTime().seconds ?? 0)")
     
             // 如果离结束大于0.7s,代表还有下一段视频
             if ((wself.recordItem?.materialDuraion ?? .zero) - wself.currentAssetProgress).seconds > 0.7 {
@@ -420,9 +432,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 
             let tt = currentAssetProgress - currPlayTime
             BFLog(1, message: "asset - tt: \(tt.seconds), curr:\(currentAssetProgress.seconds)")
-            avplayer.seek(to: tt, toleranceBefore: CMTime(seconds: 1, preferredTimescale: 1000), toleranceAfter: CMTime(seconds: 1, preferredTimescale: 1000))
-
-            playRecordVoice(tt, needPlay: false)
+            prepareToPlayNext(tt, needPlay: false)
         }
     }
     
@@ -438,6 +448,9 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 
             cameraProgressV?.isHidden = false
             
+            prepareToPlayNext(currentAssetProgress, needPlay: false)
+            avplayerReplaceItem(newItem: nil)
+            
             if currentAssetProgress == .zero {
                 // 按钮为删除
             }