چگونه در لینوکس یک تصویر متحرک درست کنیم؟ (قسمت دوم)

خب، توی قسمت اول توضیح دادیم که چه شکلی با ابزارهای مختلفی مثل ImageMagick، ffmpeg و GIMP میشه تصویر متحرک با فرمت gif درست کرد.

اما gif بهترین انتخاب نیست. فرمت gif بسیار قدیمی هست و رنگ‌های زیادی رو پشتیبانی نمی‌کنه، بسیار سنگین هست و پروسه می‌گیره و از همه بدتر، حجم بسیار زیادی می‌گیره.

گیف قبلی که ۲ ثانیه و ۲۵ صدم ثانیه بود و تقریبا ۵۰ فرم شده بود، در بهترین حالت با کم‌ترین حجم نزدیک به ۱.۵ مگابایت شده بود. این عدد هرچند زیاد نیست ولی خب بهتر از این هم میشه.

اینجاست که می‌خوایم از فرمت webm به جای gif استفاده کنیم. سرعت بیشتر، محاسبه‌ی کمتر و از همه مهم‌تر، حجم بسیار کمتر از مزیت‌های این فرمت نسبت به gif هست. اما این که چرا هنوز همه از webm استفاده نمی‌کنن به خاطر پشتیبانی نشدنش توی مرورگرهای قدیمی و IE هست.

خب من اینجا خروجی gif قبلیم رو سعی می‌کنم به webm تبدیل کنم تا تفاوت رو ببینین، باز هم از ابزار ffmpeg استفاده می‌کنیم:

ffmpeg -i in.gif out.webm

که out.gif ورودی هست و نتیجه توی out.webm ذخیره میشه.  ۱.۵ مگابایت حجم تبدیل شد به ۸۰ کیلوبایت، بیش از ۱۸ برابر کاهش حجم. البته کیفیت عالی نیست.

حالا با چند تا آپشن این خروجی رو بهتر می‌کنیم.

ffmpeg -i in.gif -b:v 600K -qmin 0 -qmax 50 -crf 5 out.webm

-b:v با این آپشن bitrate تصویرمون رو تعیین می‌کنیم.  600K به نظر کیفیت قابل قبولی رو برای ما برمی‌گردونه.

-qmin و -qmax هم بازه‌ی VBR رو تعیین میکنن. که من ایده‌ی خاصی ندارم چیه راستش!

-crf که Constant Rate Factor هست و معمولا بین بازه ۰ تا ۵۰ ست و هر چی کمتر باشه کیفیت بیشتره.

خروجی ۲۰۰ کیلوبایت شد که باز هم خیلی از ۱.۵ مگابایت بهتره، ffmpeg یه ابزار خیلی قدرتمنده که چندین صفحه man داره. مطمئنن بهتر از این هم میشه خروجی گرفت:

همچنین قسمت اول این پست رو در «چگونه در لینوکس یک تصویر متحرک درست کنیم؟» بخونید.

چگونه در لینوکس یک تصویر متحرک درست کنیم؟

خب اولین ایده‌ای که به ذهن می‌رسه، gif هست. برای درست کردن گیف روش‌های مختلفی هست.

راه حل گرافیکی

برای راه حل گرافیکی از نرم‌افزار GIMP استفاده می‌کنیم. بدون هیچ احتیاج به پلاگین خاصی فقط کافیه که توی فایلی که درست کردیم به ازای هر فریم یک لایه بزاریم و انتهای اسم اون لایه به صورت “Layer (250ms)” مدت زمان نمایش لایه رو تعیین کنیم. برای پیش‌نمایش این گیف میتونین از Filters > Animation > Playback گیف رو نمایش بدین.

حالا کافیه موقع ذخیره‌سازی به صورت gif ذخیره کنیم.

خروجی به صورت gif
خروجی به صورت gif

تنها نکته‌ای که هست اینه که حتما تیک گزینه‌ی as animation رو بزنین.

Loop forever: اگه این گزینه رو زده باشین گیف متوقف نمیشه.

راه حل خط فرمان

خب حالا اگه یه تعداد عکس داشته باشیم که بخوایم گیف بشن از ImageMagick استفاده می‌کنیم. با استفاده از دستور convert و چند تا آپشن ساده عکس متحرک ما تولید میشه:

convert -delay 50 frame1.jpg -delay 100 frame2.jpg -delay 150 frame3.jpg -loop 0 -pause 200 animated.gif

delay: قبل از هر عکس می‌تونیم از این آپشن استفاده کنیم تا وقفه ایجاد کنیم. عددها به میلی‌ثانیه هستن.

loop: بعد که همه‌ی فریم‌ها رو گذاشتیم، با آپشن loop میگیم که چند بار تکرار بشه. 0 به معنی بی‌نهایت هست.

pause: این آپشن هم میگه با هر بار چرخش چند میلی‌ثانیه صبر کنه.

و در آخر هم اسم فایل خروجی رو می‌نویسیم. اگه تعداد عکس‌ها هم زیاد هستن می‌تونیم از *.jpg استفاده کنیم تا تمام عکس‌ها رو پوشش بده.

حالا اگه ما یه ویدیو داشته باشیم که بخوایم چند ثانیه‌اش رو گیف کنیم از ابزار ffmpeg استفاده می‌کنیم.

ffmpeg -t 2 -ss 00:02:35 -i video.mp4 animated.gif

که ساختار ساده‌ای داره، این دستور، از زمان ۰۲:۳۵ به مدت دو ثانیه از فایل video.mp4 رو به صورت گیف توی animated.gif ذخیره می‌کنه.

out-small-cover

(روی عکس کلیک کنید تا gif خروجی رو ببنید.)