Kaynağa Gözat

素材切换时实时修改进度缩略图

harry 3 yıl önce
ebeveyn
işleme
34cfe071c2

+ 1 - 0
BFRecordScreenKit/Classes/BFRecordItemModel.swift

@@ -29,6 +29,7 @@ public class BFRecordItemModel: NSObject {
     public var imageStickers = [PQEditVisionTrackMaterialsModel]() //
     public var titleStickers = [PQEditSubTitleModel]() // 字幕贴纸
     public var coverImg: UIImage? // 封面图
+    public var thumbImgs = [UIImage]() // 缩略图集合
     public var playItem: AVPlayerItem? // 视频playerItem
     public var videoAsset: AVURLAsset? // 视频Asset
     public var mediaType: StickerType? // 素材类型

+ 29 - 29
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -67,34 +67,33 @@ public class BFRecordScreenController: BFBaseViewController {
     var assetPlayer: AVPlayer? // 原视频音频播放器
     var isCompletePlay = true
     var hadPrepareToPlayRecord = false // 录音播放器准备
-    var recordPlayer: AVPlayer? // 录音音频播放器
-    var movie: GPUImageMovie? // 视频预览
-    var playView: GPUImageView? // 视频展示视图
+    var recordPlayer : AVPlayer? // 录音音频播放器
+    var movie : GPUImageMovie? // 视频预览
+    var playView : GPUImageView? // 视频展示视图
 
     // MARK: 行为参数
 
     var events = [WithDrawModel]() // 行为记录,方便撤销
-    var isDragingProgressSlder: Bool = false // 是否在拖动进度条
+    var isDragingProgressSlder : Bool = false // 是否在拖动进度条
     var isStopAtRecordRange = -1
 
     // 保存识别出来的字幕信息,用于回放,和合成使用
 //    var saveSubTitles:[PQEditSubTitleModel] = Array.init()
     // 定义音频的编码参数
-    let recordSettings: [String: Any] = [AVSampleRateKey: 44100.0, // 声音采样率
+    let recordSettings : [String: Any] = [AVSampleRateKey: 44100.0, // 声音采样率
                                          AVFormatIDKey: kAudioFormatLinearPCM, // 编码格式
                                          AVNumberOfChannelsKey: 1, // 采集音轨
                                          AVEncoderBitDepthHintKey: 16, // 位深
                                          AVEncoderAudioQualityKey: AVAudioQuality.medium.rawValue] // 音频质量
 
-    // 录音相关
-    lazy var recorderManager: BFVoiceRecordManager = {
+    //MARK: - 录音相关
+    lazy var recorderManager : BFVoiceRecordManager = {
         let manager = BFVoiceRecordManager()
         manager.cancelRecordHandle = { _ in
         }
         manager.endRecordHandle = { [weak self] model, _ in
             if let sself = self, let model = model, FileManager.default.fileExists(atPath: model.wavFilePath ?? "") {
                 // 加入到语音数组里
-                // TODO: 原逻辑要删除新录音后边的数据, 新逻辑是覆盖则删除
                 model.endTime = sself.currentAssetProgress.seconds
 
                 let newRange = CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 1000), end: CMTime(seconds: model.endTime, preferredTimescale: 1000))
@@ -151,7 +150,7 @@ public class BFRecordScreenController: BFBaseViewController {
 
     var indirectionView: BFIndirectionProgressView?
     
-    lazy var progreddL: UILabel = {
+    lazy var progreddL : UILabel = {
         let l = UILabel()
         l.textAlignment = .center
         l.font = UIFont.systemFont(ofSize: 10)
@@ -162,7 +161,7 @@ public class BFRecordScreenController: BFBaseViewController {
         return l
     }()
 
-    lazy var playBtn: UIButton = {
+    lazy var playBtn : UIButton = {
         let btn = UIButton(frame: view.bounds)
         btn.setImage(imageInRecordScreenKit(by: "preview_play"), for: .normal)
         let vv = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
@@ -171,7 +170,7 @@ public class BFRecordScreenController: BFBaseViewController {
         return btn
     }()
 
-    lazy var bottomeView: UIImageView = {
+    lazy var bottomeView : UIImageView = {
         let iv = UIImageView(image: imageInRecordScreenKit(by: "bottom_shadow"))
         iv.contentMode = .scaleAspectFill
         iv.isUserInteractionEnabled = true
@@ -185,7 +184,7 @@ public class BFRecordScreenController: BFBaseViewController {
         return iv
     }()
 
-    lazy var recordBtn: UIButton = {
+    lazy var recordBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.backgroundColor = ThemeStyleColor
         btn.setTitle("按住 说话", for: .normal)
@@ -196,7 +195,7 @@ public class BFRecordScreenController: BFBaseViewController {
         return btn
     }()
 
-    lazy var deleteRecordBtn: UIButton = {
+    lazy var deleteRecordBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.backgroundColor = .red
         btn.alpha = 0.5
@@ -207,7 +206,7 @@ public class BFRecordScreenController: BFBaseViewController {
         return btn
     }()
 
-    lazy var withDrawBtn: UIButton = {
+    lazy var withDrawBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.setImage(imageInRecordScreenKit(by: "withdraw_n"), for: .normal)
         btn.setImage(imageInRecordScreenKit(by: "withdraw_h"), for: .highlighted)
@@ -220,7 +219,7 @@ public class BFRecordScreenController: BFBaseViewController {
         return btn
     }()
 
-    lazy var changeVoiceBtn: UIButton = {
+    lazy var changeVoiceBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.setImage(imageInRecordScreenKit(by: "changeVoice_n"), for: .normal)
         btn.setImage(imageInRecordScreenKit(by: "changeVoice_h"), for: .highlighted)
@@ -233,7 +232,7 @@ public class BFRecordScreenController: BFBaseViewController {
         return btn
     }()
 
-    lazy var toolV: BFIntroduceToolView = {
+    lazy var toolV : BFIntroduceToolView = {
         let toolV = BFIntroduceToolView()
         toolV.centerY = view.centerY
 
@@ -250,14 +249,14 @@ public class BFRecordScreenController: BFBaseViewController {
     }()
 
     // 头像  add by ak
-    lazy var avatarView: BFRecordAvatarView = {
+    lazy var avatarView : BFRecordAvatarView = {
         let avatarView = BFRecordAvatarView(frame: CGRect(x: 10, y: 10, width: 120, height: 120))
         avatarView.isHidden = true
         return avatarView
     }()
 
     // 打开摄像头
-    lazy var openCameraBtn: UIButton = {
+    lazy var openCameraBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.setImage(imageInRecordScreenKit(by: "openCamera"), for: .normal)
         btn.addTarget(self, action: #selector(openCamera), for: .touchUpInside)
@@ -265,7 +264,7 @@ public class BFRecordScreenController: BFBaseViewController {
     }()
 
     // 画笔
-    lazy var drawPinBtn: UIButton = {
+    lazy var drawPinBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.setImage(imageInRecordScreenKit(by: "drawPin"), for: .normal)
         btn.addTarget(self, action: #selector(drawPin), for: .touchUpInside)
@@ -273,7 +272,7 @@ public class BFRecordScreenController: BFBaseViewController {
     }()
 
     // 字幕设置
-    lazy var subtitleBtn: UIButton = {
+    lazy var subtitleBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.setImage(imageInRecordScreenKit(by: "subtitleBtn"), for: .normal)
         btn.addTarget(self, action: #selector(subTitleClick), for: .touchUpInside)
@@ -281,7 +280,7 @@ public class BFRecordScreenController: BFBaseViewController {
     }()
 
     // 声音设置
-    lazy var soundSettingBtn: UIButton = {
+    lazy var soundSettingBtn : UIButton = {
         let btn = UIButton(type: .custom)
         btn.setImage(imageInRecordScreenKit(by: "soundBtn"), for: .normal)
         btn.addTarget(self, action: #selector(soundSetting), for: .touchUpInside)
@@ -289,14 +288,14 @@ public class BFRecordScreenController: BFBaseViewController {
     }()
 
     // 字幕设置面板
-    lazy var subtitleSettingView: BFSubtitleSettingView = {
+    lazy var subtitleSettingView : BFSubtitleSettingView = {
         let subtitleSetting = BFSubtitleSettingView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
         subtitleSetting.isHidden = true
         return subtitleSetting
     }()
 
     // 编辑字幕
-    lazy var subtitleEditView: BFSubtitleEditView = {
+    lazy var subtitleEditView : BFSubtitleEditView = {
         let subtitleEditView = BFSubtitleEditView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
         subtitleEditView.isHidden = true
 
@@ -304,7 +303,7 @@ public class BFRecordScreenController: BFBaseViewController {
     }()
 
     // 显示字幕
-    lazy var subtitleLabel: PQSubTitleLabel = {
+    lazy var subtitleLabel : PQSubTitleLabel = {
         let subtitleLabel = PQSubTitleLabel()
         subtitleLabel.textAlignment = .center
         subtitleLabel.numberOfLines = 0
@@ -316,16 +315,16 @@ public class BFRecordScreenController: BFBaseViewController {
     }()
 
     // 音量设置
-    lazy var audioSettingView: BFAudioSettingView = {
+    lazy var audioSettingView : BFAudioSettingView = {
         let audioSettingView = BFAudioSettingView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
         audioSettingView.isHidden = true
         return audioSettingView
     }()
 
     // 录音识别文字
-    var speechTranscriberUtil: PQSpeechTranscriberUtil?
+    var speechTranscriberUtil : PQSpeechTranscriberUtil?
 
-    lazy var progressThumV: BFVideoThumbProgressView = {
+    lazy var progressThumV : BFVideoThumbProgressView = {
         let vv = BFVideoThumbProgressView(frame: CGRect(x: 0, y: 54, width: cScreenWidth, height: 50))
         vv.dragStartHandle = { [weak self] in
             self?.isDragingProgressSlder = true
@@ -357,7 +356,7 @@ public class BFRecordScreenController: BFBaseViewController {
         return vv
     }()
 
-    lazy var collectionView: UICollectionView = {
+    lazy var collectionView : UICollectionView = {
         let flowLayout = UICollectionViewFlowLayout()
         flowLayout.minimumLineSpacing = 0
         flowLayout.minimumInteritemSpacing = 0
@@ -1431,8 +1430,9 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
             progressThumV.isHidden = false
             if recordItem.mediaType == .VIDEO {
                 let currCell: BFImageCoverViewCell? = collectionView.cellForItem(at: IndexPath(item: currItemModelIndex, section: 0)) as? BFImageCoverViewCell
-                setAudioPlay(item: recordItem.playItem)
                 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))
             }
             if changeItemHandle != nil {
                 changeItemHandle!(currItemModelIndex)

+ 13 - 6
BFRecordScreenKit/Classes/RecordScreen/View/BFVideoThumbProgressView.swift

@@ -94,10 +94,17 @@ class BFVideoThumbProgressView: UIView {
         guard let videoAsset = recordItem?.videoAsset else {
             return
         }
+        self.addThumbImages(images: recordItem!.thumbImgs)
+        if recordItem!.thumbImgs.count > 0{
+            return
+        }
+        
         let dur = videoAsset.duration.seconds
         if dur > 0 {
             let fps = Double(fetchThumbStrategy.frameNumberOfVideo(assetDuration: dur)) / dur
             splitVideoFileUrlFps(urlAsset: videoAsset, fps: fps) { [weak self] images in
+                self?.recordItem!.thumbImgs.removeAll()
+                self?.recordItem!.thumbImgs.append(contentsOf: images)
                 self?.addThumbImages(images: images)
             }
         }
@@ -114,12 +121,12 @@ class BFVideoThumbProgressView: UIView {
     /// 添加缩略图
     /// - Parameter images: <#images description#>
     func addThumbImages(images: [UIImage]) {
-        if images.count > 0 {
-            thumbImgs = images
-            DispatchQueue.main.async { [weak self] in
-                self?.progressView.contentView.subviews.forEach { subview in
-                    subview.removeFromSuperview()
-                }
+        DispatchQueue.main.async { [weak self] in
+            self?.progressView.contentView.subviews.forEach { subview in
+                subview.removeFromSuperview()
+            }
+            if images.count > 0 {
+                self?.thumbImgs = images
                 if let sself = self {
                     var lastiv = UIImageView()
                     for (i, img) in images.enumerated() {