المهمة، ولماذا تبدو أكثر تعقيدًا مما تبدو
يعد "أعطني إطارًا واحدًا في الثانية من هذا المقطع" أحد أكثر مهام الفيديو شيوعًا. يحتاج مختبر ضمان الجودة إلى لقطات شاشة متباعدة بشكل متساوٍ لإرفاقها بتقرير الأخطاء. يحتاج الباحث إلى عينة من تسلسل الصور لإدخالها في أداة التعليقات التوضيحية. يحتاج المحرر الاجتماعي إلى عشرين صورة ثابتة مرشحة من مقطع مدته دقيقتان دون مسح الجدول الزمني يدويًا.
المهمة نفسها بسيطة. ما يجعل الأمر تافهًا هو أن عبارة "إطار واحد في الثانية" غامضة في اللحظة التي تنظر فيها عن كثب. هل تقصد إطارًا واحدًا لكل ثانية من وقت التشغيل، أو كل Nالإطار من الدفق المشفر؟ هذه أشياء مختلفة: مقطع بمعدل 24 إطارًا في الثانية ومقطع بمعدل 60 إطارًا في الثانية ينتجان نفس العدد في القراءة الأولى وأعداد مختلفة تمامًا في القراءة الثانية. اختر الإطار الخطأ وستحصل إما على مجلد يحتوي على نسخ شبه مكررة أو تسلسل متناثر جدًا بحيث لا يكون مفيدًا.
ينتج كلا الطريقتين أدناه وحدات بكسل متطابقة. ويختلفان في الطريقة التي تعبر بها عما تريد، وفي السرعة التي تكتشف بها أنك عبرت عنه بطريقة خاطئة.
الطريقة 1: FFmpeg، المعلمة حسب المعلمة
الأمر الأساسي قصير:
ffmpeg -i input.mp4 -vf fps=1 -q:v 2 frame_%04d.jpg
كل جزء منه مهم:
-i input.mp4— الملف المصدر. يقرأها FFmpeg مرة واحدة، من البداية إلى النهاية؛ ولا يسعى إلى كل طابع زمني على حدة.-vf fps=1— مرشح الفيديو الذي يقوم بالعمل الفعلي.fps=1يعني إطار إخراج واحد في الثانية من وقت التشغيلبغض النظر عن معدل الإطار المصدر. يستخدمfps=1/5لإطار واحد كل خمس ثوانٍ، أوfps=2لإطارين في الثانية. هذه هي قراءة وقت التشغيل.-q:v 2— جودة JPEG، على مقياس مقلوب حيث يكون 2 شبه بدون خسارة و31 مضغوط بشدة. احذفها وستحصل على الإعداد الافتراضي FFmpeg، وهو أكثر ليونة بشكل ملحوظ مما يتوقعه معظم الناس. إذا كنت تريد إخراجًا بدون خسارة، فاكتبframe_%04d.pngبدلاً من ذلك وأسقط هذه العلامة بالكامل.frame_%04d.jpg— نمط الإخراج.%04dيضع العداد صفرًا حتى أربعة أرقام:frame_0001.jpg,frame_0002.jpg. الحشوة ليست تجميلية؛ انظر مشكلة الترقيم أدناه.
إذا كنت تريد القراءة الأخرى - كل Nالإطار المشفر بدلاً من كل N ثانية - يتغير الفلتر:
ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr frame_%04d.png
يحتفظ هذا بالإطارات حيث يوجد فهرس الإطار n قابل للقسمة على 10، و -vsync vfr يوقف FFmpeg من تكرار الإطارات لتوزيع معدل إخراج ثابت. اترك هذه العلامة متوقفة وستحصل على ملفات أكثر بكثير مما طلبته، وهي نتيجة أولية شائعة ومربكة.
لقصر العمل على مقطع ما، ضع -ss قبل -i لذا فإن FFmpeg يسعى قبل فك التشفير بدلاً من فك التشفير والتخلص:
ffmpeg -ss 00:01:30 -to 00:02:15 -i input.mp4 -vf fps=1 frame_%04d.png
الطريقة 2: نفس الوظيفة في المتصفح
مستخرج الإطارات على هذا الموقع يتم تعيينه لنفس القراءتين، مع توضيح الغموض في الواجهة بدلاً من إخفائه في سلسلة مرشح.
- أفلت الملف. تتم قراءته مباشرة من القرص إلى ذاكرة المتصفح - لا يوجد تحميل، لذلك يبدأ مصدر بسعة 3 جيجابايت في المعالجة فورًا بدلاً من بعد النقل.
- اختر طريقة الاستخراج. "الفاصل الزمني" يعادل
fps=1/N— تدخل الفجوة في ثوانٍ. "معدل الإطارات (FPS)" يعادلselect/modالفلتر - تدخل N للاحتفاظ بكل Nالإطار. - اقرأ تلميح عدد الإطارات قبل الاستخراج. هذا هو الجزء الذي يوفر أكبر قدر من الوقت. تعرض الواجهة عدد الصور التي ستنتجها إعداداتك الحالية قبل أي شيء يعمل، لذلك يصبح خطأ 4000 ملف رقمًا تراه بدلاً من مجلد تكتشفه.
- تعيين التنسيق والجودة. PNG لعدم فقدان البيانات، أو JPG أو WebP مع شريط التمرير بنسبة 10–100% عندما يكون الحجم مهمًا. يتوافق موضع شريط التمرير مع ما
-q:vعناصر التحكم، عبرت عن الطريقة التي يفكر بها معظم الناس في الأمر. - قم بقص النطاق إذا لزم الأمر. شريط التمرير ذو المقبض المزدوج هو
-ss/-toمكافئ، مع الطوابع الزمنية التي تظهر أثناء السحب. - التصدير. تظهر الإطارات في شبكة المعاينة؛ انقر فوق واحدة لحفظها بمفردها، أو خذ المجموعة بأكملها كمجموعة ZIP واحدة.
القاعدة الأساسية لاختيار الفاصل الزمني: لتسجيل الرأس الناطق أو الشاشة، إطار واحد كل 2-5 ثوانٍ يلتقط كل تغيير الدولة ذات مغزى. للرياضة أو أي شيء به حركة سريعة، 2-5 إطارات في الثانية. احتفظ "بكل إطار" لتحليل حقيقي دقيق للإطار - 60 إطارًا في الثانية في الدقيقة يعادل 3600 صورة وعدة غيغابايت من PNG.
ثلاث مشكلات تكلف الأشخاص الوقت فعليًا
1. الناتج هو آلاف الإطارات شبه المتطابقة
دائمًا ما يكون هناك خلط بين الوحدات: كنت تقصد "كل إطار عاشر" وكتبت fps=10وهو ما يعني عشرة إطارات في الثانية — على مصدر بمعدل 30 إطارًا في الثانية، أي 3x صور أكثر من المتوقع الساذج، وليس أقل 3x.
قبل تشغيل أي شيء، قم بإجراء العمليات الحسابية. وضع وقت التشغيل: duration ÷ interval. وضع فهرس الإطار: duration × source_fps ÷ N. مقطع مدته 10 دقائق بمعدل 30 إطارًا في الثانية في "كل إطار عاشر" هو 600 × 30 ÷ 10 = 1800 صورة. إذا فاجأك هذا الرقم، قم بضبطه قبل البدء وليس بعده. في أداة المتصفح يظهر نفس الشكل تحت حقل الفاصل الزمني تلقائيًا.
2. يتوقف الاستخراج جزئيًا خلال مقطع فيديو طويل
أسباب مختلفة على كل جانب، لذلك يختلف الإصلاح أيضًا.
مع FFmpeg، عادةً ما يكون المماطلة مرتبطًا بالقرص - الآلاف من PNG تهبط في دليل واحد ويصبح نظام الملفات، وليس وحدة فك التشفير، هو عنق الزجاجة. اكتب إلى دليل فارغ جديد، وفضل JPG عندما لا تحتاج إلى فقدان البيانات، وقم بتقسيم المصادر الطويلة جدًا إلى أجزاء مع -ss/-to.
في المتصفح، الحد الأقصى هو ذاكرة الوصول العشوائي (RAM): يتم الاحتفاظ بكل إطار مستخرج في الذاكرة حتى تقوم بتنزيل ZIP. بضع مئات من 4K PNGs تبلغ عدة غيغابايت ويمكن قتل علامة تبويب لها. النمط الموثوق به هو العمل في أجزاء - استخدم شريط تمرير النطاق الزمني لالتقاط 0:00-2:00، وقم بتنزيل ZIP، ثم انقل النطاق إلى 2:00-4:00. يساعد إغلاق علامات التبويب الأخرى قبل مهمة كبيرة حقًا، كما أن جودة JPG بنسبة 85-90% تقلل ضغط الذاكرة عدة مرات مع عدم وجود فرق واضح لمعظم الاستخدامات.
3. يؤدي ترقيم الإطار إلى قطع أمر الاستيراد
يظهر هذا الإطار بعد أن يبدو التصدير جيدًا. الأدوات التي تقوم بفرز أسماء الملفات كنصوص - ومعظمها تفعل ذلك - مرتبة frame_10.png قبل frame_2.png، لأن "1" يتم فرزه قبل "2" حرفًا بحرف. يتم تشغيل التسلسل الخاص بك بشكل مشوش وليس من الواضح السبب.
الإصلاح هو عدم وجود مساحة حشو، واسعة بما يكفي لأكبر حجم. العد سوف تنتج من أي وقت مضى. هذا هو ما %04d مخصص لـ؛ use %05d إذا كان من الممكن أن تتجاوز 9999 إطارًا. يتم تحريك لوحة أدوات المتصفح تلقائيًا، وهذا هو السبب الرئيسي وراء ميل مخرجاتها إلى النزول مباشرة إلى مستورد تسلسل الصور دون إعادة التسمية.
عندما يظل FFmpeg هو الاتصال الصحيح
في كثير من الأحيان. هذه ليست الحالة التي يفوز فيها المتصفح في جميع المجالات:
- أي شيء مكتوب أو مجدول. مهمة cron، وخطوة CI، ومسار من جانب الخادم - لا يمكن للمتصفح المشاركة في تلك المهام على الإطلاق.
- دفعات عبر العديد من الملفات. تعد حلقة الصدفة التي تزيد عن 200 مقطعًا تافهة في FFmpeg ومملة في أي مكان آخر.
- برامج الترميز التي لن يقوم المتصفح بفك تشفيرها. ProRes، DNxHD، تنسيقات الكاميرا الأولية، الحاويات غير العادية. إذا لم يتمكن المتصفح من تشغيله، فلن يتمكن من الاستخراج منه. يتعامل FFmpeg مع كل شيء تقريبًا.
- التصفية أثناء الاستخراج. إزالة التشابك، والقياس، وتحويل مساحة اللون، والاقتصاص، واكتشاف تغيير المشهد - كلها متاحة كمرشحات في نفس التمريرة.
- إمكانية التكرار. الأمر الموجود في الملف README دقيق. "اضبط شريط التمرير على حوالي هنا" ليس كذلك.
تعد أداة المتصفح مناسبة بشكل أفضل للمهام لمرة واحدة، لأي شخص لا يريد تثبيت سلسلة أدوات وصيانتها لمهمة عرضية، عندما يكون المصدر سريًا بدرجة كافية بحيث تكون المعالجة المحلية فقط مهمة، وعندما تريد إلقاء نظرة على الإطارات قبل الالتزام بالتصدير. هذه مواقف مختلفة حقًا، وليست ترتيبًا.
مرجع سريع
| ما تريده | FFmpeg | أداة المتصفح |
|---|---|---|
| إطار واحد في الثانية | -vf fps=1 |
الفاصل الزمني = 1 |
| إطار واحد كل 5 ثوانٍ | -vf fps=1/5 |
الوقت الفاصل الزمني = 5 |
| كل إطار مشفر عاشر | -vf "select=not(mod(n\,10))" -vsync vfr |
وضع معدل الإطارات، N = 10 |
| فقط من 1:30 إلى 2:15 | -ss 00:01:30 -to 00:02:15 |
شريط تمرير النطاق الزمني |
| إخراج بدون فقدان | .png نمط الإخراج |
التنسيق = PNG |
| الملفات الأصغر حجمًا | -q:v 5 مع .jpg |
JPG + شريط تمرير الجودة |
| شاهد العدد قبل التشغيل | احسب يدويًا | تظهر ضمن حقل الفاصل الزمني |
| المعاينة قبل الحفظ | افتح مجلد الإخراج | شبكة المعاينة المضمنة |
| الأتمتة/الدفعة | حلقة Shell، cron، CI | غير ممكن |
| ProRes، DNxHD، الخام | مدعم | فقط ما يفك تشفيره المتصفح |
أيًا كان المسار الذي تسلكه، يأتي قرار الفاصل الزمني أولاً والأداة ثانيًا. حدد عدد الإطارات التي تحتاجها بالفعل، وتأكد من العد قبل البدء، والباقي ميكانيكي.