Как я могу отслеживать прогресс письма AvassetWriter?
-
26-09-2019 - |
Вопрос
Как я могу рассчитать прогресс процесса авасцетарайтера? Так что, если у меня есть что-то вроде:
[assetWriterInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
while (1){
if ([assetWriterInput isReadyForMoreMediaData]) {
CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer];
if (sampleBuffer) {
[assetWriterInput appendSampleBuffer:sampleBuffer];
CFRelease(sampleBuffer);
} else {
[assetWriterInput markAsFinished];
break;
}
}
}
}];
Что я могу потянуть (или опросить) во время цикла, чтобы выяснить, сколько х из у меня закончилось?
Спасибо.
Решение
Образец буфера имеет несколько меток времени на них. Вы можете получить отметку времени презентации с помощью:
CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
Затем вы можете использовать это, чтобы определить, насколько далеко вы находитесь в своем источнике для входного буфера. Престеме / продолжительность должна дать вам значение 0,0 до 1,0, представляющее приблизительный прогресс. Если вам нужно было быть более точным, вы можете попытаться фактически расти в течение образцов в буфере образца с помощью CMSamleBufferGetDuration ().
Если время презентации не работает для вас, посмотрите на другие метки времени поблизости в заголовке.
Другие советы
Вы можете отслеживать прогресс, используя код ниже. Вам нужна общая продолжительность видео, и вы получите код ниже.
let asset = AVAsset(url: urlToCompress);
let duration = asset.duration
let durationTime = CMTimeGetSeconds(duration)
Теперь вам нужно рассчитать текущий меток времени сжатого видео.
let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
self.progress.progress = Float(per)
}