Como posso acompanhar o progresso da escrita de Avastwriter?
-
26-09-2019 - |
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.
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)
}