|  | @@ -35,6 +35,9 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 | 
	
		
			
				|  |  |      var rendView = GPUImageView()
 | 
	
		
			
				|  |  |      var cameraProgressV: BFCameraProgressView?
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | +    var dispatchQueue: DispatchQueue?
 | 
	
		
			
				|  |  | +    var dispatchWorkItem: DispatchWorkItem?
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      override var recordItem : BFRecordItemModel? {
 | 
	
		
			
				|  |  |          didSet{
 | 
	
		
			
				|  |  |              cameraProgressV?.recordItem = recordItem
 | 
	
	
		
			
				|  | @@ -471,6 +474,9 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 | 
	
		
			
				|  |  |          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
 | 
	
		
			
				|  |  |          }){
 | 
	
		
			
				|  |  | +            for model in useVoiceStickers {
 | 
	
		
			
				|  |  | +                BFLog(message: " 时间范围:\(model.startCMTime.seconds) 到 \(model.endCMTime.seconds) \(currentAssetProgress.seconds)")
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              recordPlayer?.replaceCurrentItem(with: AVPlayerItem(url: URL(fileURLWithPath: mod.wavFilePath)))
 | 
	
		
			
				|  |  |              let tt = currentAssetProgress - mod.startCMTime
 | 
	
		
			
				|  |  |              BFLog(1, message: "record - tt: \(tt.seconds), curr:\(currentAssetProgress.seconds)")
 | 
	
	
		
			
				|  | @@ -485,6 +491,53 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 | 
	
		
			
				|  |  |                      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)")
 | 
	
		
			
				|  |  |              if wself.recordPlayer?.timeControlStatus == .playing{
 | 
	
		
			
				|  |  |                  wself.recordPlayer?.pause()
 | 
	
		
			
				|  |  | +                wself.cancelDispatchWorkItem()
 | 
	
		
			
				|  |  | +                wself.dispatchWorkItem = DispatchWorkItem { // create work item
 | 
	
		
			
				|  |  | +                   
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              // 如果离结束大于0.7s,代表还有下一段视频
 | 
	
		
			
				|  |  |              if ((wself.recordItem?.materialDuraion ?? .zero) - wself.currentAssetProgress).seconds > 0.7 {
 | 
	
	
		
			
				|  | @@ -581,6 +638,8 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 | 
	
		
			
				|  |  |          if currentAssetProgress == recordItem?.materialDuraion {
 | 
	
		
			
				|  |  |              camera?.resumeCameraCapture()
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +        cancelDispatchWorkItem()
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      override func dragEnd() {
 |