سؤال

كيف يمكنني حساب تقدم عملية 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)
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top