Browse Source

录音生成失败补充返回回调

胡志强 3 years ago
parent
commit
19e2b2ea0e

+ 3 - 0
BFRecordScreenKit/Classes/BFVoiceRecordManager.swift

@@ -129,6 +129,9 @@ extension BFVoiceRecordManager: BFRecorderManagerDelegate {
                 endRecordHandle?(model, nil)
 
                 BFLog(message: "\(debugHeader)降噪用时\(Date().timeIntervalSince(beginRecordTime1))")
+            }else {
+                endRecordHandle?(nil, NSError(domain: "RecordManager", code: -10010, userInfo: ["msg":"录音model为nil"]))
+
             }
             // 删除临时 wav 文件
             deleteFile(outfile: wavFilePath)

+ 2 - 1
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenBaseManager.swift

@@ -14,7 +14,8 @@ import BFMediaKit
 class BFRecordScreenBaseManager : NSObject{
     
     weak var dele:BFRecordScreenController?
-    
+    var recordEndCallBack : recordEndCallBack?
+
     weak var assetPlayer: AVPlayer?
     weak var recordPlayer : AVPlayer?
     var progreddL : UILabel?

+ 9 - 9
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -37,14 +37,13 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     // 录制完成回调
     var hasInitCallBack : (()->Void)?
     var cameraFlipHandle : ((Bool) -> Void)?
-    var recordEndCallBack : recordEndCallBack?
     var recordProgressCallBack : ((CMTime) -> Void)?
     
     var startTime = Date()
     var videoModel = PQEditVisionTrackMaterialsModel()
     
     // 用于打开摄像头初始流程
-    static var firstOpenCamera : Bool = true
+    static var initOpenCamera : Bool = true
     
     var currPlayTime : CMTime = .zero
     fileprivate var timerr:Timer?
@@ -156,7 +155,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         camera.addTarget(filter)
         filter.addTarget(rendView)
         
-        if BFRecordScreenCameraManager.firstOpenCamera {
+        if BFRecordScreenCameraManager.initOpenCamera {
             startRecord()
             DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: { [weak self] in
                 guard let wself = self else { return }
@@ -211,7 +210,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         videoModel.locationPath = "nil"
         
         // 为了第一时间能更新collection view数据
-        if !BFRecordScreenCameraManager.firstOpenCamera{
+        if !BFRecordScreenCameraManager.initOpenCamera{
             recordItem?.videoStickers.append(videoModel)
             progreddL?.isHidden = false
             cameraProgressV?.isHidden = false
@@ -220,7 +219,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         timerr?.invalidate()
         timerr = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: {[weak self] _ in
             guard let wself = self else { return }
-            if BFRecordScreenCameraManager.firstOpenCamera {
+            if BFRecordScreenCameraManager.initOpenCamera {
                 return
             }
             //MARK: 进度计时器
@@ -241,10 +240,11 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         gropQueue.enter() // 录像
         groupCount += 1
 
+        //MARK: 结束录制回调
         gropQueue.notify(queue: DispatchQueue.main) {[weak self] in
             guard let wself = self else { return }
-            if BFRecordScreenCameraManager.firstOpenCamera{
-                BFRecordScreenCameraManager.firstOpenCamera = false
+            if BFRecordScreenCameraManager.initOpenCamera{
+                BFRecordScreenCameraManager.initOpenCamera = false
                 return
             }
             let cameraSuccess = wself.recordFinishedResult && ((wself.videoModel.timelineCMOut - wself.videoModel.timelineCMIn).seconds > 1)
@@ -270,7 +270,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         timerr?.invalidate()
         timerr = nil
 //        BFLog(1, message: " 拍摄时长 \(Date().timeIntervalSince(startTime))")
-        let su = BFRecordScreenCameraManager.firstOpenCamera
+        let su = BFRecordScreenCameraManager.initOpenCamera
         movieWrite?.finishRecording(completionHandler: {[weak self] in
             guard let wself = self else { return }
             
@@ -644,7 +644,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 
 extension BFRecordScreenCameraManager : GPUImageVideoCameraDelegate {
     func willOutputSampleBuffer(_ sampleBuffer: CMSampleBuffer!) {
-        if !recording || BFRecordScreenCameraManager.firstOpenCamera {
+        if !recording || BFRecordScreenCameraManager.initOpenCamera {
             return
         }
         let dur = CMTime(seconds: movieWrite?.duration.seconds ?? 0, preferredTimescale: 1000)

+ 77 - 57
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -914,18 +914,13 @@ public class BFRecordScreenController: BFBaseViewController {
                 model.endCMTime = wself.currentAssetProgress
 //                BFLog(1, message: "录音地址:\((model.wavFilePath ?? "").replacingOccurrences(of: documensDirectory, with: ""))")
                 BFLog(1, message: "   文件时长record:\(wself.rscmanager.recordItem?.voiceStickers.count ?? 0),   \(model.startCMTime.seconds) -- \(model.endCMTime.seconds), dur: \(model.endCMTime.seconds - model.startCMTime.seconds)")
-
-                if model.endCMTime.seconds < model.startCMTime.seconds{
-                    BFLog(1, message: "error")
-                }
+                wself.recordFinished((model.endCMTime.seconds - model.startCMTime.seconds) >= 1)
+                
                 /// 注:录音机回调的录音时长大于一秒,而业务逻辑计算的会小于一秒
                 if (model.endCMTime.seconds - model.startCMTime.seconds) < 1 {
                     // 取消录制
-                    wself.recordManagerCancelRecord(voiceModel: model)
-                    wself.rscurrentManager.recordFinished(isSuccess: false)
                     return
                 }
-                wself.rscurrentManager.recordFinished(isSuccess:true)
                 // ********** 开始处理冲突的录制部分
                 let newRange = CMTimeRange(start: model.startCMTime, end: model.endCMTime)
 
@@ -950,7 +945,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
 
                 wself.itemModels[wself.currItemModelIndex].voiceStickers.append(model)
-                // 录制结束回调
+                // 录制结束回调给主工程页面(埋点之类功能)
                 wself.recordEndHandle?(model)
                 // 如果是图片素材同时有需要删除的录音时需要调整录音文件开始结束时间
                 // warning: 图片录制的时候应该只能在结尾处录制
@@ -1588,15 +1583,8 @@ public class BFRecordScreenController: BFBaseViewController {
             events.removeLast()
 
             let dur = itemModels[currItemModelIndex].materialDuraion.seconds
-            if dur > 0 {
-                if currMediaType == .Image {
-                    changeProgress(isBack: true, progress: Float(jumpTime.seconds))
-                } else {
-                    changeProgress(changCMTime: jumpTime)
-                }
-            } else {
-                changeProgress(progress: Float(0))
-            }
+            changeProgress(changCMTime: (dur > 0) ? jumpTime : .zero)
+            
             isDragingProgressSlder = false
             currentPlayRecordIndex = -1
             BFLog(3, message: "重置播放index-\(#function) = \(currentPlayRecordIndex)")
@@ -1657,9 +1645,8 @@ public class BFRecordScreenController: BFBaseViewController {
     }
     
     // MARK: - 进度条拖动回调
-    
-    func thumbViewEnded(progress: Float) {
-        changeProgress(progress: progress)
+    func thumbViewDragEnded(progress: Float) {
+        changeProgress(changCMTime: convertProgressToCMTime(progress))
         isDragingProgressSlder = false
         currentPlayRecordIndex = -1
         hadPrepareToPlayRecord = false
@@ -1693,7 +1680,7 @@ public class BFRecordScreenController: BFBaseViewController {
 
                 wself.isDragingProgressSlder = true
 
-                wself.changeProgress(progress: process)
+                wself.changeProgress(changCMTime: wself.convertProgressToCMTime(process))
                 
                 if wself.currMediaType != .Video && CMTimeCompare(wself.rscurrentManager.recordItem?.materialDuraion ?? .zero, .zero) != 0 {
                     wself.recordBtn.isHidden = true
@@ -1706,7 +1693,7 @@ public class BFRecordScreenController: BFBaseViewController {
             DispatchQueue.main.async { [weak self] in
                 guard let wself = self else { return }
 
-                wself.thumbViewEnded(progress: process)
+                wself.thumbViewDragEnded(progress: process)
             }
         }
     }
@@ -1745,33 +1732,39 @@ public class BFRecordScreenController: BFBaseViewController {
 
         if startTime != nil && endTime != nil {
             //  TODO: 停在了录音区间,显示删除按钮
-            if needAdsorb {
-                if fabs((endTime! - currentAssetProgress).seconds) < 0.5 {
-                    BFLog(1, message: "吸附在录音结尾, \(endTime!.seconds)")
-                    //                changeWithDrawBtnLayout(false)
-                    changeProgress(changCMTime: endTime!)
-                    progressThumV.progress = endTime!.seconds
-
-                    searchStopAtRecordRange(needAdsorb: false)
-                    return
-                } else {
-                    if fabs((startTime! - currentAssetProgress).seconds) < 0.5 {
-                        BFLog(1, message: "吸附在录音开始")
-                        //                    changeWithDrawBtnLayout(true)
-                        changeProgress(changCMTime: startTime!)
-                        progressThumV.progress = startTime!.seconds
-                    }
-                    deleteRecordBtn.isHidden = false
-                    recordBtn.isHidden = true
-                    // add by ak 这里 isHidden 无效
-
-                    BFLog(1, message: "停在了录音区间里 \(isStopAtRecordRange), currTime:\(currentAssetProgress.seconds), 录音范围:\(startTime!.seconds) - \(endTime!.seconds)")
-                }
-            } else {
-                updateRecordBtnStatus(true)
+//            if needAdsorb {
+//                if fabs((endTime! - currentAssetProgress).seconds) < 0.5 {
+//                    BFLog(1, message: "吸附在录音结尾, \(endTime!.seconds)")
+//                    //                changeWithDrawBtnLayout(false)
+//                    changeProgress(changCMTime: endTime!)
+//                    progressThumV.progress = endTime!.seconds
+//
+//                    searchStopAtRecordRange(needAdsorb: false)
+//                    return
+//                } else {
+//                    if fabs((startTime! - currentAssetProgress).seconds) < 0.5 {
+//                        BFLog(1, message: "吸附在录音开始")
+//                        //                    changeWithDrawBtnLayout(true)
+//                        changeProgress(changCMTime: startTime!)
+//                        progressThumV.progress = startTime!.seconds
+//                    }
+//                    deleteRecordBtn.isHidden = false
+//                    recordBtn.isHidden = true
+//                    // add by ak 这里 isHidden 无效
+//
+//                    BFLog(1, message: "停在了录音区间里 \(isStopAtRecordRange), currTime:\(currentAssetProgress.seconds), 录音范围:\(startTime!.seconds) - \(endTime!.seconds)")
+//                }
+//            } else {
 
                 BFLog(1, message: "停在了录音区间里 \(isStopAtRecordRange), currTime:\(currentAssetProgress.seconds), 录音范围:\(startTime!.seconds) - \(endTime!.seconds)")
+//            }
+            // 摄像和图片都可以走插入录制功能
+            if (currMediaType == .Camera && (endTime! - currentAssetProgress).seconds < 1.5 * 5 / 70.0)
+                || (currMediaType == .Image && ((endTime! - currentAssetProgress).seconds < 1.5 * 2.0 / 70.0)){
+                canInsertVideo = true
+                BFLog(1, message: "可以插入录音")
             }
+            updateRecordBtnStatus(true)
 
         } else {
             updateRecordBtnStatus(false)
@@ -1813,6 +1806,25 @@ public class BFRecordScreenController: BFBaseViewController {
         
         deleteRecordBtn.isHidden = isEndPlay ? true : !(recordBtn.isHidden)
     }
+    
+    func recordFinished(_ isFinished:Bool) {
+        if !isFinished {
+            recordManagerCancelRecord(voiceModel: recorderManager?.voiceModel)
+            rscurrentManager.recordFinished(isSuccess: false)
+        }else {
+            rscurrentManager.recordFinished(isSuccess:true)
+        }
+    }
+    
+    //
+    func recoverRecord() {
+        
+    }
+    
+    // 重新加载数据
+    func reloadData(){
+        // 重置播放器进度,按钮状态,缩略图展示,当前进度
+    }
 
     // MARK: - 权限申请
 
@@ -2281,22 +2293,30 @@ public class BFRecordScreenController: BFBaseViewController {
         withDrawBtn.setNeedsLayout()
         withDrawBtn.layoutIfNeeded()
     }
-
-    // 通过缩略图进度条控制播放进度
-    // progress : 图片且isback为true时,表示是时长;  其他情况: 0 - 1,百分比
-    func changeProgress(isBack: Bool = false, progress: Float = -1, changCMTime: CMTime = .zero) {
+    
+    func convertProgressToCMTime (_ progress:Float) -> CMTime {
         var newProgress = progress
         if progress.isNaN || progress.isInfinite {
             newProgress = 0
         }
+        
+        var currTime = CMTime.zero
+        let duration = itemModels[currItemModelIndex].materialDuraion
+        
+        currTime = CMTime(seconds: Double(newProgress) * duration.seconds, preferredTimescale: 1000)
+        
+        
+        return currTime
+    }
+
+    // 通过缩略图进度条控制播放进度
+    // progress : 图片且isback为true时,表示是时长;  其他情况: 0 - 1,百分比
+    func changeProgress(changCMTime: CMTime = .zero) {
+
         if currMediaType == .Video {
             let duration = itemModels[currItemModelIndex].materialDuraion
             if duration.seconds > 0 {
-                if progress == -1 {
-                    rscurrentManager.currentAssetProgress = changCMTime
-                } else {
-                    rscurrentManager.currentAssetProgress = CMTime(seconds: Double(newProgress) * duration.seconds, preferredTimescale: 1000)
-                }
+                rscurrentManager.currentAssetProgress = changCMTime
                 DispatchQueue.main.async { [weak self] in
                     guard let wself = self else { return }
                     
@@ -2319,7 +2339,7 @@ public class BFRecordScreenController: BFBaseViewController {
             }
             
         } else {
-            rscurrentManager.currentAssetProgress = isBack ? CMTime(seconds: Double(newProgress), preferredTimescale: 1000) : ((progress != -1) ? CMTime(seconds: (Double(newProgress) * itemModels[currItemModelIndex].materialDuraion.seconds), preferredTimescale: 1000) : changCMTime)
+            rscurrentManager.currentAssetProgress = changCMTime
             if currentAssetProgress.seconds > itemModels[currItemModelIndex].materialDuraion.seconds {
                 rscurrentManager.currentAssetProgress = itemModels[currItemModelIndex].materialDuraion
             }
@@ -2329,7 +2349,7 @@ public class BFRecordScreenController: BFBaseViewController {
 //                BFLog(1,message: "更新进度- \(wself.currentAssetProgress.seconds)")
                 wself.progreddL.text = String(format: "%@", CMTimeGetSeconds(self!.currentAssetProgress).formatDurationToHMS())
             }
-            BFLog(message: "progress = \(progress),currentAssetProgress = \(currentAssetProgress.seconds),materialDuraion = \(itemModels[currItemModelIndex].materialDuraion.seconds)")
+            BFLog(message: "currentAssetProgress = \(currentAssetProgress.seconds),materialDuraion = \(itemModels[currItemModelIndex].materialDuraion.seconds)")
 
             // add by ak 图片素材拖动指针时同时更新字幕显现数据
             updateSubtitle(time: currentAssetProgress)

+ 0 - 2
BFRecordScreenKit/Classes/RecordScreen/View/ProgressView/BFCameraProgressView.swift

@@ -128,7 +128,6 @@ class BFCameraProgressView: BFProgressBaseView {
     }
     
     func updateCellWidth(index:Int, progress:CMTime) {
-        BFLog(1, message: "frame sec: \(progress.seconds)")
         if let sticker = recordItem?.videoStickers.first(where: { mod in
             CMTimeCompare(mod.timelineCMIn, progress) <= 0 &&  CMTimeCompare(mod.timelineCMOut, progress) >= 0
         }) {
@@ -148,7 +147,6 @@ class BFCameraProgressView: BFProgressBaseView {
             let p = CGPoint(x: progress.seconds * 70 / 5.0, y: 0)
             progressView.contentOffset = p
             progressView.contentSize = CGSize(width: p.x + cScreenWidth, height: 50)
-            BFLog(1, message: "frame: \(imageViews[index].width), sec: \(progress.seconds)")
         }
     }