如何计算AVAssetWriter过程的进度?所以,如果我有这样的:

[assetWriterInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
  while (1){
    if ([assetWriterInput isReadyForMoreMediaData]) {
      CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer];
      if (sampleBuffer) {
        [assetWriterInput appendSampleBuffer:sampleBuffer];
        CFRelease(sampleBuffer);
      } else {
        [assetWriterInput markAsFinished];
        break;
      }
    }
  }
}];

我能在循环过程中拉(或轮询)要弄清楚如何Y的许多X我已经完成了?

感谢。

有帮助吗?

解决方案

在样品缓冲液中对他们几个时间戳。你可以得到展现时间戳与调用:

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

您可以再使用它来确定你是到源的输入缓冲区多远。 presTime /持续时间应该给你代表的大致进度0.0到1.0的值。如果需要更精确你可以尝试因素,在样品中的样本的持续时间缓冲使用CMSampleBufferGetDuration()。

如果您在其他时间戳记在头看看附近的演示时间不工作。

其他提示

可以跟踪使用下面的代码的进展。你需要视频的总时长,你会得到使用下面的代码。

let asset = AVAsset(url: urlToCompress);
let duration = asset.duration
let durationTime = CMTimeGetSeconds(duration)

现在,你需要计算压缩视频的当前时间戳。

let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
    self.progress.progress = Float(per)
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top