浏览代码

优化播放跳跃效果

harry 3 年之前
父节点
当前提交
e3ab5f8870

+ 36 - 27
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -45,9 +45,9 @@ public class BFRecordScreenController: BFBaseViewController {
             recordBtn.setTitle(isRecording ? "松手 完成" : "按住 说话", for: .normal)
             recordBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#28BE67", alpha: isRecording ? 0.6 : 1)
             playBtn.isSelected = isRecording
-            if !isRecording {
-                BFLog(1, message: "stop")
-            }
+//            if !isRecording {
+//                BFLog(1, message: "stop")
+//            }
         }
     }
 
@@ -63,20 +63,20 @@ public class BFRecordScreenController: BFBaseViewController {
         }
     }
 
-    var currentAssetProgress: CMTime = .zero // 当前素材播放的进度
-    var recordStartTime: Double = 0 // 录制开始时间
-    //    public var recordList:[PQVoiceModel] = [PQVoiceModel]()
+    var currentAssetProgress: CMTime = .zero    // 当前素材播放的进度
+    var recordStartTime: Double = 0             // 录制开始时间
+    var pauseTime : Double = 0                  // 停止无操作的时间点
+
+    var assetPlayer: AVPlayer?                  // 原视频音频播放器
 
-    var assetPlayer: AVPlayer? // 原视频音频播放器
-    var isCompletePlay = true
-    var hadPrepareToPlayRecord = false // 录音播放器准备
-    var recordPlayer : AVPlayer? // 录音音频播放器
-    var movie : GPUImageMovie? // 视频预览
-    var playView : GPUImageView? // 视频展示视图
+    var hadPrepareToPlayRecord = false          // 录音播放器准备
+    var recordPlayer : AVPlayer?                // 录音音频播放器
+    var movie : GPUImageMovie?                  // 视频预览
+    var playView : GPUImageView?                // 视频展示视图
 
     // MARK: 行为参数
     var movieIsProcessing = false
-    var events = [WithDrawModel]() // 行为记录,方便撤销
+    var events = [WithDrawModel]()              // 行为记录,方便撤销
     var isDragingProgressSlder : Bool = false // 是否在拖动进度条
     var isStopAtRecordRange = -1
 
@@ -793,13 +793,13 @@ public class BFRecordScreenController: BFBaseViewController {
             avatarView.beginRecord()
         }
 
-        DispatchQueue.global().async { [weak self] in
-            guard let sself = self else {
-                return
-            }
-            sself.speechTranscriberUtil?.delegate = sself
-            sself.speechTranscriberUtil?.startTranscriber()
-        }
+//        DispatchQueue.global().async { [weak self] in
+//            guard let sself = self else {
+//                return
+//            }
+//            sself.speechTranscriberUtil?.delegate = sself
+//            sself.speechTranscriberUtil?.startTranscriber()
+//        }
         
         if itemModels[currItemModelIndex].mediaType == .VIDEO {
             
@@ -1147,13 +1147,17 @@ public class BFRecordScreenController: BFBaseViewController {
     }
 
     func play() {
-        BFLog(1, message: "开始播放 \(currentAssetProgress.seconds) \(AVAudioSession.sharedInstance().category)")
+        BFLog(1, message: "开始播放 \(currentAssetProgress.seconds)")
         // add by ak 播放前设置 AVAudioSession 为播放状态
-        do {
-            try AVAudioSession.sharedInstance().setCategory(.playback)
-            try AVAudioSession.sharedInstance().setActive(true)
-        } catch {}
-
+        if AVAudioSession.sharedInstance().category != .playAndRecord {
+            let a = Date()
+            do {
+                try? AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: .defaultToSpeaker)
+                try AVAudioSession.sharedInstance().setActive(true)
+            } catch {}
+            
+            BFLog(1, message: "开启session \(Date().timeIntervalSince(a))")
+        }
         isNormalPlaying = true
         if isEndPlay {
             isEndPlay = false
@@ -1184,6 +1188,8 @@ public class BFRecordScreenController: BFBaseViewController {
         //        movie?.cancelProcessing()
         assetPlayer?.pause()
         recordPlayer?.pause()
+        
+        pauseTime = currentAssetProgress.seconds
 
         assetPlayer?.seek(to: currentAssetProgress, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000), completionHandler: { _ in
         })
@@ -1296,6 +1302,9 @@ public class BFRecordScreenController: BFBaseViewController {
     /// - Parameter CMTime: <#CMTime description#>
     func periodicTimeObserver(item: AVPlayerItem?, time: CMTime) {
         // 进度监控
+        if time.seconds < pauseTime {
+            return
+        }
         if itemModels[currItemModelIndex].mediaType == .VIDEO {
             if CMTimeGetSeconds(item?.duration ?? CMTime.zero) > 0 {
                 currentAssetProgress = CMTime(seconds: time.seconds, preferredTimescale: 1000)
@@ -1449,8 +1458,8 @@ extension BFRecordScreenController: PQSpeechTranscriberUtilDelegate {
         
         if let path = recordItem.localPath, let lastCell: BFImageCoverViewCell = collectionView.cellForItem(at: IndexPath(item: currItemModelIndex, section: 0)) as? BFImageCoverViewCell {
             
-            setAudioPlay(item: recordItem.playItem)
             setVideoPlay(item: recordItem.playItem, imageView: lastCell.playView)
+            setAudioPlay(item: recordItem.playItem)
             
             let degress = degressFromVideoFile(url: URL(fileURLWithPath: path))
             switch (degress) {

+ 2 - 1
BFRecordScreenKit/Classes/RecordScreen/View/BFImageCoverViewCell.swift

@@ -8,6 +8,7 @@
 
 import GPUImage
 import UIKit
+import BFUIKit
 
 open class BFImageCoverViewCell: UICollectionViewCell {
     var btnClickHandle: ((_ sender: UIButton, _ recordItem: BFRecordItemModel?) -> Void)?
@@ -79,7 +80,7 @@ open class BFImageCoverViewCell: UICollectionViewCell {
 
     public func addLayout() {
         playView.frame = contentView.bounds
-        playBtn.frame = CGRect(origin: CGPoint.zero, size: CGSize(width: 100, height: 100))
+        playBtn.frame = CGRect(x: 0, y: cDevice_iPhoneNavBarAndStatusBarHei, width: cScreenWidth, height: cScreenHeigth - cDevice_iPhoneNavBarAndStatusBarHei * 2)
         playBtn.center = contentView.center
     }