10

如何计算 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;
      }
    }
  }
}];

在循环期间我可以拉(或轮询)什么来确定我已经完成了多少 x?

谢谢。

4

2 回答 2

22

样本缓冲区上有几个时间戳。您可以通过以下方式获取演示时间戳:

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

然后,您可以使用它来确定您在输入缓冲区的源中的距离。presTime / duration 应该给你一个 0.0 到 1.0 的值,代表大致的进度。如果您需要更精确,您可以尝试使用 CMSampleBufferGetDuration() 将样本缓冲区中样本的持续时间考虑在内。

如果演示时间对您不起作用,请查看标题附近的其他时间戳。

于 2010-10-27T03:29:52.587 回答
4

您可以使用下面的代码跟踪进度。您需要视频的总时长,您将使用下面的代码。

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)
}
于 2018-07-31T12:47:32.057 回答