Browse Source

Merge branch 'dev' of https://git.yishihui.com/iOS/BFRecordScreenKit into dev

* 'dev' of https://git.yishihui.com/iOS/BFRecordScreenKit:
  1,添加变音排序
  1,添加录制模式下播放变音声音
胡志强 3 years ago
parent
commit
2b11d07e68

+ 59 - 0
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -35,6 +35,9 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     var rendView = GPUImageView()
     var rendView = GPUImageView()
     var cameraProgressV: BFCameraProgressView?
     var cameraProgressV: BFCameraProgressView?
     
     
+    var dispatchQueue: DispatchQueue?
+    var dispatchWorkItem: DispatchWorkItem?
+    
     override var recordItem : BFRecordItemModel? {
     override var recordItem : BFRecordItemModel? {
         didSet{
         didSet{
             cameraProgressV?.recordItem = recordItem
             cameraProgressV?.recordItem = recordItem
@@ -471,6 +474,9 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         if let mod = useVoiceStickers.first(where: { m in
         if let mod = useVoiceStickers.first(where: { m in
             CMTimeCompare(m.startCMTime, currentAssetProgress + CMTime(seconds: 0.033, preferredTimescale: 1000)) <= 0 && CMTimeCompare(m.endCMTime, (currentAssetProgress + CMTime(seconds: 0.033, preferredTimescale: 1000))) > 0
             CMTimeCompare(m.startCMTime, currentAssetProgress + CMTime(seconds: 0.033, preferredTimescale: 1000)) <= 0 && CMTimeCompare(m.endCMTime, (currentAssetProgress + CMTime(seconds: 0.033, preferredTimescale: 1000))) > 0
         }){
         }){
+            for model in useVoiceStickers {
+                BFLog(message: " 时间范围:\(model.startCMTime.seconds) 到 \(model.endCMTime.seconds) \(currentAssetProgress.seconds)")
+            }
             recordPlayer?.replaceCurrentItem(with: AVPlayerItem(url: URL(fileURLWithPath: mod.wavFilePath)))
             recordPlayer?.replaceCurrentItem(with: AVPlayerItem(url: URL(fileURLWithPath: mod.wavFilePath)))
             let tt = currentAssetProgress - mod.startCMTime
             let tt = currentAssetProgress - mod.startCMTime
             BFLog(1, message: "record - tt: \(tt.seconds), curr:\(currentAssetProgress.seconds)")
             BFLog(1, message: "record - tt: \(tt.seconds), curr:\(currentAssetProgress.seconds)")
@@ -485,6 +491,53 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
                     recordPlayer?.play()
                     recordPlayer?.play()
                 }
                 }
             }
             }
+         
+            NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: recordPlayer?.currentItem, queue: .main) { [weak self] notice in
+                guard let wself = self else {
+                    return
+                }
+                wself.playRecordVoice()
+      
+            }
+             
+        }
+        else{
+            
+            BFLog(message: "没有命中查找最近一个可用的")
+            dispatchQueue = DispatchQueue.global(qos: .background) // create queue
+            dispatchWorkItem = DispatchWorkItem { // create work item
+                self.playRecordVoice(needPlay: true)
+            }
+            
+            let afterTime = findAvailableChangeVoice().seconds
+            BFLog(message: "\(afterTime)s 后自动播放变音音频")
+            if self.dispatchWorkItem != nil {
+                 self.dispatchQueue?.asyncAfter(
+                    deadline: .now() + afterTime,
+                     execute: self.dispatchWorkItem!
+                 )
+            }
+            
+       
+        }
+    }
+    
+    //add by ak 正常播放未命中可使用录音时查找最近一个可用的音频, 返回和当前播放进度的时间差
+    func findAvailableChangeVoice() -> CMTime{
+        if let mod = recordItem?.getUsedVoices().first(where: { m in
+            CMTimeCompare(m.startCMTime, currentAssetProgress) >= 0
+        }){
+            BFLog(message: "当前时间\(currentAssetProgress.seconds),命中的开始时间:\(mod.startCMTime.seconds) 结束时间\(mod.endCMTime.seconds)")
+            return CMTimeSubtract(mod.startCMTime, currentAssetProgress)
+        }
+        return CMTime.zero
+    }
+    
+    // add by ak取消自动播放任务,1,暂停时 2,录制的视频播放结束时 调用
+    func cancelDispatchWorkItem(){
+        //取消变声音音频任务
+        if let dispatchWorkItem = self.dispatchWorkItem {
+            dispatchWorkItem.cancel()
         }
         }
     }
     }
     
     
@@ -558,6 +611,10 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             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.avplayer.currentItem?.currentTime().seconds ?? 0)")
             if wself.recordPlayer?.timeControlStatus == .playing{
             if wself.recordPlayer?.timeControlStatus == .playing{
                 wself.recordPlayer?.pause()
                 wself.recordPlayer?.pause()
+                wself.cancelDispatchWorkItem()
+                wself.dispatchWorkItem = DispatchWorkItem { // create work item
+                   
+                }
             }
             }
             // 如果离结束大于0.7s,代表还有下一段视频
             // 如果离结束大于0.7s,代表还有下一段视频
             if ((wself.recordItem?.materialDuraion ?? .zero) - wself.currentAssetProgress).seconds > 0.7 {
             if ((wself.recordItem?.materialDuraion ?? .zero) - wself.currentAssetProgress).seconds > 0.7 {
@@ -581,6 +638,8 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         if currentAssetProgress == recordItem?.materialDuraion {
         if currentAssetProgress == recordItem?.materialDuraion {
             camera?.resumeCameraCapture()
             camera?.resumeCameraCapture()
         }
         }
+      
+        cancelDispatchWorkItem()
     }
     }
     
     
     override func dragEnd() {
     override func dragEnd() {

+ 7 - 8
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -1968,14 +1968,7 @@ public class BFRecordScreenController: BFBaseViewController {
 //        }
 //        }
         
         
         //add by ak 使用的音频数据
         //add by ak 使用的音频数据
-        var  useVoiceStickers = [PQVoiceModel]()
-        if(itemModels[currItemModelIndex].voiceChangeStickers.count > 0){
-            useVoiceStickers = itemModels[currItemModelIndex].voiceChangeStickers
-        }else{
-            useVoiceStickers = itemModels[currItemModelIndex].voiceStickers
-        }
-        
-
+        let  useVoiceStickers = itemModels[currItemModelIndex].getUsedVoices()
         if useVoiceStickers.first(where: { m in
         if useVoiceStickers.first(where: { m in
             CMTimeCompare(m.startCMTime, currentT) <= 0 && CMTimeCompare(currentT, m.endCMTime) <= 0
             CMTimeCompare(m.startCMTime, currentT) <= 0 && CMTimeCompare(currentT, m.endCMTime) <= 0
         }) != nil {
         }) != nil {
@@ -2168,6 +2161,12 @@ public class BFRecordScreenController: BFBaseViewController {
             m1.startCMTime.seconds < m2.endCMTime.seconds
             m1.startCMTime.seconds < m2.endCMTime.seconds
         })
         })
         
         
+        //add by ak 变音排序
+        itemModels[currItemModelIndex].voiceChangeStickers.sort(by: { m1, m2 in
+            m1.startCMTime.seconds < m2.endCMTime.seconds
+        })
+        
+        
         isNormalPlaying = true
         isNormalPlaying = true
         if isEndPlay || (currMediaType == .Image && CMTimeCompare(currentAssetProgress, itemModels[currItemModelIndex].materialDuraion) >= 0) {
         if isEndPlay || (currMediaType == .Image && CMTimeCompare(currentAssetProgress, itemModels[currItemModelIndex].materialDuraion) >= 0) {
             isEndPlay = false
             isEndPlay = false