|
@@ -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))
|
|
|
}
|