التكرار الزمني وبنية GOP
الكنز الذي اكتشفناه: الإطارات المتجاورة شبه متطابقة. لكن استغلاله الساذج (خزّن الفرق عن السابق دائماً) ينهار أمام مشكلة عملية ضخمة — ومن حلّها تولد بنية I/P/B التي تحكم كل كوديك فيديو.
الفكرة الواضحة: خزّن الإطار الأول كاملاً، ثمّ لكلٍّ بعده خزّن الفرق عن
السابق فقط (صغير لأن أغلبه أصفار). ضغطٌ هائل!
الآن المستخدم يقفز لدقيقة ٤٥ من الفيلم. المشكلة: لإظهار ذلك الإطار تحتاج فروقه عن السابق، وذاك يحتاج سابقه… حتى الإطار الأول. أي يجب فكّ ٨١٠٠٠ إطار للوصول لواحد! وإن ضاع إطار في البثّ، ينهار كل ما بعده. كيف تحصد التكرار الزمني دون أن تجعل كل إطار رهينة سلسلة لا تنتهي؟ وهل يمكن أن يستفيد إطارٌ من المستقبل لا الماضي فقط؟
ثلاثة أنواع من الإطارات — حلّ اللغز
| النوع | يعتمد على | الحجم | الدور |
|---|---|---|---|
| I-frame (intra) | لا شيء — صورة كاملة مستقلّة | كبير | نقطة دخول/إنعاش؛ هو صورة JPEG/AVIF |
| P-frame (predicted) | إطار سابق (تنبّؤ أمامي) | صغير | يخزّن الحركة + الباقي عن السابق |
| B-frame (bi-directional) | سابق ولاحق معاً | أصغر | يستوفي بين إطارين — أكفأ الكلّ |
الحلّ: ضع I-frame دورياً (كل ~١-٢ ثانية). بين كل I والتالي = GOP (Group of Pictures). للقفز، اذهب لأقرب I قبل الهدف وافكّ منه فقط — لا من بداية الفيلم. وللثبات ضد فقدان الحزم، الـI يعيد التزامن.
الـB يحتاج إطاراً لاحقاً لفكّه — فيجب أن يصل ذلك اللاحق قبله في الملف/البثّ. لذا "ترتيب الترميز" ≠ "ترتيب العرض". هذا قرارٌ معماريّ (نظير progressive في الصور: ترتيب البيانات ≠ ترتيب الفكّ). وهو سبب الحاجة لـ"buffer إعادة ترتيب" في الفكّاك.
GOP طويل (I نادر) = ضغط أعلى لكن قفز أبطأ وتعافٍ أبطأ من الأخطاء. GOP قصير (I متكرّر) = العكس. البثّ الحيّ يفضّل GOP قصيراً (وصول سريع، صمود)؛ التخزين يفضّل طويلاً. الخطأ الشائع: GOP طويل جداً في بثّ مباشر → المشاهد ينتظر ثوانٍ ليبدأ الفيديو (ينتظر أوّل I). المقايضة لا تختفي، تنتقل.
- على سلسلة إطارات PPM (من العقدة ٠٠): رمّز الأولى كـ"I" (كاملة)، والبقية كـ"P" (فرق عن السابقة). اضغط كلاً بـ(أعِد استخدام) مرمّز RLE/Huffman من مسار الصور. قارن الحجم الكلّي بتخزين كل الإطارات كاملة.
- اختبر القفز: أضِف I-frame كل ٥ إطارات. اقفز لإطار عشوائي وافكّه — كم إطاراً احتجت أن تفكّ؟ قارن مع GOP بلا I متكرّر.
- محاكاة فقدان حزمة: أتلِف إطار P واحداً. لاحظ كيف ينتشر التلف لكل ما بعده حتى الـI التالي (drift). هذا لماذا I موجود.
نحصد التكرار الزمني عبر إطارات تتنبّأ من غيرها (P/B)، مع I دورية كنقاط دخول وإنعاش (GOP). لكن قلنا "P يخزّن الفرق عن السابق" — وهذا ساذج: لو تحرّك جسمٌ كاملاً، الفرق المباشر ضخم! الحلّ الحقيقي ليس "الفرق" بل تتبّع الحركة أولاً. هذا قلب الفيديو.