Pārlūkot izejas kodu

优化缩略图展示速度

harry 3 gadi atpakaļ
vecāks
revīzija
7ddfabd6a5

+ 10 - 10
BFRecordScreenKit/Classes/BFVideoThumbImageFetchHelper.swift

@@ -12,20 +12,15 @@ import Foundation
 /// 视频分解成帧
 /// - parameter fileUrl                 : 视频地址
 /// - parameter fps                          : 自定义帧数 每秒内取的帧数
-/// - parameter range                     : 获取其中几张连续视频帧
+/// - parameter firstImagesCount             : 获取首先N张连续视频帧后先返回给调用方使用作为缓冲
 /// - parameter splitCompleteClosure    : 回调
-func splitVideoFileUrlFps(urlAsset: AVURLAsset, fps: Double, range: NSRange? = nil, splitCompleteClosure: @escaping (([UIImage]) -> Void)) {
+func splitVideoFileUrlFps(urlAsset: AVURLAsset, fps: Double, firstImagesCount:Int = 0, splitCompleteClosure: @escaping ((Bool, [UIImage]) -> Void)) {
     var splitImages = [UIImage]()
 
     var times = [NSValue]()
 
-    var start = 0
-    var end = Int(urlAsset.duration.seconds * Float64(fps))
-
-    if range != nil {
-        start = min(range!.location, end)
-        end = min(start + range!.length, end)
-    }
+    let start = 0
+    let end = Int(urlAsset.duration.seconds * Float64(fps))
 
     for i in start...end {
         let timeValue = NSValue(time: CMTimeMake(value: Int64(i * 1000), timescale: Int32(fps * 1000)))
@@ -56,8 +51,13 @@ func splitVideoFileUrlFps(urlAsset: AVURLAsset, fps: Double, range: NSRange? = n
         @unknown default:
             break
         }
+        
+        if cocu == firstImagesCount {
+            splitCompleteClosure(false, splitImages)
+        }
+        
         if cocu == timesCount { // 最后一帧时 回调赋值
-            splitCompleteClosure(splitImages)
+            splitCompleteClosure(true, splitImages)
             BFLog(1, message: "splitVideo: complete")
         }
     }

+ 3 - 1
BFRecordScreenKit/Classes/RecordScreen/View/BFVideoThumbProgressView.swift

@@ -99,10 +99,12 @@ class BFVideoThumbProgressView: UIView {
             return
         }
         
+        let date = Date()
         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
+            splitVideoFileUrlFps(urlAsset: videoAsset, fps: fps, firstImagesCount: 4) { [weak self] hadGetAll, images in
+                BFLog(1, message: "\(hadGetAll), \(Date().timeIntervalSince(date))")
                 self?.recordItem!.thumbImgs.removeAll()
                 self?.recordItem!.thumbImgs.append(contentsOf: images)
                 self?.addThumbImages(images: images)