Ver código fonte

视频声音控制

harry 3 anos atrás
pai
commit
3c44f66ba4

+ 13 - 6
BFRecordScreenKit/Classes/RecordScreen/Controller/BFMusicManager.swift

@@ -16,6 +16,7 @@ class BFMusicManager {
     
     var playStatusCallback : ((AVPlayerItem?, BFMuicInfoCellState) -> Void)?
     var needDeteactiveStatus = false
+    var currPlayUrlPath: String?
     // 试听音乐
     let player:AVPlayer = {
         let p = AVPlayer(playerItem: nil)
@@ -33,7 +34,6 @@ class BFMusicManager {
                 
                 guard let ranges = change.newValue as? [CMTimeRange] else { return }
                 if let totalDur = player.currentItem?.duration, totalDur.isValid,  CMTimeCompare(ranges.first?.duration ?? .zero, totalDur) >= 0{
-                    BFLog(1, message: "status: 1")
                     wself.playStatusCallback?(wself.player.currentItem, .playing)
                 }
             }
@@ -55,7 +55,6 @@ class BFMusicManager {
             if wself.player.currentItem?.isPlaybackLikelyToKeepUp ?? false{
                 wself.playStatusCallback?(wself.player.currentItem, .playing)
             }else if (wself.needDeteactiveStatus){
-                BFLog(1, message: "llogpp")
                 wself.deteactiveStaus()
             }
         }
@@ -72,16 +71,24 @@ class BFMusicManager {
 
     }
     
-    func replaceCurrentItem(newItemUrl: URL) {
+    func replaceCurrentItem(musicPath: String?) {
+        if currPlayUrlPath == musicPath {
+            return
+        }
+        currPlayUrlPath = musicPath
+        
         if player.currentItem != nil {
             NotificationCenter.default.removeObserver(self, name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem)
         }
-        player.replaceCurrentItem(with: AVPlayerItem(url: newItemUrl))
+        
+        if let musicPath = musicPath, let url = URL(string: musicPath) {
+            player.replaceCurrentItem(with: AVPlayerItem(url: url))
+        }else {
+            player.replaceCurrentItem(with: nil)
+        }
         NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) {[weak self] notice in
             guard let wself = self else { return }
             wself.player.currentItem?.seek(to: .zero, completionHandler: nil)
-//                            wself.choseCell()?.status = .pause
-//                            wself.chosedCellStatu = .pause
             wself.play()
         }
     }

+ 2 - 2
BFRecordScreenKit/Classes/RecordScreen/Controller/BFMusicSearchController.swift

@@ -249,8 +249,8 @@ extension BFMusicSearchController : UITableViewDelegate, UITableViewDataSource {
             if cell.status == .normal {
                 if let urlStr = cell.data?.musicPath, let url = URL(string: urlStr){
                     BFLog(1, message: "歌曲地址: \(url)")
-                    if url.absoluteString != (playerManager.player.currentItem?.asset as? AVURLAsset)?.url.absoluteString ?? "b" {
-                        playerManager.replaceCurrentItem(newItemUrl: url)
+                    if url.absoluteString != (playerManager.currPlayUrlPath ?? "b") {
+                        playerManager.replaceCurrentItem(musicPath: urlStr)
                         cell.status = .loading
                     }else {
                         cell.status = .playing

+ 20 - 20
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -77,11 +77,11 @@ class BFRecordScreenCameraManager: BFRecordScreenBaseManager {
 
     var groupCount = 0
  
-    lazy var avplayer: AVPlayer = {
-        let p = AVPlayer(playerItem: nil)
-        
-        return p
-    }()
+//    lazy var assetPlayer: AVPlayer = {
+//        let p = AVPlayer(playerItem: nil)
+//
+//        return p
+//    }()
 
     lazy var playerCoverIV: UIImageView = {
         let iv = UIImageView()
@@ -93,7 +93,7 @@ class BFRecordScreenCameraManager: BFRecordScreenBaseManager {
     }()
 
     lazy var playerLayer: AVPlayerLayer = {
-        let layer = AVPlayerLayer(player: avplayer)
+        let layer = AVPlayerLayer(player: assetPlayer)
         layer.frame = UIScreen.main.bounds
         return layer
     }()
@@ -426,7 +426,7 @@ class BFRecordScreenCameraManager: BFRecordScreenBaseManager {
         if (recordItem?.materialDuraion.seconds)! - currentAssetProgress.seconds < 0.1 {
             currentAssetProgress = .zero
             locationTo(time: currentAssetProgress)
-            avplayer.replaceCurrentItem(with: nil)
+            assetPlayer?.replaceCurrentItem(with: nil)
         }
         
         startTimer(isPlay: true)
@@ -437,17 +437,17 @@ class BFRecordScreenCameraManager: BFRecordScreenBaseManager {
             CMTimeCompare(mode.timelineCMIn, currentAssetProgress) <= 0 && CMTimeCompare(currentAssetProgress, mode.timelineCMOut) < 0
         }) {
             // true 代表需要换源
-            let su = (avplayer.currentItem?.asset as? AVURLAsset)?.url.lastPathComponent != (mod.locationPath as NSString?)?.lastPathComponent
+            let su = (assetPlayer?.currentItem?.asset as? AVURLAsset)?.url.lastPathComponent != (mod.locationPath as NSString?)?.lastPathComponent
             
             if !su {
-                if avplayer.timeControlStatus == .paused { // 同源且暂停的时候,需要修改进度
+                if assetPlayer?.timeControlStatus == .paused { // 同源且暂停的时候,需要修改进度
                     setCoverImage(currentAssetProgress)
                     
                     let tt = currentAssetProgress - mod.timelineCMIn
-                    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
+                    assetPlayer?.currentItem?.seek(to: tt, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000), completionHandler: { [weak assetPlayer] _ in
 
                         if needPlay {
-                            avplayer?.play()
+                            assetPlayer?.play()
                         }
                     })
                     
@@ -464,15 +464,15 @@ class BFRecordScreenCameraManager: BFRecordScreenBaseManager {
             let tt = currentAssetProgress - mod.timelineCMIn
             BFLog(1, message: "asset - tt: \(tt.seconds), curr:\(currentAssetProgress.seconds)")
             
-            if CMTimeCompare(tt, (avplayer.currentItem?.duration ?? .zero)) == 0 {
+            if CMTimeCompare(tt, (assetPlayer?.currentItem?.duration ?? .zero)) == 0 {
                 if needPlay {
-                    avplayer.play()
+                    assetPlayer?.play()
                 }
             } else {
-                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
+                assetPlayer?.currentItem?.seek(to: tt, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000), completionHandler: { [weak assetPlayer] _ in
 
                     if needPlay {
-                        avplayer?.play()
+                        assetPlayer?.play()
                     }
                 })
             }
@@ -486,24 +486,24 @@ class BFRecordScreenCameraManager: BFRecordScreenBaseManager {
     }
 
     func avplayerReplaceItem(newItem: AVPlayerItem?) {
-        if let item = avplayer.currentItem {
+        if let item = assetPlayer?.currentItem {
             if (item.asset as? AVURLAsset)?.url == (newItem?.asset as? AVURLAsset)?.url {
                 return
             }
             NotificationCenter.default.removeObserver(self as Any, name: .AVPlayerItemDidPlayToEndTime, object: item)
         }
 
-        avplayer.replaceCurrentItem(with: newItem)
+        assetPlayer?.replaceCurrentItem(with: newItem)
         if newItem == nil {
             return
         }
 
-        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem, queue: .main) { [weak self] _ in
+        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: assetPlayer?.currentItem, queue: .main) { [weak self] _ in
             guard let wself = self else {
                 return
             }
 
-            BFLog(1, message: "endPlay:\(wself.currentAssetProgress.seconds), 总时长:\(wself.recordItem!.materialDuraion.seconds), currplayer:\(wself.avplayer.currentItem?.currentTime().seconds ?? 0)")
+//            BFLog(1, message: "endPlay:\(wself.currentAssetProgress.seconds), 总时长:\(wself.recordItem!.materialDuraion.seconds), currplayer:\(wself.assetPlayer.currentItem?.currentTime().seconds ?? 0)")
 
     
 //            // 如果离结束大于0.7s,代表还有下一段视频
@@ -525,7 +525,7 @@ class BFRecordScreenCameraManager: BFRecordScreenBaseManager {
     override func pause() {
         super.pause()
         dispatchWorkItemIsCancel = true
-        avplayer.pause()
+        assetPlayer?.pause()
         playingVoiceMode = nil
 
         timerr?.invalidate()

+ 48 - 30
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -268,8 +268,9 @@ public class BFRecordScreenController: BFBaseViewController {
     var currenStartPlayTime: CMTime = .zero
     var pauseTime: Double = 0 // 停止无操作的时间点
 
-    var assetPlayer: AVPlayer = AVPlayer(playerItem: nil) // 原视频音频播放器
-    var recordPlayer: AVPlayer = AVPlayer(playerItem: nil) // 录音音频播放器
+    var assetPlayer     : AVPlayer = AVPlayer(playerItem: nil)   // 原视频音频播放器
+    var recordPlayer    : AVPlayer = AVPlayer(playerItem: nil)   // 录音音频播放器
+    var bgmPlayer = BFMusicManager()   // 背景音乐音频播放器
 
     var hadPrepareToPlayRecord = false // 录音播放器准备
     var playView: GPUImageView? // 视频展示视图
@@ -664,10 +665,10 @@ public class BFRecordScreenController: BFBaseViewController {
             wself.bgmModel?.volume = Int(musicVolume)
             wself.originalVolume = originalVolume / 100.0
             wself.choseMusicPanel.musicVolume = Int(musicVolume)
-            if !wself.isNormalPlaying, !wself.isRecording {
-                
-                wself.assetPlayer.volume = wself.originalVolume
-            }
+            wself.assetPlayer.volume = wself.originalVolume
+//            if !wself.isNormalPlaying, !wself.isRecording {
+//
+//            }
         }
 
         return audioSettingView
@@ -1732,6 +1733,7 @@ public class BFRecordScreenController: BFBaseViewController {
 
     @objc func endRecord() {
         // 存储录音
+        
         if !isRecording {
             return
         }
@@ -2138,20 +2140,26 @@ public class BFRecordScreenController: BFBaseViewController {
     }
 
     // MARK: - 音视频处理
-
+    
+    /// 查找录音播放
+    /// - Parameters:
+    ///   - currentT: 当前播放进度时刻
+    ///   - periodicTimeObserver: 每次刷新要执行的block
+    ///   - didPlayToEndTime: 录音播放结束后的block
+    ///   - _: 播放失败的block
     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) {
  
         //add by ak 使用的音频数据
         let  useVoiceStickers = itemModels[currItemModelIndex].getUsedVoices()
         
         //音量设置判断使用原录音数据
-        if itemModels[currItemModelIndex].voiceStickers.first(where: { m in
-            CMTimeCompare(m.startCMTime, currentT) <= 0 && CMTimeCompare(currentT, m.endCMTime) <= 0
-        }) != nil {
-            if assetPlayer.volume != originalVolume {
-                assetPlayer.volume = originalVolume
-            }
-        }
+//        if itemModels[currItemModelIndex].voiceStickers.first(where: { m in
+//            CMTimeCompare(m.startCMTime, currentT) <= 0 && CMTimeCompare(currentT, m.endCMTime) <= 0
+//        }) != nil {
+//            if assetPlayer.volume != originalVolume {
+//                assetPlayer.volume = originalVolume
+//            }
+//        }
 //        BFLog(1, message: "volume:\(assetPlayer.volume ?? -1)")
 
         if currentPlayRecordIndex == -3 { // 刚录音完,不需要播放
@@ -2172,7 +2180,6 @@ public class BFRecordScreenController: BFBaseViewController {
             return
         }
         BFLog(1, message: "当前时间:\(CMTimeGetSeconds(currentT)), 找到的音频:\(recordedAudio.startCMTime.seconds) ~ \(recordedAudio.endCMTime.seconds), \(recordedAudio.wavFilePath ?? "")")
-
         // 创建播放器
         if (recordPlayer.currentItem?.asset as? AVURLAsset)?.url.lastPathComponent != (recordedAudio.wavFilePath as NSString?)?.lastPathComponent {
             let newItem = AVPlayerItem(url: URL(fileURLWithPath: recordedAudio.wavFilePath))
@@ -2198,20 +2205,20 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
                 wself.hadPrepareToPlayRecord = false
                 wself.currentPlayRecordIndex = -1
-//                wself.recordPlayer.volume = 0
-//                wself.assetPlayer.volume = wself.musicVolume
+                
+                wself.assetPlayer.volume = wself.originalVolume
+                
                 BFLog(3, message: "播放结束")
                 didPlayToEndTime((shouldPlayRecordIndex, recordedAudio), newItem)
             }
 //            recordPlayer.removeTimeObserver(recordPlayerTimeObserver as Any)
 //            recordPlayerTimeObserver?.invalidate()
             //MARK: 声音播放器播放进度回调
-            recordPlayerTimeObserver = recordPlayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 1000), queue: DispatchQueue.global()) { [weak self, weak recordPlayer] time in
-                guard let wself = self, let rPlay = recordPlayer else {
-                    BFLog(3, message: "wself为空")
-                    return
+            recordPlayerTimeObserver = recordPlayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 1000), queue: DispatchQueue.global()) { [weak self] time in
+                guard let wself = self else { return }
+                if time.seconds > 0 {
+                    wself.assetPlayer.volume = 0 //wself.originalVolume * 0.6                    
                 }
-//                BFLog(1, message: "当前播放--- \(time.seconds), \(rPlay.currentItem?.duration.seconds ?? 0)")
                 if CMTimeGetSeconds(wself.currenStartPlayTime) <= 0 {
                     BFLog(message: "重新更新开始播放进度\(#function)-\(wself.currenStartPlayTime.seconds)")
                     wself.currenStartPlayTime = time
@@ -2219,9 +2226,6 @@ public class BFRecordScreenController: BFBaseViewController {
                 let progressTime = CMTime(seconds: CMTimeGetSeconds(time) - CMTimeGetSeconds(wself.currenStartPlayTime), preferredTimescale: 1000)
                 BFLog(message: "progressTime进度\(#function)-\(progressTime.seconds)")
                 periodicTimeObserver(progressTime, newItem)
-//                if (rPlay.currentItem?.currentTime().seconds ?? 0) > (rPlay.currentItem?.duration.seconds ?? 0) - 0.1 {
-//                    didPlayToEndTime((shouldPlayRecordIndex, recordedAudio), newItem)
-//                }
             } as? NSKeyValueObservation
         }
         if currMediaType == .Video {
@@ -2323,7 +2327,7 @@ public class BFRecordScreenController: BFBaseViewController {
         BFLog(1, message: "开始播放 \(currentAssetProgress.seconds)")
         recorderManager?.voiceModel = nil
         events.append(WithDrawModel(type: 1, timestamp: currentAssetProgress, recordItem: rscurrentManager.recordItem!))
-
+ 
         itemModels[currItemModelIndex].titleStickers.sort { m1, m2 in
             CMTimeCompare(m1.timelineIn, m2.timelineIn) < 0
         }
@@ -2350,9 +2354,19 @@ public class BFRecordScreenController: BFBaseViewController {
 
             rscurrentManager.currentAssetProgress = .zero
         }
+
+        bgmPlayer.player.volume = Float(choseMusicPanel.musicVolume) / 100.0
+        assetPlayer.volume = originalVolume
+        
+        if currItemModelIndex == 0 && currentAssetProgress == .zero{
+            bgmPlayer.player.seek(to: .zero) {[weak self] _ in
+                self?.bgmPlayer.play()
+            }
+        }else{
+            bgmPlayer.play()
+        }
         
         rscurrentManager.play()
-    
     }
 
     public func pause() {
@@ -2368,7 +2382,10 @@ public class BFRecordScreenController: BFBaseViewController {
 
         // 暂停状态
         updatePlayBtnStatus()
+        
+        bgmPlayer.pause()
         rscurrentManager.pause()
+        
     }
 
     public func fetchMaterial(_ phAsset:[PHAsset]) {
@@ -2517,7 +2534,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 DispatchQueue.main.async { [weak self] in
                     guard let wself = self else { return }
                     
-                    BFLog(message: "更新录音进度\(#function)-\(wself.currentAssetProgress.seconds )")
+                    BFLog(message: "更新录音进度\(#function) - \(wself.currentAssetProgress.seconds )")
                     wself.progreddL.text = String(format: "%@", CMTimeGetSeconds(time).formatDurationToHMS())
                     let su = !wself.isDragingProgressSlder || wself.isRecording || wself.isNormalPlaying
                     if su { // 不拖动,正常播放和录音时更新进度条
@@ -2593,7 +2610,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 DispatchQueue.main.async { [weak self] in
                     guard let wself = self else { return }
                     
-                    BFLog(message: "更新录音进度\(#function)- \(wself.currentAssetProgress.seconds)")
+                    BFLog(message: "更新录音进度\(#function) - \(wself.currentAssetProgress.seconds)")
                     wself.progreddL.text = String(format: "%@", CMTimeGetSeconds(wself.currentAssetProgress).formatDurationToHMS())
                 }
                 assetPlayer.seek(to: currentAssetProgress, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000)) { _ in
@@ -2659,7 +2676,8 @@ public class BFRecordScreenController: BFBaseViewController {
     
     func hadChoosed(music:PQVoiceModel?) {
         bgmModel = music
-    
+        bgmPlayer.replaceCurrentItem(musicPath: bgmModel?.musicPath)
+        
         if let model = music {
             
             BFEventTrackAdaptor.baseReportUpload(businessType: .bt_buttonClick, objectType: .ot_musicChangerButton, pageSource: .sp_speekPage,extParams: ["musicID":bgmModel?.musicId ?? ""],commonParams: commonParams())

+ 0 - 1
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenVideoManager.swift

@@ -67,7 +67,6 @@ class BFRecordScreenVideoManager : BFRecordScreenBaseManager{
             movie?.startProcessing()
             movieIsProcessing = true
         }
-        assetPlayer?.volume = 0
         assetPlayer?.play()
     }
     

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

@@ -471,7 +471,7 @@ extension BFChooseMusicView:UITableViewDelegate, UITableViewDataSource {
                     BFLog(1, message: "歌曲地址: \(url)")
                     if url.absoluteString != (playManager.player.currentItem?.asset as? AVURLAsset)?.url.absoluteString ?? "b" {
                         cell.status = .loading
-                        playManager.replaceCurrentItem(newItemUrl: url)
+                        playManager.replaceCurrentItem(musicPath: urlStr)
                     }else {
                         cell.status = .playing
                     }