瀏覽代碼

声音设置

harry 3 年之前
父節點
當前提交
778f7124db
共有 1 個文件被更改,包括 58 次插入16 次删除
  1. 58 16
      BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

+ 58 - 16
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -121,6 +121,7 @@ public class BFRecordScreenController: BFBaseViewController {
     var beginOnStartBtn: Bool = false
     var touchStart: CGPoint = CGPoint(x: 0, y: 0)
     var avplayerTimeObserver: NSKeyValueObservation?
+    var recordPlayerTimeObserver: NSKeyValueObservation?
 
     var indirectionView: BFIndirectionProgressView?
 
@@ -307,10 +308,10 @@ public class BFRecordScreenController: BFBaseViewController {
             self?.noSpeakVolume = noHaveSpeak / 100.0
             if !(self?.isNormalPlaying ?? false), !(self?.isRecording ?? false) {
                 if self?.deleteRecordBtn.isHidden ?? false {
-                    self?.recordPlayer?.volume = 0
+//                    self?.recordPlayer?.volume = 0
                     self?.assetPlayer?.volume = self?.noSpeakVolume ?? 1.0
                 } else {
-                    self?.recordPlayer?.volume = 1.0
+//                    self?.recordPlayer?.volume = 1.0
                     self?.assetPlayer?.volume = self?.haveSpeakVolume ?? 0.0
                 }
             }
@@ -400,6 +401,7 @@ public class BFRecordScreenController: BFBaseViewController {
         cleanMovieTarget()
         NotificationCenter.default.removeObserver(self)
         avplayerTimeObserver?.invalidate()
+        recordPlayerTimeObserver?.invalidate()
         if isRecording {
             recorderManager?.stopRecord(isCancel: true)
         }
@@ -1375,21 +1377,48 @@ public class BFRecordScreenController: BFBaseViewController {
     // MARK: - 音视频处理
 
     func playRecord(at currentT: CMTime, periodicTimeObserver: @escaping (_ time: CMTime, _ currentItem: AVPlayerItem) -> Void, didPlayToEndTime: @escaping (_ recordedInfo: (Int, PQVoiceModel)?, _ currentItem: AVPlayerItem?) -> Void, playFailed _: @escaping (_ recordedInfo: (Int, PQVoiceModel)?, _ currentItem: AVPlayerItem?) -> Void) {
+        
+//        if currentPlayRecordIndex >= 0 {
+//            if assetPlayer?.volume != haveSpeakVolume{
+//                assetPlayer?.volume = haveSpeakVolume
+//            }
+//        }else{
+//            if assetPlayer?.volume != noSpeakVolume {
+//                assetPlayer?.volume = noSpeakVolume
+//            }
+//        }
+        
+        if itemModels[currItemModelIndex].voiceStickers.first(where: { m in
+            return CMTimeCompare(m.startCMTime, currentT) <= 0 && CMTimeCompare(currentT, m.endCMTime) <= 0
+        }) != nil{
+            if assetPlayer?.volume != haveSpeakVolume{
+                assetPlayer?.volume = haveSpeakVolume
+            }
+        }else{
+            if assetPlayer?.volume != noSpeakVolume {
+                assetPlayer?.volume = noSpeakVolume
+            }
+        }
+        
         if currentPlayRecordIndex == -3 { // 刚录音完,不需要播放
             return
         }
+        
+        // 先排序,再查找下一个需要播放的录音
         let list = itemModels[currItemModelIndex].voiceStickers.sorted { m1, m2 in
             m1.startCMTime.seconds < m2.startCMTime.seconds
         }
         let (shouldPlayRecordIndex, recordedAudio) = list.enumerated().first { model in
             model.1.endCMTime.seconds > CMTimeGetSeconds(currentT)
         } ?? (-1, nil)
-
+        
+        // 没找到,代表后边没有录音需求了
         guard let recordedAudio = recordedAudio, recordedAudio.wavFilePath.count > 0 else {
             BFLog(3, message: "未找到可播放录音")
             return
         }
         BFLog(1, message: "当前时间:\(CMTimeGetSeconds(currentT)), 找到的音频:\(recordedAudio.startCMTime.seconds) ~ \(recordedAudio.endCMTime.seconds), \(recordedAudio.wavFilePath ?? "")")
+        
         // 创建播放器
         if recordPlayer == nil || (recordPlayer?.currentItem?.asset as? AVURLAsset)?.url.lastPathComponent != (recordedAudio.wavFilePath as NSString?)?.lastPathComponent {
             let newItem = AVPlayerItem(url: URL(fileURLWithPath: recordedAudio.wavFilePath))
@@ -1404,6 +1433,7 @@ public class BFRecordScreenController: BFBaseViewController {
             } else {
                 recordPlayer = AVPlayer(playerItem: newItem)
             }
+            recordPlayer?.volume = 1
             currentPlayRecordIndex = -1
             hadPrepareToPlayRecord = false
             BFLog(1, message: "录音播放器初始化(有时候不准)")
@@ -1414,12 +1444,12 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
                 sself.hadPrepareToPlayRecord = false
                 sself.currentPlayRecordIndex = -1
-                sself.recordPlayer?.volume = 0
-                sself.assetPlayer?.volume = sself.noSpeakVolume
+//                sself.recordPlayer?.volume = 0
+//                sself.assetPlayer?.volume = sself.noSpeakVolume
                 didPlayToEndTime((shouldPlayRecordIndex, recordedAudio), newItem)
             }
-            avplayerTimeObserver?.invalidate()
-            avplayerTimeObserver = recordPlayer?.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 1000), queue: DispatchQueue.global()) { [weak self, weak recordPlayer,weak assetPlayer] time in
+            recordPlayerTimeObserver?.invalidate()
+            recordPlayerTimeObserver = recordPlayer?.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 1000), queue: DispatchQueue.global()) { [weak self, weak recordPlayer,weak assetPlayer] time in
                 guard let sself = self,let rPlay = recordPlayer,let aPlay = assetPlayer else {
                     return
                 }
@@ -1432,8 +1462,8 @@ public class BFRecordScreenController: BFBaseViewController {
                 BFLog(message: "progressTime进度\(#function)-\(progressTime.seconds)")
                 periodicTimeObserver(progressTime, newItem)
                 if (rPlay.currentItem?.currentTime().seconds ?? 0) > (rPlay.currentItem?.duration.seconds ?? 0) - 0.1 {
-                    rPlay.volume = 0
-                    aPlay.volume = sself.noSpeakVolume
+//                    rPlay.volume = 0
+//                    aPlay.volume = sself.noSpeakVolume
                     didPlayToEndTime((shouldPlayRecordIndex, recordedAudio), newItem)
                 }
             } as? NSKeyValueObservation
@@ -1478,8 +1508,8 @@ public class BFRecordScreenController: BFBaseViewController {
                         self?.recordPlayer?.seek(to: CMTime(value: CMTimeValue(second * 1_000_000), timescale: 1_000_000), toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000), completionHandler: { [weak self] finished in
                             if finished, self?.isNormalPlaying ?? false {
                                 self?.recordPlayer?.play()
-                                self?.recordPlayer?.volume = 1
-                                self?.assetPlayer?.volume = self?.haveSpeakVolume ?? 0
+//                                self?.recordPlayer?.volume = 1
+//                                self?.assetPlayer?.volume = self?.haveSpeakVolume ?? 0
                                 BFLog(1, message: "录音开始播放 playing, \(second), \(CMTimeGetSeconds(self?.recordPlayer?.currentItem?.duration ?? .zero)), \(self?.recordPlayer?.currentItem?.currentTime().seconds ?? 0)")
                             }
                         })
@@ -1525,8 +1555,8 @@ public class BFRecordScreenController: BFBaseViewController {
                     sself.recordPlayer?.seek(to: CMTime(value: CMTimeValue(second * 1_000_000), timescale: 1_000_000))
                     if sself.isNormalPlaying {
                         sself.recordPlayer?.play()
-                        sself.recordPlayer?.volume = 1
-                        sself.assetPlayer?.volume = sself.haveSpeakVolume
+//                        sself.recordPlayer?.volume = 1
+//                        sself.assetPlayer?.volume = sself.haveSpeakVolume
                         BFLog(1, message: "录音开始播放 playing, \(second), \(CMTimeGetSeconds(sself.recordPlayer?.currentItem?.duration ?? .zero)), \(sself.recordPlayer?.currentItem?.currentTime().seconds ?? 0)")
                     }
                     BFLog(3, message: "重置播放index-\(#function) = \(currentPlayRecordIndex)")
@@ -1576,12 +1606,17 @@ public class BFRecordScreenController: BFBaseViewController {
     func pause() {
         BFLog(1, message: "暂停播放")
         isNormalPlaying = false
+        
+        // ---- 修复暂停播放回退问题
         avplayerTimeObserver?.invalidate()
         avplayerTimeObserver = nil
+        recordPlayerTimeObserver?.invalidate()
+        recordPlayerTimeObserver = nil
+        // ----
+        
         subtitleBtn.isHidden = false
         soundSettingBtn.isHidden = false
         withDrawBtn.isHidden = false
-//        recordBtn.isHidden = isRecording ? false : isEndPlay
         recordBtn.isHidden = (itemModels[currItemModelIndex].mediaType == .IMAGE && isEndPlay) ? false : isEndPlay
 
         assetPlayer?.pause()
@@ -1590,6 +1625,7 @@ public class BFRecordScreenController: BFBaseViewController {
         pauseTime = currentAssetProgress.seconds
         currentPlayRecordIndex = -1
         hadPrepareToPlayRecord = false
+        
         // 暂停状态
         playBtn.isSelected = (itemModels[currItemModelIndex].mediaType == .IMAGE && itemModels[currItemModelIndex].voiceStickers.count <= 0)
     }
@@ -1666,7 +1702,7 @@ public class BFRecordScreenController: BFBaseViewController {
         } else {
             assetPlayer = AVPlayer(playerItem: item)
             BFLog(message: "设置播放器item-替换:\(String(describing: item))")
-            assetPlayer?.volume = noSpeakVolume
+//            assetPlayer?.volume = noSpeakVolume
             avplayerTimeObserver?.invalidate()
             avplayerTimeObserver = assetPlayer?.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 1000), queue: DispatchQueue.global()) { [weak self] time in
                 // 进度监控
@@ -1973,6 +2009,12 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
             // 重置播放器
             assetPlayer?.seek(to: CMTime.zero)
             recordPlayer?.seek(to: CMTime.zero)
+            
+            if let voice = itemModels[page].voiceStickers.enumerated().first(where: { m in
+                m.1.startTime == 0
+            }){
+                currentPlayRecordIndex = voice.0
+            }
 
             searchStopAtRecordRange()
             changeWithDrawBtnLayout(0)
@@ -2020,7 +2062,7 @@ public extension BFRecordScreenController {
             currenStartPlayTime = CMTime.zero
         }
         playRecord(at: time, periodicTimeObserver: { [weak self] currentT, currentItem in
-            BFLog(1, message: "播放录音进度:\(currentT.seconds),\(currentItem)")
+//            BFLog(1, message: "播放录音进度:\(currentT.seconds),\(currentItem)")
             if self?.itemModels[self?.currItemModelIndex ?? 0].mediaType == .IMAGE, self?.isNormalPlaying ?? false {
                 self?.imageRecordProgress(progress: CMTimeGetSeconds(currentT))
             }