|
@@ -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() {
|