Domanda

Come posso calcolare il progresso di un processo AVAssetWriter? Quindi, se ho qualcosa di simile:

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

cosa posso essere tirando (o polling) durante il ciclo per capire quante x di y Ho completato?

Grazie.

È stato utile?

Soluzione

Il tampone campione ha diversi timestamp su di loro. Si potrebbe ottenere il timestamp presentazione con una chiamata a:

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

È quindi possibile utilizzare che per determinare quanto siete nella vostra fonte per il buffer di input. presTime / durata dovrebbe darvi una 0,0-1,0 valore che rappresenta il progresso approssimativa. Se avete bisogno per essere più precisi si potrebbe provare a fattore di durata dei campioni del campione buffer utilizzando CMSampleBufferGetDuration ().

Se il tempo di presentazione non funziona per voi guardano le altre marche temporali vicine nell'intestazione.

Altri suggerimenti

È possibile monitorare i progressi usando il codice seguente. Hai bisogno di una durata totale del video e si otterrà usando il codice seguente.

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

Ora, è necessario calcolare il timestamp corrente del video compresso.

let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
    self.progress.progress = Float(per)
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top