如何追踪AVAssetWriter的写入进度?

问题描述 投票:0回答:3

如何计算 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 或 y ?

谢谢。

iphone objective-c cocoa avfoundation avassetwriter
3个回答
24
投票

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

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

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

如果演示时间不适合您,请查看标题附近的其他时间戳。


8
投票

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

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)
}

0
投票

使用下面的方法检查这个,您也会取得进展

斯威夫特

let duration = asset.duration
let durationTime = CMTimeGetSeconds(duration)

let timeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let totalTime = timeSecond / durationTime

DispatchQueue.main.async {
    //code to execute
    self.progress.progress = Float(totalTime)
}

目标C

CMTime duration = asset.duration;
float durationTime = CMTimeGetSeconds(duration);

CMTime timeStamp = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
float timeSecond = CMTimeGetSeconds(timeStamp);
float totalTime = timeSecond / durationTime;
                    
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    //code to execute
    [self->progressProcessing setProgress:totalTime animated:YES];
});
© www.soinside.com 2019 - 2024. All rights reserved.