|
@@ -58,13 +58,10 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- var isEndPlay = false{
|
|
|
- didSet{
|
|
|
- if itemModels[currItemModelIndex].mediaType == .IMAGE{
|
|
|
- recordBtn.isHidden = false
|
|
|
- }else{
|
|
|
- recordBtn.isHidden = isEndPlay
|
|
|
- }
|
|
|
+ var isEndPlay = false {
|
|
|
+ didSet {
|
|
|
+ // 如果是图片的话在播放停止时不需要隐藏录制
|
|
|
+ recordBtn.isHidden = (itemModels[currItemModelIndex].mediaType == .IMAGE && isEndPlay) ? false : isEndPlay
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -72,7 +69,6 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
didSet {
|
|
|
playBtn.isSelected = isNormalPlaying
|
|
|
withDrawBtn.isHidden = isNormalPlaying
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -125,6 +121,8 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
// 录音管理器
|
|
|
var recorderManager: BFVoiceRecordManager?
|
|
|
|
|
|
+ var NeoNuiAPPID:String?
|
|
|
+ var NeoNuiToken:String?
|
|
|
// MARK: - 视图参数
|
|
|
|
|
|
var beginOnStartBtn: Bool = false
|
|
@@ -407,152 +405,150 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
// add by ak 取 nsl token
|
|
|
BFRecordScreenViewModel.getNlsAccessToken { [weak self] token, appkey in
|
|
|
BFLog(message: "nls appkey is \(appkey), token is \(token)")
|
|
|
+ self?.NeoNuiAPPID = appkey
|
|
|
+ self?.NeoNuiToken = token
|
|
|
+
|
|
|
+ }
|
|
|
+ recorderManager = BFVoiceRecordManager()
|
|
|
|
|
|
- self?.recorderManager = BFVoiceRecordManager(token: token, appid: appkey)
|
|
|
+ // 录音进度
|
|
|
+ recorderManager?.recorderProgrossHandle = { [weak self] progress in
|
|
|
+ BFLog(1, message: "curr:录音进度--\(progress) \(self?.recordStartTime ?? 0) \(self?.isRecording ?? false)")
|
|
|
+ self?.drawProgressIndication(progress: progress ?? 0)
|
|
|
+ }
|
|
|
|
|
|
- // 录音进度
|
|
|
- self?.recorderManager?.recorderProgrossHandle = { [weak self] progress in
|
|
|
- BFLog(1, message: "curr:录音进度--\(progress) \(self?.recordStartTime ?? 0) \(self?.isRecording ?? false)")
|
|
|
- self?.drawProgressIndication(progress: progress ?? 0)
|
|
|
+ // 录音字幕回调
|
|
|
+ recorderManager?.subtitleRecordHandle = { [weak self] asrResult, audioFilePath in
|
|
|
+ if asrResult == nil {
|
|
|
+ BFLog(message: "识别结果为空????不能生成字幕数据")
|
|
|
+ return
|
|
|
}
|
|
|
+ let dicResult: [String: Any]? = jsonStringToDictionary(asrResult!)
|
|
|
|
|
|
- // 录音字幕回调
|
|
|
- self?.recorderManager?.subtitleRecordHandle = { [weak self] asrResult, audioFilePath in
|
|
|
- if asrResult == nil {
|
|
|
- BFLog(message: "识别结果为空????不能生成字幕数据")
|
|
|
- return
|
|
|
- }
|
|
|
- let dicResult: [String: Any]? = jsonStringToDictionary(asrResult!)
|
|
|
-
|
|
|
- let header = dicResult?["header"] as? [String: Any]
|
|
|
- let payload = dicResult?["payload"] as? [String: Any]
|
|
|
+ let header = dicResult?["header"] as? [String: Any]
|
|
|
+ let payload = dicResult?["payload"] as? [String: Any]
|
|
|
|
|
|
- BFLog(message: "识别结果:) \((payload?["result"])!) startTime:\(self?.recorderManager?.voiceModel?.startTime ?? 0.0)")
|
|
|
- DispatchQueue.main.async {
|
|
|
- // 1,保存字幕数据 begin_time是开始出现文字的时间,time 是结束文字出现的时间 单位都为毫秒,都是相对于录制音频数据整段时间。self.recorderManager.voiceModel?.startTime 为开始的录制的时间,开始和结束都要加上这个时差
|
|
|
+ BFLog(message: "识别结果:) \((payload?["result"])!) startTime:\(self?.recorderManager?.voiceModel?.startTime ?? 0.0)")
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ // 1,保存字幕数据 begin_time是开始出现文字的时间,time 是结束文字出现的时间 单位都为毫秒,都是相对于录制音频数据整段时间。self.recorderManager.voiceModel?.startTime 为开始的录制的时间,开始和结束都要加上这个时差
|
|
|
|
|
|
- let newSubtitle = PQEditSubTitleModel()
|
|
|
- // 任务全局唯一ID,请记录该值,便于排查问题。 每次 startRecorder 和 stopRecoder 之间 task_Id都不会变化
|
|
|
- newSubtitle.taskID = (header?["task_id"] as? String) ?? ""
|
|
|
+ let newSubtitle = PQEditSubTitleModel()
|
|
|
+ // 任务全局唯一ID,请记录该值,便于排查问题。 每次 startRecorder 和 stopRecoder 之间 task_Id都不会变化
|
|
|
+ newSubtitle.taskID = (header?["task_id"] as? String) ?? ""
|
|
|
|
|
|
- // 这里加300ms 是因为返回结果为了切到字,时长提前一些时间,具体时间官方没说和原音频有关系。这里我们先延后300ms 单位:毫秒。
|
|
|
+ // 这里加300ms 是因为返回结果为了切到字,时长提前一些时间,具体时间官方没说和原音频有关系。这里我们先延后300ms 单位:毫秒。
|
|
|
|
|
|
- newSubtitle.timelineIn = (self?.recorderManager?.voiceModel?.startTime ?? 0.0) + Float64((((payload?["begin_time"]) as? Int) ?? 0) + 300) / 1000.0
|
|
|
+ newSubtitle.timelineIn = (self?.recorderManager?.voiceModel?.startTime ?? 0.0) + Float64((((payload?["begin_time"]) as? Int) ?? 0) + 300) / 1000.0
|
|
|
|
|
|
- newSubtitle.timelineOut = (self?.recorderManager?.voiceModel?.startTime ?? 0.0) + Float64(((payload?["time"]) as? Int) ?? 0) / 1000.0
|
|
|
- var showText = ((payload?["result"]) as? String) ?? ""
|
|
|
- if showText.count > subtitleMaxlength {
|
|
|
- showText = showText.substring(to: subtitleMaxlength)
|
|
|
- showText += "..."
|
|
|
- }
|
|
|
- newSubtitle.text = showText
|
|
|
- newSubtitle.audioFilePath = audioFilePath ?? ""
|
|
|
+ newSubtitle.timelineOut = (self?.recorderManager?.voiceModel?.startTime ?? 0.0) + Float64(((payload?["time"]) as? Int) ?? 0) / 1000.0
|
|
|
+ var showText = ((payload?["result"]) as? String) ?? ""
|
|
|
+ if showText.count > subtitleMaxlength {
|
|
|
+ showText = showText.substring(to: subtitleMaxlength)
|
|
|
+ showText += "..."
|
|
|
+ }
|
|
|
+ newSubtitle.text = showText
|
|
|
+ newSubtitle.audioFilePath = audioFilePath ?? ""
|
|
|
|
|
|
- BFLog(message: "添加字幕数据 timelineIn \(newSubtitle.timelineIn) timelineOut \(newSubtitle.timelineOut) text: \(newSubtitle.text) 音频路径为:\(audioFilePath ?? "")")
|
|
|
- newSubtitle.setting = self?.subtitleSettingView.subtitle.setting ?? BFSubTitileSettingModel()
|
|
|
+ BFLog(message: "添加字幕数据 timelineIn \(newSubtitle.timelineIn) timelineOut \(newSubtitle.timelineOut) text: \(newSubtitle.text) 音频路径为:\(audioFilePath ?? "")")
|
|
|
+ newSubtitle.setting = self?.subtitleSettingView.subtitle.setting ?? BFSubTitileSettingModel()
|
|
|
|
|
|
- self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.append(newSubtitle)
|
|
|
- }
|
|
|
+ self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.append(newSubtitle)
|
|
|
}
|
|
|
- // 录音结束
|
|
|
- self?.recorderManager?.endRecordHandle = { [weak self] voideModel, _ in
|
|
|
- if let sself = self, let model = voideModel, FileManager.default.fileExists(atPath: model.wavFilePath ?? "") {
|
|
|
- // 加入到语音数组里
|
|
|
- model.endTime = sself.currentAssetProgress.seconds
|
|
|
-
|
|
|
- let recordItem = sself.itemModels[sself.currItemModelIndex]
|
|
|
- // ********** 开始处理冲突的录制部分
|
|
|
- let newRange = CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 1000), end: CMTime(seconds: model.endTime, preferredTimescale: 1000))
|
|
|
-
|
|
|
- var deletedVoices = [(PQVoiceModel, Int)]()
|
|
|
-
|
|
|
- for (i, m) in recordItem.voiceStickers.enumerated() {
|
|
|
- let originRange = CMTimeRange(start: CMTime(seconds: m.startTime, preferredTimescale: 1000), end: CMTime(seconds: m.endTime, preferredTimescale: 1000))
|
|
|
-
|
|
|
- if CMTimeRangeGetIntersection(originRange, otherRange: newRange).duration.seconds > 0 {
|
|
|
- deletedVoices.append((m, i))
|
|
|
- for titleS in recordItem.titleStickers {
|
|
|
- if titleS.audioFilePath == m.wavFilePath {
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- continue
|
|
|
+ }
|
|
|
+ // 录音结束
|
|
|
+ recorderManager?.endRecordHandle = { [weak self] voideModel, _ in
|
|
|
+ if let sself = self, let model = voideModel, FileManager.default.fileExists(atPath: model.wavFilePath ?? "") {
|
|
|
+ // 加入到语音数组里
|
|
|
+ model.endTime = sself.currentAssetProgress.seconds
|
|
|
+
|
|
|
+ let recordItem = sself.itemModels[sself.currItemModelIndex]
|
|
|
+ // ********** 开始处理冲突的录制部分
|
|
|
+ let newRange = CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 1000), end: CMTime(seconds: model.endTime, preferredTimescale: 1000))
|
|
|
+
|
|
|
+ var deletedVoices = [(PQVoiceModel, Int)]()
|
|
|
+
|
|
|
+ for (i, m) in sself.itemModels[sself.currItemModelIndex].voiceStickers.enumerated() {
|
|
|
+ let originRange = CMTimeRange(start: CMTime(seconds: m.startTime, preferredTimescale: 1000), end: CMTime(seconds: m.endTime, preferredTimescale: 1000))
|
|
|
+
|
|
|
+ if CMTimeRangeGetIntersection(originRange, otherRange: newRange).duration.seconds > 0 {
|
|
|
+ deletedVoices.append((m, i))
|
|
|
+ for titleS in sself.itemModels[sself.currItemModelIndex].titleStickers {
|
|
|
+ if titleS.audioFilePath == m.wavFilePath {}
|
|
|
}
|
|
|
+
|
|
|
+ continue
|
|
|
}
|
|
|
-
|
|
|
- // 删除冲突的音频
|
|
|
- sself.itemModels[sself.currItemModelIndex].voiceStickers.removeAll { m in
|
|
|
- let originRange = CMTimeRange(start: CMTime(seconds: m.startTime, preferredTimescale: 1000), end: CMTime(seconds: m.endTime, preferredTimescale: 1000))
|
|
|
- return CMTimeRangeGetIntersection(originRange, otherRange: newRange).duration.seconds > 0
|
|
|
- }
|
|
|
- BFLog(1, message: "添加录音文件:\(model.startTime) -- \(model.endTime)")
|
|
|
-
|
|
|
- sself.itemModels[sself.currItemModelIndex].voiceStickers.append(model)
|
|
|
-
|
|
|
-
|
|
|
- // ***********处理冲突的录音部分资源 end
|
|
|
-
|
|
|
- // 添加撤销记录点
|
|
|
- var event = WithDrawModel(type: 2, timestamp: model.startTime)
|
|
|
- event.deletedVoices = deletedVoices
|
|
|
- sself.events.append(event)
|
|
|
-
|
|
|
-
|
|
|
- if recordItem.mediaType == .IMAGE {
|
|
|
- var duration: Double = 0
|
|
|
- recordItem.voiceStickers.forEach { temp in
|
|
|
- temp.duration = "\(temp.endTime - temp.startTime)"
|
|
|
- duration = duration + (temp.endTime - temp.startTime)
|
|
|
- }
|
|
|
- sself.itemModels[sself.currItemModelIndex].materialDuraion = Double(String(format: "%.3f", duration)) ?? 0
|
|
|
- self?.isEndPlay = true
|
|
|
- // 录制结束显示播放按钮
|
|
|
- (sself.collectionView.cellForItem(at: IndexPath(item: sself.currItemModelIndex, section: 0)) as? BFImageCoverViewCell)?.playBtn.isSelected = recordItem.voiceStickers.count <= 0
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除冲突的音频
|
|
|
+ sself.itemModels[sself.currItemModelIndex].voiceStickers.removeAll { m in
|
|
|
+ let originRange = CMTimeRange(start: CMTime(seconds: m.startTime, preferredTimescale: 1000), end: CMTime(seconds: m.endTime, preferredTimescale: 1000))
|
|
|
+ return CMTimeRangeGetIntersection(originRange, otherRange: newRange).duration.seconds > 0
|
|
|
+ }
|
|
|
+ BFLog(1, message: "添加录音文件:\(model.startTime) -- \(model.endTime)")
|
|
|
+
|
|
|
+ sself.itemModels[sself.currItemModelIndex].voiceStickers.append(model)
|
|
|
+
|
|
|
+ // ***********处理冲突的录音部分资源 end
|
|
|
+
|
|
|
+ // 添加撤销记录点
|
|
|
+ var event = WithDrawModel(type: 2, timestamp: model.startTime)
|
|
|
+ event.deletedVoices = deletedVoices
|
|
|
+ sself.events.append(event)
|
|
|
+
|
|
|
+ if sself.itemModels[sself.currItemModelIndex].mediaType == .IMAGE {
|
|
|
+ var duration: Double = 0
|
|
|
+ sself.itemModels[sself.currItemModelIndex].voiceStickers.forEach { temp in
|
|
|
+ temp.duration = "\(temp.endTime - temp.startTime)"
|
|
|
+ duration = duration + (temp.endTime - temp.startTime)
|
|
|
}
|
|
|
- DispatchQueue.main.async { [weak self] in
|
|
|
- // 录音完,重绘撤销按钮,更新录音按钮,
|
|
|
- self?.changeWithDrawBtnLayout(true)
|
|
|
- // 注:在录制结束时矫正当前位置,避免跟指针无法对其
|
|
|
- if deletedVoices.count == 0 {
|
|
|
- self?.indirectionView?.resetCurrentItem(start: model.startTime, end: model.endTime)
|
|
|
- }else {
|
|
|
- self?.indirectionView?.resetAllSubViews(items: recordItem.voiceStickers, percenWidth: recordItem.mediaType == .IMAGE ? (self?.progressThumV.thumbImageWidth ?? 0) / 2.0 : 0, totalDuration: recordItem.materialDuraion)
|
|
|
+ sself.itemModels[sself.currItemModelIndex].materialDuraion = Double(String(format: "%.3f", duration)) ?? 0
|
|
|
+ self?.isEndPlay = true
|
|
|
+ // 录制结束显示播放按钮
|
|
|
+ (sself.collectionView.cellForItem(at: IndexPath(item: sself.currItemModelIndex, section: 0)) as? BFImageCoverViewCell)?.playBtn.isSelected = sself.itemModels[sself.currItemModelIndex].voiceStickers.count <= 0
|
|
|
+ }
|
|
|
+ DispatchQueue.main.async { [weak self] in
|
|
|
+ // 录音完,重绘撤销按钮,更新录音按钮,
|
|
|
+ self?.changeWithDrawBtnLayout(true)
|
|
|
+ // 注:在录制结束时矫正当前位置,避免跟指针无法对其
|
|
|
+ if deletedVoices.count == 0 {
|
|
|
+ self?.indirectionView?.resetCurrentItem(start: model.startTime, end: model.endTime)
|
|
|
+ }else {
|
|
|
+ self?.indirectionView?.resetAllSubViews(items: recordItem.voiceStickers, percenWidth: recordItem.mediaType == .IMAGE ? (self?.progressThumV.thumbImageWidth ?? 0) / 2.0 : 0, totalDuration: recordItem.materialDuraion)
|
|
|
|
|
|
- }
|
|
|
- // 矫正进度
|
|
|
- self?.resetCurrentProgress()
|
|
|
- self?.deleteRecordBtn.isHidden = true
|
|
|
- self?.isEndPlay = self?.isEndPlay ?? false
|
|
|
}
|
|
|
- sself.currentPlayRecordIndex = -3 // 刚录音完,不需要播放录音
|
|
|
- // 重置录制开始时间
|
|
|
- sself.recordStartTime = 0
|
|
|
+ // 矫正进度
|
|
|
+ self?.resetCurrentProgress()
|
|
|
+ self?.deleteRecordBtn.isHidden = true
|
|
|
+ self?.recordBtn.isHidden = (self?.itemModels[self?.currItemModelIndex ?? 0].mediaType == .IMAGE && (self?.isEndPlay ?? false)) ? false : (self?.isEndPlay ?? false)
|
|
|
}
|
|
|
+ sself.currentPlayRecordIndex = -3 // 刚录音完,不需要播放录音
|
|
|
+ // 重置录制开始时间
|
|
|
+ sself.recordStartTime = 0
|
|
|
}
|
|
|
- self?.recorderManager?.cancelRecordHandle = { [weak self] voiceModel in
|
|
|
- // add by ak 取消录制后删除对应字幕数据,这里可恢复操作吗?
|
|
|
- var subtitleCount = self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.count ?? 0
|
|
|
- BFLog(2, message: "删除\(voiceModel?.wavFilePath ?? "")对应的字幕 前 count\(subtitleCount)")
|
|
|
- if subtitleCount > 0 {
|
|
|
- for title in self!.itemModels[self?.currItemModelIndex ?? 0].titleStickers {
|
|
|
- if title.audioFilePath == voiceModel?.wavFilePath ?? "" {
|
|
|
- if let index = self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.firstIndex(of: title) {
|
|
|
- self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.remove(at: index)
|
|
|
- }
|
|
|
+ }
|
|
|
+ recorderManager?.cancelRecordHandle = { [weak self] voiceModel in
|
|
|
+ // add by ak 取消录制后删除对应字幕数据,这里可恢复操作吗?
|
|
|
+ var subtitleCount = self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.count ?? 0
|
|
|
+ BFLog(2, message: "删除\(voiceModel?.wavFilePath ?? "")对应的字幕 前 count\(subtitleCount)")
|
|
|
+ if subtitleCount > 0 {
|
|
|
+ for title in self!.itemModels[self?.currItemModelIndex ?? 0].titleStickers {
|
|
|
+ if title.audioFilePath == voiceModel?.wavFilePath ?? "" {
|
|
|
+ if let index = self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.firstIndex(of: title) {
|
|
|
+ self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.remove(at: index)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- subtitleCount = self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.count ?? 0
|
|
|
- BFLog(2, message: "删除\(voiceModel?.wavFilePath ?? "")对应的字幕 后 count\(subtitleCount)")
|
|
|
-
|
|
|
- // 重置录制开始时间
|
|
|
- self?.recordStartTime = 0
|
|
|
- /// 重置进度
|
|
|
- self?.resetCurrentProgress()
|
|
|
- // 移除
|
|
|
- self?.indirectionView?.deleteItem(isCurrent: true)
|
|
|
}
|
|
|
+ subtitleCount = self?.itemModels[self?.currItemModelIndex ?? 0].titleStickers.count ?? 0
|
|
|
+ BFLog(2, message: "删除\(voiceModel?.wavFilePath ?? "")对应的字幕 后 count\(subtitleCount)")
|
|
|
+
|
|
|
+ // 重置录制开始时间
|
|
|
+ self?.recordStartTime = 0
|
|
|
+ /// 重置进度
|
|
|
+ self?.resetCurrentProgress()
|
|
|
+ // 移除
|
|
|
+ self?.indirectionView?.deleteItem(isCurrent: true)
|
|
|
}
|
|
|
|
|
|
view.backgroundColor = .black
|
|
@@ -876,12 +872,11 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
indirectionView?.resetAllSubViews(items: itemModels[currItemModelIndex].voiceStickers, percenWidth: progressThumV.thumbImageWidth / 2.0, totalDuration: itemModels[currItemModelIndex].materialDuraion)
|
|
|
}
|
|
|
searchStopAtRecordRange()
|
|
|
-
|
|
|
+
|
|
|
deleteTitles(voiceModel: model)
|
|
|
var event = WithDrawModel(type: 3, timestamp: currentAssetProgress.seconds, deletedVoices: [(model, isStopAtRecordRange)])
|
|
|
event.deletedTittles = nil
|
|
|
events.append(event)
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -896,11 +891,10 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
if isDragingProgressSlder {
|
|
|
return
|
|
|
}
|
|
|
+ isRecording = true
|
|
|
progressThumV.progressView.isUserInteractionEnabled = false
|
|
|
collectionView.isScrollEnabled = false
|
|
|
pause()
|
|
|
- isRecording = true
|
|
|
-
|
|
|
if recorderManager == nil {
|
|
|
BFLog(message: "录音机初始化错误!!!")
|
|
|
return
|
|
@@ -912,6 +906,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
model.volume = 100
|
|
|
recorderManager?.voiceModel = model
|
|
|
recorderManager?.startRecord()
|
|
|
+ recorderManager?.audioRecorder?.startNeoNui(NeoNuiToken ?? "", appid: NeoNuiAPPID ?? "")
|
|
|
if recordStartTime <= 0 {
|
|
|
recordStartTime = currentAssetProgress.seconds
|
|
|
}
|
|
@@ -934,9 +929,9 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
}
|
|
|
|
|
|
@objc func endRecord() {
|
|
|
+ pause()
|
|
|
// 存储录音
|
|
|
isRecording = false
|
|
|
- pause()
|
|
|
progressThumV.progressView.isUserInteractionEnabled = true
|
|
|
collectionView.isScrollEnabled = true
|
|
|
|
|
@@ -1333,9 +1328,9 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
subtitleBtn.isHidden = false
|
|
|
soundSettingBtn.isHidden = false
|
|
|
withDrawBtn.isHidden = false
|
|
|
- let su = self.isEndPlay
|
|
|
- self.isEndPlay = su
|
|
|
-
|
|
|
+ recordBtn.isHidden = isRecording ? false : isEndPlay
|
|
|
+ let su = isEndPlay
|
|
|
+ isEndPlay = su
|
|
|
assetPlayer?.pause()
|
|
|
recordPlayer?.pause()
|
|
|
recordStartPlayTime = CMTime.zero
|
|
@@ -1434,7 +1429,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
|
|
|
self?.isNormalPlaying = false
|
|
|
self?.isEndPlay = true
|
|
|
-
|
|
|
+
|
|
|
if self?.isRecording ?? false {
|
|
|
self?.endRecord()
|
|
|
cShowHUB(superView: nil, msg: "此视频已录制到头了哦")
|
|
@@ -1626,13 +1621,13 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
|
|
|
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
|
|
|
endScrollItem(scrollView)
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
|
|
|
if !decelerate {
|
|
|
endScrollItem(scrollView)
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
func endScrollItem(_ scrollView: UIScrollView) {
|
|
|
// public func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
|
|
BFLog(1, message: "滚动结束")
|
|
@@ -1704,16 +1699,18 @@ public extension BFRecordScreenController {
|
|
|
recordStartPlayTime = currentAssetProgress
|
|
|
currenStartPlayTime = CMTime.zero
|
|
|
playRecord(at: currentAssetProgress, periodicTimeObserver: { [weak self] currentT, currentItem in
|
|
|
- BFLog(1, message: "播放第段进度:\(currentT),\(currentItem)")
|
|
|
+ BFLog(1, message: "播放图片素材进度:\(currentT),\(currentItem)")
|
|
|
self?.imageRecordProgress(progress: CMTimeGetSeconds(currentT))
|
|
|
}, didPlayToEndTime: { [weak self] recordInfo, currentItem in
|
|
|
- BFLog(message: "播放第段结束:\(String(describing: recordInfo?.1)),\(String(describing: currentItem))")
|
|
|
+ BFLog(message: "播放图片素材录音结束:\(String(describing: recordInfo?.1)),\(String(describing: currentItem))")
|
|
|
if (self?.itemModels[self?.currItemModelIndex ?? 0].voiceStickers.count ?? 0) <= ((recordInfo?.0 ?? 0) + 1) || (recordInfo?.1.endTime ?? 0) >= (self?.itemModels[self?.currItemModelIndex ?? 0].voiceStickers.last?.endTime ?? 0) {
|
|
|
self?.isEndPlay = true
|
|
|
self?.pause()
|
|
|
// 注:矫正进度--播放结束后当前指针应该到当前素材总时长
|
|
|
self?.currentAssetProgress = CMTime(seconds: self?.itemModels[self?.currItemModelIndex ?? 0].materialDuraion ?? 0, preferredTimescale: 1000)
|
|
|
self?.resetCurrentProgress()
|
|
|
+ // 录制播放结束后显示录制按钮
|
|
|
+ self?.recordBtn.isHidden = false
|
|
|
// 跳转下一段
|
|
|
// if (self?.currItemModelIndex ?? 0) < ((self?.itemModels.count ?? 0) - 1) {
|
|
|
// self?.collectionView.setContentOffset(CGPoint(x: CGFloat((self?.currItemModelIndex ?? 0) + 1) * (self?.collectionView.frame.width ?? 0), y: 0), animated: true)
|