Pregunta

¿Cómo puedo calcular el progreso de un proceso AVAssetWriter? Así que si tengo 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;
      }
    }
  }
}];

¿qué puedo estar tirando (o sondeo) durante el bucle de averiguar cuántas x de y he completado?

Gracias.

¿Fue útil?

Solución

El tampón de muestra tiene varias marcas de tiempo en ellos. Se podría obtener el sello de tiempo de presentación con un llamado a:

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

A continuación, podría utilizar eso para determinar lo lejos que están en su origen para el buffer de entrada. presTime / duración debe darle un valor de 0,0 a 1,0 que representa el progreso aproximada. Si usted necesita para ser más preciso podría intentar factor en la duración de las muestras en la muestra buffer usando CMSampleBufferGetDuration ().

Si el tiempo de presentación no funciona para nos fijamos en las otras marcas de tiempo en las inmediaciones de la cabecera.

Otros consejos

Se puede seguir el progreso con el siguiente código. Es necesario una duración total del vídeo y obtendrá con el siguiente código.

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

Ahora, es necesario calcular la fecha y hora actual del vídeo comprimido.

let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
    self.progress.progress = Float(per)
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top