Преглед изворни кода

1,播放完成判断修改 2,提高时间戳的精度 防止生成视频的时长不对

jsonwang пре 3 година
родитељ
комит
cfe6416019
1 измењених фајлова са 36 додато и 32 уклоњено
  1. 36 32
      BFFramework/Classes/PQGPUImage/akfilters/PQMovieInput.swift

+ 36 - 32
BFFramework/Classes/PQGPUImage/akfilters/PQMovieInput.swift

@@ -10,7 +10,7 @@ import AVFoundation
 import VideoToolbox
 
 public protocol PQMovieInputDelegate: AnyObject {
-    func didFinishMovie()
+
 }
 
 public class PQMovieInput: ImageSource {
@@ -210,18 +210,43 @@ public class PQMovieInput: ImageSource {
  
  
         autoreleasepool {
-   
+            let duration = Double(Int(CMTimeGetSeconds(playeTimeRange.end) * 1000_000_000)) / 1000_000_000.0 // Only used for the progress block so its acuracy is not critical
+            self.currentTime = CMTimeMakeWithSeconds(self.beginTime +  CMTimeGetSeconds(startTime ?? CMTime.zero), preferredTimescale: 1000_000_000)
             self.beginTime = self.beginTime + 1 / 30
-            self.currentTime = CMTimeMakeWithSeconds(self.beginTime +  CMTimeGetSeconds(startTime ?? CMTime.zero), preferredTimescale: 600)
+            
+            let currTime = CMTimeGetSeconds(self.currentTime)
+  
+            let prgressValue = currTime / Float64(duration)
+            
+            FilterLog(message: "\(mIsExport) MovieOutput total frames appended:播放进行中 总用时: \(CFAbsoluteTimeGetCurrent() - (debugStartTime ?? 0.0)) 播放器开始时间:\(CMTimeGetSeconds(playeTimeRange.start)) 播放器结束时间:\(duration)  总时间:\(CMTimeGetSeconds(playeTimeRange.end) - CMTimeGetSeconds(playeTimeRange.start)) 播放进度当前时间:\(currTime) 进度:\(prgressValue) 帧id \(totalFramesSent)")
+            totalFramesSent += 1
+    
+            FilterLog(message: "播放进行中 总用时: \(CFAbsoluteTimeGetCurrent() - (debugStartTime ?? 0.0)) 播放进度当前时间:\(currTime) 进度:\(prgressValue)")
+            if currTime / duration > 1  {
+                FilterLog(message: "全部播放完成 总用时为:\(CFAbsoluteTimeGetCurrent() - (debugStartTime ?? 0.0))")
+
+                self.completion?()
+ 
+                self.beginTime = 0
+                self.currentTime = .zero
+                self.isPlay = false
+                self.mAutoPause = true
+
+                // 定到首帧,最好移动到业务逻辑中。。。TODO不是导出模式才定帧
+                if !mIsExport {
+                    self.start(isFreeBuffer: true,timeRange: playeTimeRange)
+                }
+            }
+          
         
 
             if let movieOutput = self.synchronizedMovieOutput {
                 self.conditionLock.lock()
                 while self.readingShouldWait {
                     self.synchronizedEncodingDebugPrint("Disable reading")
-                    FilterLog(message: "Disable reading")
+                    FilterLog(message: "Disable reading 开始等待 \(CFAbsoluteTimeGetCurrent() - (debugStartTime ?? 0.0)) ")
                     self.conditionLock.wait()
-                    FilterLog(message: "Enable reading")
+                    FilterLog(message: "Enable reading  停止等待 \(CFAbsoluteTimeGetCurrent() - (debugStartTime ?? 0.0))")
                 }
                 self.conditionLock.unlock()
 
@@ -246,29 +271,7 @@ public class PQMovieInput: ImageSource {
                 self.start(isFreeBuffer: false)
             }
             
-            let duration = CMTimeGetSeconds(playeTimeRange.end) // Only used for the progress block so its acuracy is not critical
-
-            let currTime = CMTimeGetSeconds(self.currentTime)
-
-            let prgressValue = currTime / duration
-
-            FilterLog(message: "播放进行中 总用时: \(CFAbsoluteTimeGetCurrent() - (debugStartTime ?? 0.0)) 播放进度当前时间:\(currTime) 进度:\(prgressValue)")
-            if prgressValue > 1 {
-                FilterLog(message: "全部播放完成 总用时为:\(CFAbsoluteTimeGetCurrent() - (debugStartTime ?? 0.0))")
- 
-                self.delegate?.didFinishMovie()
-                self.completion?()
- 
-                self.beginTime = 0
-                self.currentTime = .zero
-                self.isPlay = false
-                self.mAutoPause = true
-
-                // 定到首帧,最好移动到业务逻辑中。。。TODO不是导出模式才定帧
-                if !mIsExport {
-                    self.start(isFreeBuffer: true,timeRange: playeTimeRange)
-                }
-            }
+          
         }
 //        }
 
@@ -439,10 +442,9 @@ public class PQMovieInput: ImageSource {
             let start =  CMTimeGetSeconds(playeTimeRange.start)
             let currTime = CMTimeGetSeconds(currentTime)
             
-   
-            
+    
             let prgressValue = (currTime - start) / (duration - start)
-            FilterLog(message: " movinput 当前时间 is \(currTime) 当前进度:\(prgressValue)")
+            FilterLog(message: "\(mIsExport) movinput 当前时间 is \(currTime) 当前进度:\(prgressValue)")
             progress?(currTime, duration, prgressValue)
 
             sharedImageProcessingContext.runOperationSynchronously {
@@ -494,7 +496,7 @@ public class PQMovieInput: ImageSource {
             let startTime = CFAbsoluteTimeGetCurrent()
 
             imageFramebuffer.lock()
-
+            BFLog(message: "mIsExport:\(mIsExport) 实际设置的每一帧时间戳:\(CMTimeGetSeconds(currentTime))")
             // 设置当前帧的时间戳
             imageFramebuffer.timingStyle = .videoFrame(timestamp: Timestamp(currentTime))
  
@@ -564,7 +566,9 @@ public class PQMovieInput: ImageSource {
         if movieOutput.assetWriterVideoInput.isReadyForMoreMediaData || movieOutput.assetWriterAudioInput?.isReadyForMoreMediaData ?? false {
             readingShouldWait = false
             conditionLock.signal()
+            
         } else {
+            BFLog(message: "MovieOutput total frames appended 要加锁了")
             readingShouldWait = true
         }
         conditionLock.unlock()