Browse Source

摄像头录制预览,视频切换时的闪屏问题

harry 3 years ago
parent
commit
925f57b42e

+ 34 - 15
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -73,7 +73,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             if (wself.dele?.isNormalPlaying ?? false){
                 wself.currentAssetProgress = CMTime(seconds: (currTime + wself.currPlayTime).seconds, preferredTimescale: 1000)
             }
-            BFLog(1, message: "拖动 currTime: \(currTime.seconds)")
+//            BFLog(1, message: "拖动 currTime: \(currTime.seconds)")
             DispatchQueue.main.async {[weak self] in
                 guard let wself = self else { return }
                 wself.dele?.updateSubtitle(time: wself.currentAssetProgress)
@@ -86,6 +86,13 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         return p
     }()
     
+    lazy var playerCoverIV : UIImageView = {
+        let iv = UIImageView()
+        iv.frame = UIScreen.main.bounds
+        iv.layer.addSublayer(playerLayer)
+
+        return iv
+    }()
     lazy var playerLayer : AVPlayerLayer = {
         let layer = AVPlayerLayer(player: avplayer)
         layer.frame = UIScreen.main.bounds
@@ -119,12 +126,12 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             progreddL?.isHidden = false
             progreddL?.text = CMTimeGetSeconds(currentAssetProgress).formatDurationToHMS()
             cameraProgressV?.collectionV.scrollRectToVisible(CGRect(x: (cameraProgressV?.collectionV.contentSize.width)! - 1, y: (cameraProgressV?.collectionV.contentSize.height)! - 1, width: 1, height: 1), animated: false)
-
-
+            dele?.isEndPlay = true
         }else {
             currVideoIndex = 0
             cameraProgressV?.isHidden = true
             progreddL?.isHidden = true
+            playerCoverIV.isHidden = true
         }
         
         camera.startCapture()
@@ -151,8 +158,8 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         guard let preView = playView else {
             return
         }
-                
-        preView.layer.addSublayer(playerLayer)
+        
+        playView?.addSubview(playerCoverIV)
         
     }
     
@@ -162,7 +169,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             return
         }
         
-        playerLayer.removeFromSuperlayer()
+        playerCoverIV.isHidden = true
 
         super.startRecord()
 
@@ -331,12 +338,11 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     
     // 使用avplayer进行播放视频和音频
     override func play() {
-        guard let preView = playView else {
+        guard playView != nil else {
             return
         }
-        if playerLayer.superlayer == nil {
-            preView.layer.addSublayer(playerLayer)
-        }
+        
+        playerCoverIV.isHidden = false
 
         camera?.pauseCapture()
         
@@ -384,8 +390,12 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             currPlayTime = mod.timelineCMIn
             locationTo(time: mod.timelineCMIn)
             avplayerReplaceItem(newItem: AVPlayerItem(url: URL(fileURLWithPath: mod.locationPath)))
-            
-            avplayer.currentItem?.seek(to: tt, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000), completionHandler: {[weak avplayer] _ in
+            playerCoverIV.image = PQVideoSnapshotUtil.videoSnapshot(videoURL: URL(fileURLWithPath: mod.locationPath), time: tt.seconds)
+
+            avplayer.currentItem?.seek(to: tt, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000), completionHandler: {[weak self, weak avplayer] _ in
+                
+                guard let wself = self else { return }
+                
                 if needPlay {
                     avplayer?.play()
                 }
@@ -396,7 +406,11 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     }
     
     func avplayerReplaceItem(newItem: AVPlayerItem?){
-        if let item = avplayer.currentItem {
+
+        if let item = avplayer.currentItem{
+            if (item.asset as? AVURLAsset)?.url == (newItem?.asset as? AVURLAsset)?.url {
+                return
+            }
             NotificationCenter.default.removeObserver(self as Any, name: .AVPlayerItemDidPlayToEndTime, object: item)
         }
         
@@ -411,7 +425,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             }
             
             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 {
                 wself.prepareToPlayNext()
@@ -437,12 +451,17 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         if let mod = recordItem?.videoStickers.first(where: { m in
             CMTimeCompare(m.timelineCMIn, currentAssetProgress) <= 0 && CMTimeCompare(m.timelineCMOut, currentAssetProgress) > 0
         }){
+            let tt = currentAssetProgress - currPlayTime
+
             avplayerReplaceItem(newItem: AVPlayerItem(url: URL(fileURLWithPath: mod.locationPath)))
             currPlayTime = mod.timelineCMIn
+            playerCoverIV.isHidden = false
+            playerCoverIV.image = PQVideoSnapshotUtil.videoSnapshot(videoURL: URL(fileURLWithPath: mod.locationPath), time: tt.seconds)
 
-            let tt = currentAssetProgress - currPlayTime
             BFLog(1, message: "asset - tt: \(tt.seconds), curr:\(currentAssetProgress.seconds)")
             prepareToPlayNext(tt, needPlay: false)
+        }else{
+            playerCoverIV.isHidden = true
         }
     }
     

+ 2 - 0
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -1460,6 +1460,7 @@ public class BFRecordScreenController: BFBaseViewController {
                             }
                             
                             if currMediaType == .Camera {
+                                rscmanager.cameraProgressV?.isHidden = false
                                 // 恢复录像的时间点
                                 _ = itemModels[currItemModelIndex].videoStickers.map { mod in
                                     if CMTimeCompare(mod.timelineCMIn, first.startCMTime) >= 0{
@@ -1494,6 +1495,7 @@ public class BFRecordScreenController: BFBaseViewController {
                     itemModels[currItemModelIndex].voiceStickers.sort { m1, m2 in
                         CMTimeCompare(m1.startCMTime, m2.startCMTime) < 0
                     }
+                    
                         
                 }
                 // 恢复字幕