Przeglądaj źródła

Merge branch 'master' of https://git.yishihui.com/iOS/BFRecordScreenKit

* 'master' of https://git.yishihui.com/iOS/BFRecordScreenKit:
  字幕服务分开启动
  1.素材录制按钮状态
  字幕服务分开初始化
  字幕服务分开初始化

# Conflicts:
#	BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift
harry 3 lat temu
rodzic
commit
768d2d1196

+ 2 - 2
BFRecordScreenKit/Classes/BFVoiceRecordManager.swift

@@ -31,9 +31,9 @@ class BFVoiceRecordManager: NSObject {
     /// - Parameters:
     ///   - token: NLS token
     ///   - appid: NLS appid
-    public init(token: String, appid: String) {
+    public override init() {
         super.init()
-        audioRecorder = BFRecorderManager(token, appid: appid)
+        audioRecorder = BFRecorderManager()
         audioRecorder?.delegate = self
     }
     

+ 141 - 144
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

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