Come faccio a monitorare lo stato di avanzamento della scrittura AVAssetWriter?
-
26-09-2019 - |
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.
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)
}