Как я могу отслеживать ход написания AVAssetWriter? - PullRequest
8 голосов
/ 27 октября 2010

Как я могу рассчитать ход процесса 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;
      }
    }
  }
}];

что я могу потянуть (или опросить) во время цикла, чтобы выяснить, сколько х у вас я выполнил?

Спасибо.

Ответы [ 2 ]

18 голосов
/ 27 октября 2010

В буфере образца есть несколько временных отметок. Вы можете получить отметку времени презентации, позвонив по номеру:

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

Затем вы можете использовать это, чтобы определить, как далеко вы находитесь в вашем источнике для входного буфера. presTime / duration должна давать вам значение от 0,0 до 1,0, представляющее приблизительный прогресс. Если вам нужно быть более точным, вы можете попытаться учесть длительность семплов в буфере семплов, используя CMSampleBufferGetDuration ().

Если время презентации не работает, посмотрите на другие отметки времени, расположенные рядом в заголовке.

1 голос
/ 31 июля 2018

Вы можете отслеживать прогресс, используя код ниже. Вам нужна общая продолжительность видео, и вы получите код, указанный ниже.

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