Jelajahi Sumber

抛留时间段设置;
多素材准备

harry 3 tahun lalu
induk
melakukan
f6e0c25f68

+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/export_saveall_h.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "export_saveall_h@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

TEMPAT SAMPAH
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/export_saveall_h.imageset/export_saveall_h@3x.png


+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/export_saveall_n.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "export_saveall_n@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

TEMPAT SAMPAH
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/export_saveall_n.imageset/export_saveall_n@3x.png


+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/export_saveonly_h.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "export_saveonly_h@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

TEMPAT SAMPAH
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/export_saveonly_h.imageset/export_saveonly_h@3x.png


+ 21 - 0
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/export_saveonly_n.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "export_saveonly_n@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

TEMPAT SAMPAH
BFRecordScreenKit/Assets/BFRecordScreenKit.xcassets/export_saveonly_n.imageset/export_saveonly_n@3x.png


+ 4 - 3
BFRecordScreenKit/Classes/BFRSComm.swift

@@ -19,6 +19,7 @@ func currentBundle() -> Bundle? {
     return Bundle.current(moduleName: "BFRecordScreenKit", isAssets: false)
 }
 
-func ThemeStyleGreen() -> UIColor {
-    return UIColor.hexColor(hexadecimal: "#28BE67")
-}
+//func ThemeStyleGreen() -> UIColor {
+//    return UIColor.hexColor(hexadecimal: "#28BE67")
+//}
+public var ThemeStyleColor = UIColor.hexColor(hexadecimal: "#28BE67")

+ 102 - 82
BFRecordScreenKit/Classes/BFRecordExport.swift

@@ -15,26 +15,23 @@ import GPUImage
 public class BFRecordExport {
     public var progress : ((Float)->Void)?
     public var exportCompletion : ((Error?, URL?)->Void)?
-    
-    // 视频素材
-    public var asset:AVURLAsset?
-    
-    // 录音段
-    public var voiceList:[PQVoiceModel]? {
-        didSet {
-//            audioAssets = voiceList?.map({ model in
-//                AVURLAsset(url: URL(fileURLWithPath: model.wavFilePath))
-//            })
-            
+        
+    public var data:[BFRecordItemModel]? {
+        didSet{
+            if data?.count ?? 0 > 0 {
+                for item in data! {
+                    item.generationTimeRanges()
+                }
+            }
         }
     }
 
     var count = 0
     
-    var audioAssets : [AVURLAsset]?
+    var stickerRanges = [CMTimeRange]()
     
     var exporter : PQCompositionExporter?
-    var mStickers = [PQEditVisionTrackMaterialsModel]()
+//    var mStickers = [PQEditVisionTrackMaterialsModel]()
     
     deinit {
     }
@@ -42,22 +39,49 @@ public class BFRecordExport {
 
     
     //MARK: -
-    public func startExprot(){
+    public func prepareData(){
+        if let data = data, data.count > 0{
+            _ = generationTimeRanges(voiceStickers: data.first!.voiceStickers)
+        }
+    }
+
+    /// synthesisAll: 合成所有还是只合成录音部分
+    public func startExprot(synthesisAll:Bool){
         // 1,背景视频素材
-        let bgMovieInfo: PQEditVisionTrackMaterialsModel = PQEditVisionTrackMaterialsModel()
-        bgMovieInfo.type = StickerType.VIDEO.rawValue
-        bgMovieInfo.locationPath = ((asset?.url.absoluteString)?.removingPercentEncoding ?? "").replacingOccurrences(of: "file://", with: "")
-        bgMovieInfo.timelineIn = 0
-        bgMovieInfo.timelineOut = CMTimeGetSeconds(asset?.duration ?? CMTime.zero)
-        bgMovieInfo.model_in = bgMovieInfo.timelineIn
-        bgMovieInfo.out = bgMovieInfo.timelineOut
-        bgMovieInfo.canvasFillType = stickerContentMode.aspectFitStr.rawValue
-        bgMovieInfo.volumeGain = 30
-        bgMovieInfo.aptDuration = bgMovieInfo.timelineOut
-        bgMovieInfo.duration = bgMovieInfo.timelineOut
-        mStickers.append(bgMovieInfo)
-    
-        beginExport(videoStickers: mStickers)
+        if let itemModels = data {
+            var totalDur = 0.0
+            for (index, itemModel) in itemModels.enumerated() {
+                let asset = itemModel.baseMaterial
+                if let dur = asset?.duration.seconds {
+                    if synthesisAll {
+                        let bgMovieInfo = splitBaseMaterial(range: CMTimeRange(start: CMTime(seconds: totalDur*100, preferredTimescale: 100), duration: CMTime(seconds: dur*100, preferredTimescale: 100)))
+                        itemModel.videoStickers.append(bgMovieInfo)
+                        totalDur += dur
+                    } else {
+                        var subDur = 0.0
+                        for range in itemModel.dealedDurationRanges {
+                            let sticker = splitBaseMaterial(range: CMTimeRange(start: CMTime(seconds: (totalDur + subDur) * 100, preferredTimescale: 100), duration: CMTime(seconds: range.duration.seconds * 100, preferredTimescale: 100)))
+                            sticker.volumeGain = 0
+                            itemModel.videoStickers.append(sticker)
+                            subDur += range.start.seconds
+                        }
+                        totalDur += subDur
+                    }
+                }
+//                let bgMovieInfo: PQEditVisionTrackMaterialsModel = PQEditVisionTrackMaterialsModel()
+//                bgMovieInfo.type = StickerType.VIDEO.rawValue
+//                bgMovieInfo.locationPath = ((asset?.url.absoluteString)?.removingPercentEncoding ?? "").replacingOccurrences(of: "file://", with: "")
+//                bgMovieInfo.timelineIn = 0
+//                bgMovieInfo.timelineOut = CMTimeGetSeconds(asset?.duration ?? CMTime.zero)
+//                bgMovieInfo.model_in = bgMovieInfo.timelineIn
+//                bgMovieInfo.out = bgMovieInfo.timelineOut
+//                bgMovieInfo.canvasFillType = stickerContentMode.aspectFitStr.rawValue
+//                bgMovieInfo.volumeGain = 30
+//                bgMovieInfo.aptDuration = bgMovieInfo.timelineOut
+//                bgMovieInfo.duration = bgMovieInfo.timelineOut
+                beginExport()
+            }
+        }
     }
     
     public func cancelExport(){
@@ -78,39 +102,42 @@ public class BFRecordExport {
         
     }
     
-    func exprotVideo(){
-//        //重新创建GPUImageMovie用于保存
-//           saveMovie = [[GPUImageMovie alloc] initWithURL:self.pathURL];
-        let saveFilter = GPUImageFilter()
-        let saveMovie = GPUImageMovie(url: asset?.url)
-        saveMovie?.shouldRepeat = false
-        saveMovie?.addTarget(saveFilter)
-        
-        let filePath = getOutputFilePath()
-        let savewrite = GPUImageMovieWriter(movieURL: getOutputFilePath(), size: getVideoSize())
-        savewrite?.shouldPassthroughAudio = true
-        savewrite?.encodingLiveVideo = true
-        saveFilter.addTarget(savewrite)
+    func generationTimeRanges(voiceStickers:[PQVoiceModel]) -> [CMTimeRange]{
         
-        saveMovie?.enableSynchronizedEncoding(using: savewrite)
-//        saveMovie?.audioEncodingTarget = savewrite
-        savewrite?.startRecording()
-        saveMovie?.startProcessing()
-        savewrite?.completionBlock = {
-            DispatchQueue.main.async { [weak self, weak savewrite] in
-                saveFilter.removeTarget(savewrite)
-                savewrite?.finishRecording()
-                saveMovie?.cancelProcessing()
-                saveMovie?.removeTarget(saveFilter)
-                cShowHUB(superView: nil, msg: "合成成功")
-                self?.exportCompletion?(nil, filePath)
-                self?.saveVideoToPhoto(url: filePath)
+        var ranges = [CMTimeRange]()
+        var start : Double = 0
+        for model in voiceStickers {
+            if model.startTime > start{
+                let range = CMTimeRange(start: CMTime(seconds: start, preferredTimescale: 100), duration: CMTime(seconds: model.startTime - start, preferredTimescale: 100))
+                ranges.append(range)
+                
             }
+            ranges.append(CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 100), end: CMTime(seconds: model.endTime, preferredTimescale: 100)))
+            start = model.endTime
         }
+        
+        return ranges
+    }
+    
+    func splitBaseMaterial(range:CMTimeRange) -> PQEditVisionTrackMaterialsModel{
+        let bgMovieInfo: PQEditVisionTrackMaterialsModel = PQEditVisionTrackMaterialsModel()
+        if let asset = data?.first?.baseMaterial {
+            bgMovieInfo.type = StickerType.VIDEO.rawValue
+            bgMovieInfo.locationPath = ((asset.url.absoluteString).removingPercentEncoding ?? "").replacingOccurrences(of: "file://", with: "")
+            bgMovieInfo.timelineIn = range.start.seconds
+            bgMovieInfo.timelineOut = range.end.seconds
+            bgMovieInfo.model_in = bgMovieInfo.timelineIn
+            bgMovieInfo.out = bgMovieInfo.timelineOut
+            bgMovieInfo.canvasFillType = stickerContentMode.aspectFitStr.rawValue
+            bgMovieInfo.volumeGain = 1
+            bgMovieInfo.aptDuration = bgMovieInfo.timelineOut
+            bgMovieInfo.duration = bgMovieInfo.timelineOut
+        }
+        
+        return bgMovieInfo
     }
-
     
-    func beginExport(videoStickers:[PQEditVisionTrackMaterialsModel]) {
+    func beginExport() {
         // 输出视频地址
 //        exprotVideo()
 //        return;
@@ -122,29 +149,18 @@ public class BFRecordExport {
         let outPutMP4URL = URL(fileURLWithPath: outPutMP4Path)
         BFLog(1, message: "导出视频地址 \(outPutMP4URL)")
         
+        guard let itemModel = data?.first else {
+            return
+        }
         // 处理导出
-        if (voiceList?.count ?? 0 ) > 0 || videoStickers.count > 1 {
-//            var audioUrl:URL?
-//            if audioAsset?.count ?? 0 > 0 {
-//                // 多音频合成
-//                if let list = voiceList?.map({ model in
-//                    URL(fileURLWithPath: model.wavFilePath)
-//                }){
-//                    if list.count == 1 {
-//                        audioUrl = list.first
-//                    }else {
-//                        let semaphore = DispatchSemaphore(value: 0)
-//                        PQPlayerViewModel.mergeAudios(urls: list) { completURL in
-//                            audioUrl = completURL
-//                            semaphore.signal()
-//                        }
-//                        _ = semaphore.wait(timeout: .now() + 5)
-//                    }
-//                }
-//            }
+        let voiceList = itemModel.voiceStickers
+        let videoStickers = itemModel.videoStickers
+        
+        if voiceList.count > 0 || videoStickers.count > 1 {
+
             let (audioMix, composition) = mergeAudio(videoStickers: videoStickers, audios: voiceList)
             
-            let filter = mStickers.map { sticker in
+            let filter = videoStickers.map { sticker in
                 PQMovieFilter(movieSticker: sticker)
             }
             // 有
@@ -162,10 +178,12 @@ public class BFRecordExport {
 //            }
             exporter = PQCompositionExporter(asset: composition, videoComposition: nil, audioMix: audioMix, filters: filter, animationTool: nil, exportURL: outPutMP4URL)
             
-            let size = getVideoSize()
+            let asset = data?.first?.baseMaterial
+
+            let size = getVideoSize(asset: asset!)
             var orgeBitRate = Int(size.width * size.height * 3)
             
-            for stick in mStickers {
+            for stick in videoStickers {
                 if stick.type == StickerType.VIDEO.rawValue {
                     let asset = AVURLAsset(url: URL(fileURLWithPath: stick.locationPath), options: avAssertOptions)
                     
@@ -208,7 +226,9 @@ public class BFRecordExport {
             }
         } else {
             // 没有处理,直接copy原文件
-            self.exportCompletion?(nil, self.asset?.url)
+            if let ass = data?.first?.baseMaterial{
+                self.exportCompletion?(nil, ass.url)
+            }
         }
 
     }
@@ -233,9 +253,9 @@ public class BFRecordExport {
 //        })
     }
     
-    func getVideoSize() -> CGSize{
+    func getVideoSize(asset:AVURLAsset) -> CGSize{
         var size = CGSize.zero
-        self.asset?.tracks.forEach({ track in
+        asset.tracks.forEach({ track in
             if track.mediaType == .video{
                 let realSize = __CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform)
                 size = CGSize(width: ceil(abs(realSize.width)), height: ceil(abs(realSize.height)))
@@ -259,7 +279,7 @@ extension BFRecordExport {
                 BFLog(message: "音频音量 为0 不添加")
                 continue
             }
-            sticker.volumeGain = 2
+            sticker.volumeGain = 50
             totalDuration = max(totalDuration, sticker.duration)
             tempParameters += PQVideoEditViewModel.dealWithMaterialTrack(stickerModel: sticker, composition: composition)
         }

+ 18 - 1
BFRecordScreenKit/Classes/BFRecordItemModel.swift

@@ -11,10 +11,27 @@ import BFFramework
 
 public class BFRecordItemModel: NSObject {
     var baseMaterial : AVURLAsset?
-    var dealDurationRanges = [CMTimeRange]()
+    var dealedDurationRanges = [CMTimeRange]()
     public var voiceStickers = [PQVoiceModel]()
     public var videoStickers = [PQEditVisionTrackMaterialsModel]()
     public var imageStickers = [PQEditVisionTrackMaterialsModel]()
     public var titleStickers = [PQEditSubTitleModel]()
     public var index = 0
+    public var width = 0
+    public var height = 0
+    
+    func generationTimeRanges() {
+        
+//        var start : Double = 0
+        for model in voiceStickers {
+//            if model.startTime > start{
+//                let range = CMTimeRange(start: CMTime(seconds: start, preferredTimescale: 100), duration: CMTime(seconds: model.startTime - start, preferredTimescale: 100))
+//                dealedDurationRanges.append(range)
+//
+//            }
+            dealedDurationRanges.append(CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 100), end: CMTime(seconds: model.endTime, preferredTimescale: 100)))
+//            start = model.endTime
+        }
+        
+    }
 }

+ 56 - 41
BFRecordScreenKit/Classes/BFRecordScreenController.swift

@@ -54,7 +54,7 @@ public class BFRecordScreenController: BFBaseViewController {
     var movie :GPUImageMovie?       // 视频预览
     var playView :GPUImageView?     // 视频展示视图
     var isDragingProgressSlder : Bool = false // 是否在拖动进度条
-    
+    var isStopAtRecordRange = -1
     //定义音频的编码参数
     let recordSettings:[String : Any] = [AVSampleRateKey : 44100.0, //声音采样率
                             AVFormatIDKey : kAudioFormatLinearPCM,  //编码格式
@@ -137,7 +137,7 @@ public class BFRecordScreenController: BFBaseViewController {
     
     lazy var recordBtn:UIButton = {
         let btn = UIButton(type: .custom)
-        btn.backgroundColor = ThemeStyleGreen()
+        btn.backgroundColor = ThemeStyleColor
         btn.setTitle("按住 说话", for: .normal)
         btn.adjustsImageWhenHighlighted = false
         btn.addTarget(self, action: #selector(startRecord), for: .touchDown)
@@ -172,7 +172,7 @@ public class BFRecordScreenController: BFBaseViewController {
         btn.setImage(imageInRecordScreenKit(by: "changeVoice_h"), for: .highlighted)
         btn.setTitle("变声", for: .normal)
         btn.setTitleColor(.white, for: .normal)
-        btn.setTitleColor(ThemeStyleGreen(), for: .highlighted)
+        btn.setTitleColor(ThemeStyleColor, for: .highlighted)
         btn.titleLabel?.font = UIFont.systemFont(ofSize: 12)
         btn.contentVerticalAlignment = UIControl.ContentVerticalAlignment.center;
         btn.addTarget(self, action: #selector(changeVoiceAction), for: .touchUpInside)
@@ -204,8 +204,8 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
                 if sself.isNormalPlaying || sself.isRecording {
                     sself.pause()
-                    sself.isDragingProgressSlder = true
                 }
+                sself.isDragingProgressSlder = true
                 sself.changeProgress(progress: process)
             }
         }
@@ -214,11 +214,7 @@ public class BFRecordScreenController: BFBaseViewController {
             guard let sself = self else {
                 return
             }
-            sself.changeProgress(progress: process)
-
-            sself.isDragingProgressSlder = false
-            sself.currentPlayRecordIndex = -1
-            sself.hadPrepareToPlayRecord = false
+            sself.thumbViewEnded(progress: process)
         }
         vv.isHidden = true
         return vv
@@ -421,12 +417,18 @@ public class BFRecordScreenController: BFBaseViewController {
     }
     
     @objc func playVideo(btn:UIButton){
-        btn.isSelected ? pause() : play()
+        if btn.isSelected {
+            pause()
+            searchStopAtRecordRange()
+        }else {
+            play()
+        }
     }
 
     @objc func sliderTouchBegan(sender _: UISlider) {
         isDragingProgressSlder = true
         pause()
+
     }
 
     @objc func sliderTouchEnded(sender: UISlider) {
@@ -437,7 +439,30 @@ public class BFRecordScreenController: BFBaseViewController {
     }
     @objc func sliderValueDidChanged(sender: UISlider) {
         changeProgress(progress: sender.value)
-
+    }
+    
+    func thumbViewEnded(progress:Float) {
+        changeProgress(progress: progress)
+        isDragingProgressSlder = false
+        currentPlayRecordIndex = -1
+        hadPrepareToPlayRecord = false
+        
+        searchStopAtRecordRange()
+    }
+    
+    func searchStopAtRecordRange() {
+        // TODO: 判断是否停止录音区间,是则删除相关录音,画笔,头像,字幕
+        let elems = itemModels[currItemModelIndex].voiceStickers.enumerated().filter({ elem in
+            elem.1.startTime <= self.currentAssetProgress.seconds && elem.1.endTime > self.currentAssetProgress.seconds
+        })
+        if elems.count > 0{
+            //  TODO: 停在了录音区间,显示删除按钮
+            isStopAtRecordRange = elems.first!.0
+            BFLog(1, message: "停在了录音区间 里")
+        }else {
+            isStopAtRecordRange = -1
+            BFLog(1, message: "停在了录音区间 外")
+        }
     }
     
     // MARK: - 权限申请
@@ -535,7 +560,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 if currentPlayRecordIndex == -1 && self.isNormalPlaying{
                     let second = CMTimeGetSeconds(currentT) - recordedAudio.startTime
                     DispatchQueue.main.async {[weak self] in
-                        self?.recordPlayer?.seek(to: CMTime(value: CMTimeValue(second), timescale: 100), toleranceBefore: CMTime(value: 1, timescale: 1000), toleranceAfter: CMTime(value: 1, timescale: 1000), completionHandler: {[weak self] finished in
+                        self?.recordPlayer?.seek(to: CMTime(value: CMTimeValue(second), timescale: 100), toleranceBefore: CMTime(value: 1, timescale: 1000000), toleranceAfter: CMTime(value: 1, timescale: 1000000), completionHandler: {[weak self] finished in
                             if finished && (self?.isNormalPlaying ?? false) {
                                 self?.recordPlayer?.play()
                                 BFLog(1, message: "录音开始播放 playing, \(second), \(CMTimeGetSeconds(self?.recordPlayer?.currentItem?.duration ?? .zero))")
@@ -584,7 +609,7 @@ public class BFRecordScreenController: BFBaseViewController {
         assetPlayer?.pause()
         recordPlayer?.pause()
         
-        assetPlayer?.seek(to: self.currentAssetProgress , toleranceBefore: CMTime(value: 1, timescale: 1000), toleranceAfter: CMTime(value: 1, timescale: 1000), completionHandler: { finished in
+        assetPlayer?.seek(to: self.currentAssetProgress , toleranceBefore: CMTime(value: 1, timescale: 1000000), toleranceAfter: CMTime(value: 1, timescale: 1000000), completionHandler: { finished in
         })
     }
     
@@ -596,6 +621,9 @@ public class BFRecordScreenController: BFBaseViewController {
             for (index, asset) in self.assets.enumerated() {
                 let itemModel = BFRecordItemModel()
                 itemModel.index = 0
+                itemModel.width = asset.pixelWidth
+                itemModel.height = asset.pixelHeight
+                
                 itemModels.append(itemModel)
                 
                 let options = PHVideoRequestOptions()
@@ -672,21 +700,24 @@ public class BFRecordScreenController: BFBaseViewController {
             assetPlayer = AVPlayer(playerItem: item)
             avplayerTimeObserver = assetPlayer?.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 100), queue: DispatchQueue.global()) {[weak self] time in
              //    进度监控
-                if !((self?.isNormalPlaying ?? false) || (self?.isRecording ?? false)) {
-                    return
-                }
                 
-                // 播放对应的录音音频
-                self?.playRecord(at: time)
-
                 self?.currentAssetProgress = time
                 BFLog(1, message: "curr:\(CMTimeGetSeconds(time))")
-                if CMTimeGetSeconds(item.duration) > 0, !(self?.isDragingProgressSlder ?? false) {
+                if CMTimeGetSeconds(item.duration) > 0 {
                     DispatchQueue.main.async { [weak self] in
                         self?.progreddL.text = String(format: "%.2f", CMTimeGetSeconds(time), CMTimeGetSeconds(item.duration))
-                        self?.progressThumV.progress = time.seconds
+                        if !(self?.isDragingProgressSlder ?? false){
+                            self?.progressThumV.progress = time.seconds
+                        }
                     }
                 }
+                
+                if (self?.isNormalPlaying ?? false) || (self?.isRecording ?? false) {
+                    // 播放对应的录音音频
+                    self?.playRecord(at: time)
+                }
+                
+
             } as? NSKeyValueObservation
         }
 
@@ -695,6 +726,8 @@ public class BFRecordScreenController: BFBaseViewController {
             BFLog(1, message: "AVPlayerItemDidPlayToEndTime = \(notify)")
             self?.isNormalPlaying = false
             self?.assetPlayer?.seek(to: CMTime.zero)
+            self?.progressThumV.progress = 0
+            
             self?.currentPlayRecordIndex = -1
             if self?.isRecording ?? false {
                 self?.endRecord()
@@ -716,24 +749,6 @@ public class BFRecordScreenController: BFBaseViewController {
         
     }
     
-    func generationTimeRanges() -> [CMTimeRange]{
-        
-        var ranges = [CMTimeRange]()
-        var start : Double = 0
-        for model in itemModels[currItemModelIndex].voiceStickers {
-            if model.startTime > start{
-                let range = CMTimeRange(start: CMTime(seconds: start, preferredTimescale: 100), duration: CMTime(seconds: model.startTime - start, preferredTimescale: 100))
-                ranges.append(range)
-                
-            }
-            ranges.append(CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 100), end: CMTime(seconds: model.endTime, preferredTimescale: 100)))
-            start = model.endTime
-        }
-        
-        return ranges
-    }
-    
-    
     //MARK: - 录音对应图像绘制
     
     func changeProgress(progress:Float) {
@@ -743,7 +758,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 self!.progreddL.text = String(format: "%.2f", CMTimeGetSeconds(self!.currentAssetProgress))
             }
 
-            assetPlayer!.seek(to: self.currentAssetProgress, toleranceBefore: CMTime(value: 1, timescale: 1000), toleranceAfter: CMTime(value: 1, timescale: 1000)) { finished in
+            assetPlayer!.seek(to: self.currentAssetProgress, toleranceBefore: CMTime(value: 1, timescale: 1000000), toleranceAfter: CMTime(value: 1, timescale: 1000000)) { finished in
 
             }
         }
@@ -763,7 +778,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 let height = sself.progressThumV.progessIndicateBackV.height
                 sself.itemModels[sself.currItemModelIndex].voiceStickers.forEach { model in
                     let lineV = UIView(frame: CGRect(x: model.startTime * width / totalDur , y: 0, width: (model.endTime - model.startTime) * width / totalDur, height: height))
-                    lineV.backgroundColor = ThemeStyleGreen()
+                    lineV.backgroundColor = ThemeStyleColor
                     sself.progressThumV.progessIndicateBackV.addSubview(lineV)
                 }
             }