Frage

Wie kann ich berechnen den Fortschritt eines AVAssetWriter Prozess? Also, wenn ich so etwas wie:

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

Was kann ich (oder Polling) während der Schleife einem Strang ziehen, um herauszufinden, wie viele x von y ich abgeschlossen habe?

Danke.

War es hilfreich?

Lösung

Der Probenpuffer hat mehrere Zeitmarken auf sie. Sie können den Darstellungs-Zeitstempel mit einem Anruf bekommen:

CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );

Sie können dann verwenden, um zu bestimmen, wie weit Sie in Ihre Quelle für den Eingangspuffer. presTime / Dauer sollten Ihnen einen 0,0-1,0 Wert gibt den ungefähren Fortschritt darstellt. Wenn Sie genauer zu sein benötigt man zu Faktor in der Dauer der Proben in der Probe versuchen könnte CMSampleBufferGetDuration Puffer ().

Wenn die Präsentationszeit nicht für Sie arbeiten an den anderen Zeitstempel in der Nähe in der Kopfzeile aus.

Andere Tipps

können Sie den Fortschritt verfolgen mit dem Code unten. Sie brauchen eine Gesamtdauer des Videos und Sie den Code erhalten werden.

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

Nun müssen Sie die aktuellen Zeitstempel des komprimierten Videos berechnen.

let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
    self.progress.progress = Float(per)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top