如何跟踪AVAssetWriter写作的进度?

Eri*_*sen 8 iphone cocoa objective-c avfoundation avassetwriter

如何计算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;
      }
    }
  }
}];
Run Code Online (Sandbox Code Playgroud)

我可以在循环中拉动(或轮询)以确定我完成了多少x?

谢谢.

Jon*_*etz 19

样本缓冲区上有几个时间戳.您可以通过以下呼叫获得演示时间戳:

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用它来确定您进入输入缓冲区的源的距离.presTime/duration应该给出一个代表近似进度的0.0到1.0的值.如果您需要更精确,可以尝试使用CMSampleBufferGetDuration()来计算样本缓冲区中样本的持续时间.

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


Dik*_*hah 8

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

let asset = AVAsset(url: urlToCompress);
let duration = asset.duration
let durationTime = CMTimeGetSeconds(duration)
Run Code Online (Sandbox Code Playgroud)

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

let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
    self.progress.progress = Float(per)
}
Run Code Online (Sandbox Code Playgroud)