|
@@ -50,11 +50,19 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
return m
|
|
|
}()
|
|
|
|
|
|
- var rscmanager = BFRecordScreenCameraManager()
|
|
|
+ lazy var rscmanager : BFRecordScreenCameraManager = {
|
|
|
+ let m = BFRecordScreenCameraManager()
|
|
|
+ m.recordProgressCallBack = {[weak self] progress in
|
|
|
+ guard let wself = self else { return }
|
|
|
+
|
|
|
+ }
|
|
|
+ return m
|
|
|
+ }()
|
|
|
var rscurrentManager = BFRecordScreenBaseManager()
|
|
|
|
|
|
// MARK: - 录制参数
|
|
|
public var assets = [PHAsset]()
|
|
|
+
|
|
|
var currItemModelIndex = -1 {
|
|
|
didSet{
|
|
|
if currItemModelIndex < 0 {
|
|
@@ -66,18 +74,21 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
case .Image:
|
|
|
rscurrentManager = rsimanager
|
|
|
recordBtn.setTitle("按住 录制", for: .normal)
|
|
|
- progressThumV.isHidden = true
|
|
|
-
|
|
|
+ progressThumV.isHidden = false
|
|
|
+ progreddL.isHidden = false
|
|
|
+
|
|
|
case .Video:
|
|
|
rscurrentManager = rsvmanager
|
|
|
recordBtn.setTitle("按住 录音", for: .normal)
|
|
|
progressThumV.isHidden = false
|
|
|
-
|
|
|
+ progreddL.isHidden = false
|
|
|
+
|
|
|
case .Camera:
|
|
|
rscurrentManager = rscmanager
|
|
|
recordBtn.setTitle("按住 录音", for: .normal)
|
|
|
- progressThumV.isHidden = false
|
|
|
-
|
|
|
+ progressThumV.isHidden = true
|
|
|
+ progreddL.isHidden = true
|
|
|
+
|
|
|
default:
|
|
|
break
|
|
|
}
|
|
@@ -93,27 +104,31 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
make.edges.equalToSuperview()
|
|
|
}
|
|
|
|
|
|
- rendV.recordEndCallBack = {[weak self] isSuccess, sticker in
|
|
|
- if let sticker = sticker {
|
|
|
+ // MARK: 摄像头结束回调
|
|
|
+ (rscurrentManager as? BFRecordScreenCameraManager)?.recordEndCallBack = { isSuccess, sticker in
|
|
|
+ if isSuccess, let sticker = sticker {
|
|
|
itemModel.videoStickers.append(sticker)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
cell.playView.setInputRotation(GPUImageRotationMode(rawValue: 0), at: 0)
|
|
|
- progressThumV.isHidden = false
|
|
|
- if itemModel.mediaType == .Video {
|
|
|
- rsvmanager.assetPlayer
|
|
|
- }
|
|
|
+// if itemModel.mediaType == .Video {
|
|
|
+// rsvmanager.assetPlayer
|
|
|
+// }
|
|
|
}
|
|
|
rscurrentManager.playView = cell.playView
|
|
|
+ rscurrentManager.progreddL = progreddL
|
|
|
+ rscurrentManager.progressThumV = progressThumV
|
|
|
+
|
|
|
rscurrentManager.recordItem = itemModel
|
|
|
rscurrentManager.resetEnv()
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
public var itemModels = [BFRecordItemModel]()
|
|
|
// add by ak 当前的显示的字幕位置
|
|
|
var showSubtitleIndex = -1
|
|
@@ -390,7 +405,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
audioSettingView.haveSpeakSlider.valueIsInt = true
|
|
|
audioSettingView.noSpeakSlider.valueIsInt = true
|
|
|
audioSettingView.callBack = { [weak self] haveSpeak, noHaveSpeak in
|
|
|
- BFLog(1, message: "haveSpeak is:\(haveSpeak),noHaveSpeak is:\(noHaveSpeak)")
|
|
|
+// BFLog(1, message: "haveSpeak is:\(haveSpeak),noHaveSpeak is:\(noHaveSpeak)")
|
|
|
self?.haveSpeakVolume = haveSpeak / 100.0
|
|
|
self?.noSpeakVolume = noHaveSpeak / 100.0
|
|
|
if !(self?.isNormalPlaying ?? false), !(self?.isRecording ?? false) {
|
|
@@ -486,10 +501,6 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
// MARK: - ----------------- 生命周期
|
|
|
|
|
|
deinit {
|
|
|
- rscmanager.clean()
|
|
|
- rsvmanager.clean()
|
|
|
- rsimanager.clean()
|
|
|
-
|
|
|
NotificationCenter.default.removeObserver(self)
|
|
|
avplayerTimeObserver?.invalidate()
|
|
|
recordPlayerTimeObserver?.invalidate()
|
|
@@ -574,29 +585,28 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
|
|
|
// 录音字幕回调
|
|
|
recorderManager?.subtitleRecordHandle = { [weak self] eventCode, recordId, asrResult, audioFilePath, _ in
|
|
|
- BFLog(1, message: "eventcode:\(eventCode), recordid:\(String(describing: recordId)), asr:\(String(describing: asrResult))")
|
|
|
+// BFLog(1, message: "eventcode:\(eventCode), recordid:\(String(describing: recordId)), asr:\(String(describing: asrResult))")
|
|
|
|
|
|
DispatchQueue.global().async { [weak self] in
|
|
|
let newSubtitle = PQEditSubTitleModel()
|
|
|
newSubtitle.recordId = recordId
|
|
|
|
|
|
if asrResult == nil || (asrResult?.count ?? 0) <= 0 {
|
|
|
- BFLog(1, message: "onNuiEventCallback 识别结果为空????不能生成字幕数据")
|
|
|
+// BFLog(1, message: "onNuiEventCallback 识别结果为空????不能生成字幕数据")
|
|
|
return
|
|
|
}
|
|
|
// 只有为24时才有字幕返回
|
|
|
if eventCode != 24 || recordId == nil{
|
|
|
- BFLog(1, message: "onNuiEventCallback eventCode != 24 || recordId == nil")
|
|
|
+// BFLog(1, message: "onNuiEventCallback eventCode != 24 || recordId == nil")
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
let dicResult: [String: Any]? = jsonStringToDictionary(asrResult!)
|
|
|
- let header = dicResult?["header"] as? [String: Any]
|
|
|
let payload = dicResult?["payload"] as? [String: Any]
|
|
|
- BFLog(1, message: "onNuiEventCallback event 识别结果:) \(payload?["result"] ?? "") ,taskId:\((header?["task_id"] as? String) ?? "taskId"), 识别时间:\(((payload?["begin_time"]) as? Int) ?? 0) ~ \(((payload?["time"]) as? Int) ?? 0) startTime:\(self?.recorderManager?.voiceModel?.startCMTime.seconds ?? 0.0)")
|
|
|
+// let header = dicResult?["header"] as? [String: Any]
|
|
|
+// BFLog(1, message: "onNuiEventCallback event 识别结果:) \(payload?["result"] ?? "") ,taskId:\((header?["task_id"] as? String) ?? "taskId"), 识别时间:\(((payload?["begin_time"]) as? Int) ?? 0) ~ \(((payload?["time"]) as? Int) ?? 0) startTime:\(self?.recorderManager?.voiceModel?.startCMTime.seconds ?? 0.0)")
|
|
|
// 1,保存字幕数据 begin_time是开始出现文字的时间,time 是结束文字出现的时间 单位都为毫秒,都是相对于录制音频数据整段时间。self.recorderManager.voiceModel?.startCMTime.seconds 为开始的录制的时间,开始和结束都要加上这个时差
|
|
|
- let taskID = "aa"
|
|
|
// 这里加300ms 是因为返回结果为了切到字,时长提前一些时间,具体时间官方没说和原音频有关系。这里我们先延后300ms 单位:毫秒。
|
|
|
var tempVoice: PQVoiceModel?
|
|
|
var tempItem: BFRecordItemModel?
|
|
@@ -609,21 +619,21 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
if tempVoice != nil {
|
|
|
tempItem = item
|
|
|
}
|
|
|
- BFLog(3, message: "字幕回调-找到录音文件:taskID=\(taskID ),audioFilePath=\(audioFilePath ?? ""),index=\(index)")
|
|
|
+ BFLog(3, message: "字幕回调-找到录音文件:taskID=\(recordId ),audioFilePath=\(audioFilePath ?? ""),index=\(index)")
|
|
|
}
|
|
|
}
|
|
|
// 2:如果通过titleTaskId没找到录音文件,则通过
|
|
|
if tempVoice == nil && (self?.isRecording ?? false) && self?.itemModels[self?.currItemModelIndex ?? 0].voiceStickers.last?.recordId == nil {
|
|
|
- BFLog(3, message: "字幕回调-如果通过titleTaskId没找到录音文件:taskID=\(taskID ),audioFilePath=\(audioFilePath ?? "")")
|
|
|
+ BFLog(3, message: "字幕回调-如果通过titleTaskId没找到录音文件:taskID=\(recordId ),audioFilePath=\(audioFilePath ?? "")")
|
|
|
tempVoice = self?.itemModels[self?.currItemModelIndex ?? 0].voiceStickers.last
|
|
|
}
|
|
|
// 3:如果通过titleTaskId跟audioFilePath都没找到录音文件,则默认为recorderManager?.voiceModel
|
|
|
guard let currentVoice = (tempVoice ?? self?.recorderManager?.voiceModel) ?? self?.itemModels[self?.currItemModelIndex ?? 0].voiceStickers.last else {
|
|
|
- BFLog(3, message: "字幕回调-最终没找到录音文件:taskID=\(taskID ),audioFilePath=\(audioFilePath ?? "")")
|
|
|
+ BFLog(3, message: "字幕回调-最终没找到录音文件:taskID=\(recordId ),audioFilePath=\(audioFilePath ?? "")")
|
|
|
return
|
|
|
}
|
|
|
guard let currentItem = tempItem ?? self?.itemModels[self?.currItemModelIndex ?? 0] else {
|
|
|
- BFLog(3, message: "字幕回调-最终没找到录音文件:taskID=\(taskID ),audioFilePath=\(audioFilePath ?? "")")
|
|
|
+ BFLog(3, message: "字幕回调-最终没找到录音文件:taskID=\(recordId ),audioFilePath=\(audioFilePath ?? "")")
|
|
|
return
|
|
|
}
|
|
|
newSubtitle.timelineIn = currentVoice.startCMTime + CMTime(seconds: Float64((((payload?["begin_time"]) as? Int) ?? 0) + 300) / 1000.0, preferredTimescale: 1000)
|
|
@@ -649,7 +659,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
// 加入到语音数组里
|
|
|
|
|
|
model.endCMTime = sself.currentAssetProgress
|
|
|
- BFLog(1, message: "对应关系:录制结束文件地址:\((model.wavFilePath ?? "").replacingOccurrences(of: documensDirectory, with: "")) 开始录音前地址:\((self?.recorderManager?.voiceModel?.wavFilePath ?? "aa").replacingOccurrences(of: documensDirectory, with: ""))- \(model.startCMTime.seconds)-\(model.endCMTime.seconds)-\(model.endCMTime.seconds - model.startCMTime.seconds)")
|
|
|
+ BFLog(1, message: "录音地址:\((model.wavFilePath ?? "").replacingOccurrences(of: documensDirectory, with: "")) - \(model.startCMTime.seconds)~\(model.endCMTime.seconds), dur: \(model.endCMTime.seconds - model.startCMTime.seconds) / \(model.duration)")
|
|
|
/// 注:录音机回调的录音时长大于一秒,而业务逻辑计算的会小于一秒
|
|
|
if (model.endCMTime.seconds - model.startCMTime.seconds) < 1 {
|
|
|
// 取消录制
|
|
@@ -1164,23 +1174,29 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- recorderManager?.cancelTitleService()
|
|
|
+ DispatchQueue.global().async {[weak self] in
|
|
|
+
|
|
|
+ guard let sself = self else { return }
|
|
|
+
|
|
|
+ sself.recorderManager?.cancelTitleService()
|
|
|
+ let model = PQVoiceModel()
|
|
|
+ model.startCMTime = sself.currentAssetProgress
|
|
|
+ model.currIndex = sself.currItemModelIndex
|
|
|
+ // model.recordId = getUniqueId(desc: "recordId")
|
|
|
+ model.volume = 100
|
|
|
+ sself.recorderManager?.voiceModel = model
|
|
|
+ BFLog(3, message: "开始录制-开始:currentAssetProgress=\(sself.currentAssetProgress.seconds),cuInde=\(sself.currItemModelIndex),\(model)")
|
|
|
+ sself.recorderManager?.startRecord()
|
|
|
+// sself.recorderManager?.audioRecorder?.startNeoNui(sself.NeoNuiToken ?? "", appid: sself.NeoNuiAPPID ?? "")
|
|
|
+
|
|
|
+ }
|
|
|
// 开始时间
|
|
|
beginOnStartBtn = true
|
|
|
isRecording = true
|
|
|
|
|
|
UIApplication.shared.keyWindow?.isUserInteractionEnabled = false
|
|
|
|
|
|
- let model = PQVoiceModel()
|
|
|
- model.startCMTime = currentAssetProgress
|
|
|
- model.currIndex = currItemModelIndex
|
|
|
-// model.recordId = getUniqueId(desc: "recordId")
|
|
|
- model.volume = 100
|
|
|
- recorderManager?.voiceModel = model
|
|
|
- BFLog(3, message: "开始录制-开始:currentAssetProgress=\(currentAssetProgress.seconds),cuInde=\(currItemModelIndex),\(model)")
|
|
|
- recorderManager?.startRecord()
|
|
|
- recorderManager?.audioRecorder?.startNeoNui(NeoNuiToken ?? "", appid: NeoNuiAPPID ?? "")
|
|
|
-
|
|
|
+
|
|
|
if !avatarView.isHidden {
|
|
|
avatarView.beginRecord()
|
|
|
}
|
|
@@ -1209,6 +1225,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
self?.recordBtn.isEnabled = true
|
|
|
}
|
|
|
|
|
|
+ rscurrentManager.endRecord()
|
|
|
isRecording = false
|
|
|
// progressThumV.progressView.isUserInteractionEnabled = true
|
|
|
// collectionView.isScrollEnabled = true
|
|
@@ -2081,13 +2098,6 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
|
|
|
cell = BFVideoCoverViewCell.gpuVideoViewCell(collectionView: collectionView, indexPath: indexPath)
|
|
|
case .Camera:
|
|
|
cell = BFCameraCoverViewCell.gpuCamraViewCell(collectionView: collectionView, indexPath: indexPath)
|
|
|
- (cell as! BFCameraCoverViewCell).initCameraAfterData = {[weak self] in
|
|
|
-// if self?.currItemModelIndex == indexPath.row {
|
|
|
-// // 开启摄像头
|
|
|
-// self?.rscurrentManager.playView = cell.playView
|
|
|
-// self?.rscurrentManager.resetEnv()
|
|
|
-// }
|
|
|
- }
|
|
|
default:
|
|
|
break
|
|
|
}
|
|
@@ -2097,7 +2107,7 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
|
|
|
return
|
|
|
}
|
|
|
cell?.addData()
|
|
|
- if item.mediaType == .Image {
|
|
|
+ if item.mediaType != .Camera {
|
|
|
sself.progressThumV.recordItem = item
|
|
|
sself.progressThumV.isHidden = false
|
|
|
}
|
|
@@ -2174,10 +2184,10 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
|
|
|
self?.recordBtn.isEnabled = true
|
|
|
}
|
|
|
// 更新缩略图
|
|
|
- progressThumV.isHidden = false
|
|
|
+// progressThumV.isHidden = false
|
|
|
progreddL.text = "00:00"
|
|
|
// 重置指针
|
|
|
- currentAssetProgress = CMTime(seconds: 0, preferredTimescale: 1000)
|
|
|
+ currentAssetProgress = .zero
|
|
|
searchStopAtRecordRange()
|
|
|
// 切换要更新当前录制index,避免在录制完以后切换素材这种时候为-3会拦截
|
|
|
currentPlayRecordIndex = -1
|