Quellcode durchsuchen

预览声音设置;
删除按钮显示时刻更新;
UI调整

harry vor 3 Jahren
Ursprung
Commit
76238c531a

+ 0 - 0
BFVideoCompositionManager.swift → BFRecordScreenKit/Classes/BFVideoCompositionManager.swift


+ 71 - 31
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -45,6 +45,9 @@ public class BFRecordScreenController: BFBaseViewController {
             recordBtn.setTitle(isRecording ? "松手 完成" : "按住 说话", for: .normal)
             recordBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#28BE67", alpha: isRecording ? 0.6 : 1)
             playBtn.isSelected = isRecording
+            if !isRecording {
+                BFLog(1, message: "stop")
+            }
         }
     }
 
@@ -79,6 +82,9 @@ public class BFRecordScreenController: BFBaseViewController {
 
     // 保存识别出来的字幕信息,用于回放,和合成使用
 //    var saveSubTitles:[PQEditSubTitleModel] = Array.init()
+    
+    //MARK: - 录音相关
+
     // 定义音频的编码参数
     let recordSettings : [String: Any] = [AVSampleRateKey: 44100.0, // 声音采样率
                                          AVFormatIDKey: kAudioFormatLinearPCM, // 编码格式
@@ -86,7 +92,9 @@ public class BFRecordScreenController: BFBaseViewController {
                                          AVEncoderBitDepthHintKey: 16, // 位深
                                          AVEncoderAudioQualityKey: AVAudioQuality.medium.rawValue] // 音频质量
 
-    //MARK: - 录音相关
+    var haveSpeakVolume : Float = 0
+    var noSpeakVolume : Float = 1
+    
     lazy var recorderManager : BFVoiceRecordManager = {
         let manager = BFVoiceRecordManager()
         manager.cancelRecordHandle = { _ in
@@ -113,9 +121,7 @@ public class BFRecordScreenController: BFBaseViewController {
                     return CMTimeRangeGetIntersection(originRange, otherRange: newRange).duration.seconds > 0
                 }
                 BFLog(1, message: "添加录音文件:\(model.startTime) -- \(model.endTime)")
-                DispatchQueue.main.async {[weak self] in
-                    self?.changeWithDrawBtnLayout(true)
-                }
+                
                 var event = sself.events.last
                 if event != nil {
                     event!.deletedVoices = deletedVoices
@@ -133,7 +139,13 @@ public class BFRecordScreenController: BFBaseViewController {
                     model.endTime = sself.currentAssetProgress.seconds
                     self?.isEndPlay = true
                 }
-                sself.drawOrUpdateRecordProgessLable()
+                DispatchQueue.main.async {[weak self] in
+                    // 录音完,重绘撤销按钮,更新录音按钮,
+                    self?.changeWithDrawBtnLayout(true)
+                    self?.drawOrUpdateRecordProgessLable()
+                    self?.deleteRecordBtn.isHidden = true
+                    self?.recordBtn.isHidden = false
+                }
 
                 sself.currentPlayRecordIndex = -3 // 刚录音完,不需要播放录音
             }
@@ -152,7 +164,7 @@ public class BFRecordScreenController: BFBaseViewController {
     lazy var progreddL : UILabel = {
         let l = UILabel()
         l.textAlignment = .center
-        l.font = UIFont.systemFont(ofSize: 10)
+        l.font = UIFont.systemFont(ofSize: 13)
         l.textColor = .white
         l.shadowColor = .black
         l.shadowOffset = CGSize(width: 1, height: 1)
@@ -187,6 +199,7 @@ public class BFRecordScreenController: BFBaseViewController {
         let btn = UIButton(type: .custom)
         btn.backgroundColor = ThemeStyleColor
         btn.setTitle("按住 说话", for: .normal)
+        btn.addCorner(corner:6)
         btn.adjustsImageWhenHighlighted = false
         btn.addTarget(self, action: #selector(startRecord), for: .touchDown)
         btn.addTarget(self, action: #selector(endRecord), for: .touchUpInside)
@@ -197,9 +210,9 @@ public class BFRecordScreenController: BFBaseViewController {
     lazy var deleteRecordBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.backgroundColor = .red
-        btn.alpha = 0.5
         btn.setTitle("删除录制", for: .normal)
         btn.adjustsImageWhenHighlighted = false
+        btn.addCorner(corner:6)
         btn.addTarget(self, action: #selector(deleteRecorded), for: .touchUpInside)
         btn.isHidden = true
         return btn
@@ -209,7 +222,7 @@ public class BFRecordScreenController: BFBaseViewController {
         let btn = UIButton(type: .custom)
         btn.setImage(imageInRecordScreenKit(by: "withdraw_n"), for: .normal)
         btn.setImage(imageInRecordScreenKit(by: "withdraw_h"), for: .highlighted)
-        btn.setTitle("撤销", for: .normal)
+        btn.setTitle("回退", for: .normal)
         btn.setTitleColor(.white, for: .normal)
         btn.setTitleColor(.gray, for: .highlighted)
         btn.titleLabel?.font = UIFont.systemFont(ofSize: 12)
@@ -317,6 +330,14 @@ public class BFRecordScreenController: BFBaseViewController {
     lazy var audioSettingView : BFAudioSettingView = {
         let audioSettingView = BFAudioSettingView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
         audioSettingView.isHidden = true
+        audioSettingView.haveSpeakSlider.valueIsInt = true
+        audioSettingView.noSpeakSlider.valueIsInt = true
+        audioSettingView.callBack = {[weak self] haveSpeak, noHaveSpeak in
+            BFLog(1, message: "haveSpeak is:\(haveSpeak),noHaveSpeak is:\(noHaveSpeak)")
+            self?.haveSpeakVolume = haveSpeak / 100.0
+            self?.noSpeakVolume = noHaveSpeak / 100.0
+        }
+
         return audioSettingView
     }()
 
@@ -446,10 +467,6 @@ public class BFRecordScreenController: BFBaseViewController {
             BFLog(message: "新录制完成::::\(materialsModel?.locationPath ?? "")")
         }
 
-        audioSettingView.callBack = { haveSpeak, noHaveSpeak in
-
-            BFLog(message: "haveSpeak is\(haveSpeak),noHaveSpeak is\(noHaveSpeak)")
-        }
 
         // 字幕设置回调
         // 设置默认值
@@ -711,7 +728,7 @@ public class BFRecordScreenController: BFBaseViewController {
     }
 
     @objc func deleteRecorded() {
-        if isStopAtRecordRange != -1, isStopAtRecordRange < itemModels[currItemModelIndex].voiceStickers.count {
+        if !isDragingProgressSlder, isStopAtRecordRange != -1, isStopAtRecordRange < itemModels[currItemModelIndex].voiceStickers.count {
             let model = itemModels[currItemModelIndex].voiceStickers[isStopAtRecordRange]
             itemModels[currItemModelIndex].voiceStickers.remove(at: isStopAtRecordRange)
             events.append(WithDrawModel(type: 3, timestamp: currentAssetProgress.seconds, deletedVoices: [(model, isStopAtRecordRange)]))
@@ -724,11 +741,12 @@ public class BFRecordScreenController: BFBaseViewController {
     }
 
     @objc func startRecord() {
-        BFLog(1, message: "start \(UIControl.Event.touchDown)")
+//        BFLog(1, message: "start \(UIControl.Event.touchDown)")
 
         // 停止进度条滚动
-        let point = progressThumV.progressView.contentOffset
-        progressThumV.progressView.setContentOffset(point, animated: false)
+        if isDragingProgressSlder {
+             return
+        }
 
         pause()
         isRecording = true
@@ -740,7 +758,7 @@ public class BFRecordScreenController: BFBaseViewController {
         recorderManager.startRecord(index: 1)
 
         movie?.startProcessing()
-        assetPlayer?.volume = 0
+        assetPlayer?.volume = self.haveSpeakVolume
         assetPlayer?.play()
         isRecording = true
 
@@ -934,11 +952,29 @@ public class BFRecordScreenController: BFBaseViewController {
 
         if elems.count > 0 {
             //  TODO: 停在了录音区间,显示删除按钮
-            deleteRecordBtn.isHidden = false
-            recordBtn.isHidden = true
-
-            isStopAtRecordRange = elems.first!.0
-            BFLog(1, message: "停在了录音区间里 \(isStopAtRecordRange)")
+            if fabs(elems[0].1.endTime - self.currentAssetProgress.seconds) < 0.5 {
+                BFLog(1, message: "吸附在录音结尾")
+                changeWithDrawBtnLayout(false)
+                changeProgress(progress: Float(elems[0].1.endTime / itemModels[currItemModelIndex].materialDuraion))
+                progressThumV.progress = elems[0].1.endTime
+                
+                deleteRecordBtn.isHidden = true
+                recordBtn.isHidden = false
+                isStopAtRecordRange = -1
+                BFLog(1, message: "停在了录音区间外 \(isStopAtRecordRange)")
+            }else {
+                if fabs(elems[0].1.startTime - self.currentAssetProgress.seconds) < 0.5 {
+                    BFLog(1, message: "吸附在录音开始")
+                    changeWithDrawBtnLayout(true)
+                    changeProgress(progress: Float(elems[0].1.startTime / itemModels[currItemModelIndex].materialDuraion))
+                    progressThumV.progress = elems[0].1.startTime
+                }
+                deleteRecordBtn.isHidden = false
+                recordBtn.isHidden = true
+                isStopAtRecordRange = elems.first!.0
+                
+                BFLog(1, message: "停在了录音区间里 \(isStopAtRecordRange)")
+            }
         } else {
             deleteRecordBtn.isHidden = true
             recordBtn.isHidden = false
@@ -1021,6 +1057,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 if let playItem = player.currentItem {
                     NotificationCenter.default.removeObserver(self, name: .AVPlayerItemDidPlayToEndTime, object: playItem)
                     recordPlayer?.replaceCurrentItem(with: newItem)
+                    assetPlayer?.volume = self.noSpeakVolume
                 }
             } else {
                 recordPlayer = AVPlayer(playerItem: newItem)
@@ -1064,7 +1101,7 @@ public class BFRecordScreenController: BFBaseViewController {
                         self?.recordPlayer?.seek(to: CMTime(value: CMTimeValue(second * 1_000_000), timescale: 1_000_000), toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000), completionHandler: { [weak self] finished in
                             if finished, self?.isNormalPlaying ?? false {
                                 self?.recordPlayer?.play()
-
+                                self?.assetPlayer?.volume = self?.haveSpeakVolume ?? 0
                                 BFLog(1, message: "录音开始播放 playing, \(second), \(CMTimeGetSeconds(self?.recordPlayer?.currentItem?.duration ?? .zero)), \(self?.recordPlayer?.currentItem?.currentTime().seconds ?? 0)")
                             }
                         })
@@ -1113,7 +1150,7 @@ public class BFRecordScreenController: BFBaseViewController {
             currentAssetProgress = CMTime.zero
         }
         if itemModels[currItemModelIndex].mediaType == .VIDEO {
-            // assetPlayer?.volume = 0.2
+            assetPlayer?.volume = 1
             movie?.startProcessing()
             assetPlayer?.play()
         } else {
@@ -1224,10 +1261,10 @@ public class BFRecordScreenController: BFBaseViewController {
             //            self?.currentPlayRecordIndex = -1
             if self?.isRecording ?? false {
                 self?.endRecord()
+                cShowHUB(superView: nil, msg: "此视频已录制到头了哦!")
             }
-            DispatchQueue.main.async {[weak self] in
-                self?.recordBtn.isHidden = true
-            }
+            (self?.collectionView.cellForItem(at: IndexPath(item: self!.currItemModelIndex, section: 0)) as? BFImageCoverViewCell)?.playBtn.isSelected = false
+
         }
     }
 
@@ -1241,7 +1278,8 @@ public class BFRecordScreenController: BFBaseViewController {
             if CMTimeGetSeconds(item?.duration ?? CMTime.zero) > 0 {
                 DispatchQueue.main.async { [weak self] in
                     self?.progreddL.text = String(format: "%@", CMTimeGetSeconds(time).formatDurationToHMS())
-                    let su = !(self?.isDragingProgressSlder ?? false) || (self?.isRecording ?? false && self?.isNormalPlaying ?? false)
+                    let su = !(self?.isDragingProgressSlder ?? false) || (self?.isRecording ?? false ) || (self?.isNormalPlaying ?? false)
+                    BFLog(1, message: "进度监控:isDragingProgressSlder-\(self?.isDragingProgressSlder ?? false), isRecording - \(self?.isRecording ?? false), isNormalPlaying - \(self?.isNormalPlaying ?? false), su - \(su)")
                     if su {
                         self?.progressThumV.progress = time.seconds
                     }
@@ -1270,15 +1308,17 @@ public class BFRecordScreenController: BFBaseViewController {
         if recorded {
             withDrawBtn.setTitle("撤销录制", for: .normal)
         }else {
-            withDrawBtn.setTitle("撤销", for: .normal)
+            withDrawBtn.setTitle("回退", for: .normal)
         }
         withDrawBtn.imageEdgeInsets = UIEdgeInsets(top: -withDrawBtn.imageView!.height, left: 0, bottom: 0, right: -withDrawBtn.titleLabel!.width)
         withDrawBtn.titleEdgeInsets = UIEdgeInsets(top: withDrawBtn.titleLabel!.height + 2, left: -withDrawBtn.imageView!.width, bottom: 0, right: 0)
         
         withDrawBtn.setNeedsLayout()
         withDrawBtn.layoutIfNeeded()
+        
     }
 
+    // 通过缩略图进度条控制播放进度
     func changeProgress(progress: Float) {
         if itemModels[currItemModelIndex].mediaType == .VIDEO {
             if let duration = assetPlayer?.currentItem?.duration {
@@ -1286,7 +1326,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 DispatchQueue.main.async { [weak self] in
                     self!.progreddL.text = String(format: "%@", CMTimeGetSeconds(self!.currentAssetProgress).formatDurationToHMS())
                 }
-                assetPlayer!.seek(to: currentAssetProgress, toleranceBefore: CMTime(value: 1, timescale: 1000), toleranceAfter: CMTime(value: 1, timescale: 1000)) { _ in
+                assetPlayer!.seek(to: currentAssetProgress, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000)) { _ in
                 }
             }
         } else {
@@ -1436,7 +1476,7 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
                 let currCell: BFImageCoverViewCell? = collectionView.cellForItem(at: IndexPath(item: page, section: 0)) as? BFImageCoverViewCell
                 setVideoPlay(item: recordItem.playItem, imageView: currCell?.playView)
                 setAudioPlay(item: recordItem.playItem)
-                assetPlayer?.seek(to: .zero, toleranceBefore: CMTime(value: 1, timescale: 1000), toleranceAfter: CMTime(value: 1, timescale: 1000))
+                assetPlayer?.seek(to: .zero, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000))
             }
             if changeItemHandle != nil {
                 changeItemHandle!(page)