Kaynağa Gözat

update 摄像头录制

harry 3 yıl önce
ebeveyn
işleme
cb4bea527d

+ 17 - 3
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenBaseManager.swift

@@ -7,14 +7,17 @@
 
 import Foundation
 import GPUImage
+import BFCommonKit
 
 
-class BFRecordScreenBaseManager {
+class BFRecordScreenBaseManager : NSObject{
     
     weak var dele:BFRecordScreenController?
     
     weak var assetPlayer: AVPlayer?
     weak var recordPlayer : AVPlayer?
+    var progreddL : UILabel?
+    var progressThumV: BFVideoThumbProgressView?
     
     var recordItem : BFRecordItemModel?{
         didSet{
@@ -28,16 +31,22 @@ class BFRecordScreenBaseManager {
     
     var currentAssetProgress: CMTime = .zero
 
+    var recording = false
+    // MARK: -
     func resetEnv(){
         
     }
     
     func startRecord(){
+        if recording{
+            return
+        }
         
+        recording = true
     }
-    
+
     func endRecord(){
-        
+        recording = false
     }
     
     func play(){
@@ -51,4 +60,9 @@ class BFRecordScreenBaseManager {
     func clean(){
         GPUImageContext.sharedFramebufferCache().purgeAllUnassignedFramebuffers()
     }
+    
+    deinit {
+        clean()
+        BFLog(1, message: "\(self) release")
+    }
 }

+ 192 - 33
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -10,63 +10,222 @@ import GPUImage
 import BFCommonKit
 import BFUIKit
 import BFMediaKit
+import CoreMedia
+import UIKit
 
 
-class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
+let vpath = recordVideosDirectory + "camera_writer.mov"
+let videoSize = CGSize(width: cScreenWidth, height: cScreenWidth * 16 / 9.0)
 
+class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     //
-    var rendView: BFRecordAvatarView = {
-        let v = BFRecordAvatarView(frame: .zero, sessionPreset: AVCaptureSession.Preset.hd1920x1080, location: .backFacing)
-        v.videoPixelsSize = Size(width: Float(cScreenWidth), height: Float(cScreenWidth) * 16.0 / 9.0)
-        return v
-    }()
+    var rendView = GPUImageView()
+    // 录制完成回调
+    var recordEndCallBack: recordEndCallBack?
+    var recordProgressCallBack : ((CMTime) -> Void)?
+    var startTime = Date()
+    let videoModel = PQEditVisionTrackMaterialsModel()
+    var firstOpenCamera : Bool = true
+    
+    fileprivate var timer:Timer?
+    // 定时器时间间隔
+    var timeDur: TimeInterval = 1
+
     
-    lazy var camera : GPUImageVideoCamera? = {
-        let camera = GPUImageVideoCamera(sessionPreset: AVCaptureSession.Preset.hd1920x1080.rawValue, cameraPosition: AVCaptureDevice.Position.back)
+    lazy var camera : GPUImageStillCamera? = {
+        let camera = GPUImageStillCamera(sessionPreset: AVCaptureSession.Preset.hd1920x1080.rawValue, cameraPosition: AVCaptureDevice.Position.back)
         camera?.outputImageOrientation = UIInterfaceOrientation.portrait
+        camera?.addAudioInputsAndOutputs()
+        camera?.delegate = self
         return camera
         
     }()
     
-    lazy var movieWrite : GPUImageMovieWriter? = {
-        let vpath = NSHomeDirectory() + "/camera_writer.mov"
-        let writer = GPUImageMovieWriter(movieURL: URL(fileURLWithPath: vpath), size: CGSize(width: cScreenWidth, height: cScreenWidth * 16 / 9.0), fileType: ".mov", outputSettings: [:])
-        filter.addTarget(writer)
-        
-        return writer
-    }()
+    var movieWrite : GPUImageMovieWriter?
     
     override func resetEnv(){
-//        guard let camera = camera else {
-//            cShowHUB(superView: nil, msg: "摄像头开启失败!")
-//            return
-//        }
-//        camera.startCapture()
-//        camera.addTarget(filter)
-//        filter.addTarget(pv)
-        rendView.openCamera()
+        guard let camera = camera else {
+            cShowHUB(superView: nil, msg: "摄像头开启失败!")
+            return
+        }
+        camera.startCapture()
+
+        initerlizeWriter()
+
+        camera.addTarget(filter)
+        filter.addTarget(rendView)
+        
+        if firstOpenCamera {
+            startRecord()
+            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: { [weak self] in
+                guard let wself = self else { return }
+                
+                wself.endRecord()
+                wself.firstOpenCamera = false
+            })
+        }
     }
     
     override func startRecord(){
-//        guard let movieWrite = movieWrite else {
-//            cShowHUB(superView: nil, msg: "录制启动失败")
-//            return
-//        }
-//
-//        movieWrite.startRecording()
+        guard let movieWrite = movieWrite else {
+            cShowHUB(superView: nil, msg: "录制启动失败")
+            return
+        }
+        
+
+        super.startRecord()
+        if !firstOpenCamera{
+            progreddL?.isHidden = false
+            progressThumV?.isHidden = false
+        }
+        
+        startTime = Date()
+        videoModel.timelineIn = currentAssetProgress.seconds
+        
+        movieWrite.startRecording()
         
-        rendView.beginRecord(startTime: .zero)
+        var thumbCount = -1
+        timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: {[weak self] timer in
+            guard let wself = self else { return }
+            if wself.firstOpenCamera {
+                return
+            }
+            //MARK: 进度计时器
+//            let dur = Date().timeIntervalSince(sself.startTime)
+            let dur = CMTime(seconds: movieWrite.duration.seconds, preferredTimescale: 1000)
+            // 获取缩略图
+            let coculationCount = Int(dur.seconds / 5.0)
+            if coculationCount > thumbCount{
+                BFLog(1, message: "取一张缩略图出来 \(dur.seconds)")
+                wself.camera?.capturePhotoAsImageProcessedUp(toFilter: wself.filter, withCompletionHandler: {[weak self] image, err in
+                    guard let wself = self else { return }
+                    
+                    if let img = image{
+                        wself.recordItem?.thumbImgs.append(img)
+                        wself.updateThumb()
+                    }
+                })
+                thumbCount = coculationCount
+            }
 
+            let currDur = CMTime(seconds: wself.videoModel.timelineIn, preferredTimescale: 1000) + dur
+            wself.currentAssetProgress = currDur
+            wself.recordProgressCallBack?(currDur)
+            wself.updateUI(progress: currDur)
+//            BFLog(1, message: "currTime \(dur.seconds), \(sself.currentAssetProgress.seconds)")
+        })
+        RunLoop.current.add(timer!, forMode: .common)
     }
     
     override func endRecord(){
-        let vpath = NSHomeDirectory() + "/camera_writer.mov"
-        let newPath = PQBridgeObject.p_setupFileRename(vpath)
+        super.endRecord()
         
-        rendView.endRecord()
+        timer?.invalidate()
+        timer = nil
+        BFLog(1, message: " currTime fini 1 \(Date().timeIntervalSince(startTime))")
+        let su = firstOpenCamera
+        movieWrite?.finishRecording(completionHandler: {[weak self] in
+            guard let sself = self else { return }
+            
+            if FileManager.default.fileExists(atPath: vpath) {
+                if !su {
+                    let finalPath = PQBridgeObject.p_setupFileRename(vpath)
+                    let dur = AVURLAsset(url: URL(fileURLWithPath: finalPath))
+                    BFLog(1, message: "currTime fini 2 \(dur.duration.seconds)")
+                    sself.videoModel.timelineOut += dur.duration.seconds
+                    sself.videoModel.locationPath = finalPath
+                    sself.recordEndCallBack?(true, sself.videoModel)
+                }
+            }
+            
+            // 重置writer,提前为下次录制做准备
+            sself.initerlizeWriter()
+        })
     }
     
     override func clean() {
         super.clean()
     }
+    
+    // MARK: - 私有方法
+    func updateUI(progress:CMTime){
+        progreddL?.text = CMTimeGetSeconds(progress).formatDurationToHMS()
+    }
+    
+    func updateThumb(){
+        progressThumV!.addThumbImages(images: recordItem!.thumbImgs)
+        let size = CGSize(width: recordItem!.materialDuraion.seconds * 70.0 / 5.0, height: progressThumV!.height)
+        progressThumV!.progressView.contentSize = size
+    }
+    
+    func beginRecord(startTime:CMTime) {
+
+    }
+    
+    func initerlizeWriter(){
+        if FileManager.default.fileExists(atPath: vpath){
+            try? FileManager.default.removeItem(atPath: vpath)
+        }
+        if movieWrite != nil {
+            filter.removeTarget(movieWrite)
+//            camera?.audioEncodingTarget = nil
+            movieWrite = nil
+        }
+        
+        movieWrite = GPUImageMovieWriter(movieURL: URL(fileURLWithPath: vpath), size: videoSize)
+
+//        movieWrite?.shouldPassthroughAudio = true
+//        movieWrite?.hasAudioTrack = true
+//        camera?.audioEncodingTarget = movieWrite
+        filter.addTarget(movieWrite)
+
+    }
+    
+}
+
+extension BFRecordScreenCameraManager : GPUImageVideoCameraDelegate {
+    func willOutputSampleBuffer(_ sampleBuffer: CMSampleBuffer!) {
+        let dur = CMTime(seconds: movieWrite?.duration.seconds ?? 0, preferredTimescale: 1000)
+        // 获取缩略图
+        let coculationCount = Int(dur.seconds / 5.0)
+        if coculationCount >= recordItem?.thumbImgs.count ?? -1{
+            BFLog(1, message: "取一张缩略图出来 \(dur.seconds)")
+            if let img = sampleBufferToImage(sampleBuffer){
+                recordItem?.thumbImgs.append(img)
+                updateThumb()
+            }
+        }
+    }
+    
+    func sampleBufferToImage(_ sampleBuffer: CMSampleBuffer) -> UIImage? {
+        guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
+            return nil
+        }
+
+        CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
+
+        let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
+        let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
+        let width = CVPixelBufferGetWidth(imageBuffer)
+        let height = CVPixelBufferGetHeight(imageBuffer)
+        let colorSpace = CGColorSpaceCreateDeviceRGB()
+        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.noneSkipFirst.rawValue | CGBitmapInfo.byteOrder32Little.rawValue)
+
+        guard let context = CGContext(data: baseAddress,
+                                      width: width,
+                                      height: height,
+                                      bitsPerComponent:8,
+                                      bytesPerRow: bytesPerRow,
+                                      space: colorSpace,
+                                      bitmapInfo: bitmapInfo.rawValue) else { return nil }
+
+        guard let cgImage = context.makeImage() else {
+            return nil
+        }
+
+        CVPixelBufferUnlockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0));
+
+        return UIImage(cgImage: cgImage)
+
+    }
 }

+ 60 - 50
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

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

+ 26 - 26
BFRecordScreenKit/Classes/RecordScreen/View/BFRecordAvatarView.swift

@@ -55,16 +55,33 @@ class BFRecordAvatarView: UIView {
 //        closedBtn.frame = CGRect(x: frame.maxX - 68, y: frame.maxY - 68, width: 68, height: 68)
         do {
             camera = try Camera(sessionPreset: sessionPreset, location: location, captureAsYUV: true)
-            //            camera.runBenchmark = true
+//            camera.runBenchmark = true
 
 //            let conertFilter = PQCornerFilter()
 //            let cropFilter = Crop()
 //            cropFilter.cropSizeInPixels = videoPixelsSize
 //            cropFilter.cropSizeInPixels = Size(width: 1080, height: 1080)
 //            cropFilter.locationOfCropInPixels = Position(0, (1920 - 1080) / 2)
-
-//            camera  --> cropFilter --> conertFilter --> renderView
 //            camera  --> cropFilter --> conertFilter --> renderView
+            recorderFilePath = recordVideosDirectory
+            if !directoryIsExists(dicPath: recorderFilePath ?? "") {
+                BFLog(message: "文件夹不存在 \(recorderFilePath ?? "")")
+                createDirectory(path: recorderFilePath ?? "")
+            }
+            recorderFilePath!.append("recordAvatar_\(Date().timeIntervalSince1970).mp4")
+            BFLog(message: "开始录制视频到: \(recorderFilePath ?? "")")
+
+            movieOutput = try MovieOutput(URL: URL(fileURLWithPath: recorderFilePath ?? ""), size: videoPixelsSize, liveVideo: true)
+
+            let cropFilter = Crop()
+            let conertFilter = PQCornerFilter()
+
+            cropFilter.cropSizeInPixels = videoPixelsSize
+            cropFilter.locationOfCropInPixels = Position(0, 0)
+
+            camera --> cropFilter --> conertFilter --> movieOutput!
+
+//            camera.audioEncodingTarget = movieOutput
         } catch {
             fatalError("Could not initialize rendering pipeline: \(error)")
         }
@@ -90,9 +107,9 @@ class BFRecordAvatarView: UIView {
     // 打开摄像头
     func openCamera() {
         camera.startCapture()
-//        let filter = SketchFilter()
-        camera.addTarget(renderView, atTargetIndex: 0)
-//        filter.addTarget(renderView, atTargetIndex: 0)
+        let filter = SketchFilter()
+        camera.addTarget(filter, atTargetIndex: 0)
+        filter.addTarget(renderView, atTargetIndex: 0)
     }
 
     // 关闭摄像头
@@ -107,29 +124,12 @@ class BFRecordAvatarView: UIView {
             return
         }
         startRecordeTime = startTime
-        BFLog(message: "开始录制时间:\(CMTimeGetSeconds(startRecordeTime))")
+        BFLog(1, message: "开始录制时间:\(CMTimeGetSeconds(startRecordeTime))")
 
         do {
-            recorderFilePath = recordVideosDirectory
-            if !directoryIsExists(dicPath: recorderFilePath ?? "") {
-                BFLog(message: "文件夹不存在 \(recorderFilePath ?? "")")
-                createDirectory(path: recorderFilePath ?? "")
-            }
-            recorderFilePath!.append("recordAvatar_\(Date().timeIntervalSince1970).mp4")
-            BFLog(message: "开始录制视频到: \(recorderFilePath ?? "")")
-
-            movieOutput = try MovieOutput(URL: URL(fileURLWithPath: recorderFilePath ?? ""), size: videoPixelsSize, liveVideo: true)
-
-            let cropFilter = Crop()
-            let conertFilter = PQCornerFilter()
-
-            cropFilter.cropSizeInPixels = videoPixelsSize
-            cropFilter.locationOfCropInPixels = Position(0, 0)
-
-            camera --> cropFilter --> conertFilter --> movieOutput!
-
-            camera.audioEncodingTarget = movieOutput
+            
             movieOutput!.startRecording()
+            BFLog(1, message: "开始录制时间2:\(Date())")
 
         } catch {
             fatalError("Couldn't initialize movie, error: \(error)")