كيف يمكنني تتبع تقدم كتابة AvassetWriter؟
-
26-09-2019 - |
سؤال
كيف يمكنني حساب تقدم عملية AvassetWriter؟ لذلك إذا كان لدي شيء مثل:
[assetWriterInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
while (1){
if ([assetWriterInput isReadyForMoreMediaData]) {
CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer];
if (sampleBuffer) {
[assetWriterInput appendSampleBuffer:sampleBuffer];
CFRelease(sampleBuffer);
} else {
[assetWriterInput markAsFinished];
break;
}
}
}
}];
ما الذي يمكنني سحبه (أو الاقتراع) أثناء الحلقة لمعرفة عدد x من y الذي أكملته؟
شكرًا.
المحلول
عينة المخزن المؤقت لديه عدة طوابع زمنية عليها. يمكنك الحصول على طابع زمني للعرض التقديمي مع مكالمة إلى:
CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
يمكنك بعد ذلك استخدام ذلك لتحديد المدى الذي تبعده عن مصدرك لمؤسسة الإدخال. يجب أن يمنحك Prestime / المدة قيمة من 0.0 إلى 1.0 تمثل التقدم التقريبي. إذا كنت بحاجة إلى أن تكون أكثر دقة ، فيمكنك محاولة العوامل في مدة العينات في المخزن المؤقت للعينة باستخدام CMSAMPLEBUFFERGETDURITE ().
إذا كان وقت العرض التقديمي لا يعمل من أجلك ، انظر إلى الطوابع الزمنية الأخرى القريبة في الرأس.
نصائح أخرى
يمكنك تتبع التقدم باستخدام الكود أدناه. تحتاج إلى مدة إجمالية للفيديو وستحصل على استخدام الرمز أدناه.
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)
}