Pergunta

Como posso calcular o progresso de um processo AvasetWriter? Então, se eu tenho algo como:

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

O que posso fazer (ou pesquisar) durante o loop para descobrir quantos X de Y eu completei?

Obrigado.

Foi útil?

Solução

O buffer de amostra possui vários carimbos de hora. Você pode obter o carimbo de hora de apresentação com uma chamada para:

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

Você pode usar isso para determinar a que distância está na sua fonte para o buffer de entrada. A entrega / duração deve fornecer um valor de 0,0 a 1,0 representando o progresso aproximado. Se você precisava ser mais preciso, tente levar em consideração a duração das amostras no buffer de amostra usando o CMSampleBuffergetDuration ().

Se o tempo de apresentação não funcionar para você observar os outros carimbos de tempo nas proximidades no cabeçalho.

Outras dicas

Você pode rastrear o progresso usando o código abaixo. Você precisa de uma duração total do vídeo e usará o código abaixo.

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

Agora, você precisa calcular o registro de data e hora atual do vídeo compactado.

let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
    self.progress.progress = Float(per)
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top