چای ۱۲: فرمت‌دهی ویدئو برای Video Strickerهای تلگرام با استفاده از FFmpeg


مقدمه

تلگرام (Telegram) در آخرین بروزرسانی اخیرش، یکی از معدود ویژگی‌هایی که از رقیب نه‌چندان قدر ولی پرطرفدارش واتس‌اپ (Whatsapp) کمتر داشت رو جبران کرد و پشتیبانی از استیکر‌های ویدئویی (Video Sticker) رو اضافه کرد.

استیکرهای ویدئویی، تصاویر متحرک بدون صدایی با فرمت فایل WEBM هستند که مثل استیکر‌های معمولی و استیکر‌های انیمیشنی (Animated Sticker) به‌صورت پک دسته‌بندی شده و ذخیره می‌شوند.


نمونه‌ای از یک استیکر ویدئویی -به پیکسلی بودن تصویر توجه کنید.
نمونه‌ای از یک استیکر ویدئویی -به پیکسلی بودن تصویر توجه کنید.


تفاوت با GIFها

برخلاف گیف‌ها (جیف [GIF])، استیکرهای ویدئویی از لایه شفاف (Transparent) در تصویر پشتیبانی کرده (VP9 Codec) و بر اساس تنظیمات انکودینگ (Encoding) تصویر می‌توانند حجم کمتری داشته باشند.

تفاوت با Animated Stickerها

استیکرهای انیمیشنی تصاویری برداری (وکتوری [Vector]) با فرمت فایل TGS هستند که با استفاده از تکنولوژی Lottie تولید شده و نمایش داده می‌شوند. برای تولید آن‌ها با استفاده از برنامه Adobe After Effect و با کمک شاخه‌ای از افزونه Bodymovin، تصاویر متحرک به فرمت مخصوص Lottie (فرمتی در قالب JSON) تبدیل شده و سپس به فرمت فایل TGS تبدیل می‌شوند.

اما استیکر‌های ویدئویی پیچیدگی کمتری داشته و تصاویری پیکسلی (رستری [Raster]) هستند -همانند فیلم‌هایی کوتاه و بدون صدا- که فرمت فایل WEBM و کدک (Codec) VP9 ذخیره شده‌اند.


آشنایی با FFmpeg

در خلاصه‌ترین حالت، FFmpeg یک کتاب‌خانه، فریم‌ورک و مجموعه‌ای از برنامه‌های تحت خط فرمان (CLI)
چندسکویی (Cross-Platform) با امکانات فراوان برای نمایش، تبدیل، تغییر و ویرایش در ویدئوها و تصاویر (و تقریبا هر فرمت نمایش اطلاعات دیگری) است که به‌صورت متن‌باز توسعه و به‌صورت رایگان ارائه می‌شود. در این پست با استفاده از رابط خط فرمان FFmpeg یک ویدئو با فرمت mp4 را به فرمت مربوطه تبدیل می‌کنیم.


پیشنهاد
ImageMagick ابزار تحت خط فرمان دیگری برای کار با تصاویر است که پیش از این در پست زیر اون رو بررسی کردم:
آشنایی با ImageMagick برای کار با تصاویر


استفاده از رابط خط فرمان FFMPEG بسیار ساده بوده و قالب اجرای دستورات با استفاده از دستور ffmpeg --help قابل مشاهده است:

$ ffmpeg --help
usage: ffmpeg [options] [[infile options] -i infile] ... {[outfile options] outfile}...


نصب

برای تصب FFmpeg بر اساس پلتفرم و سیستم خود یکی از روش‌های زیر را استفاده کنید:

ویندوز

# Download the zip file
https://github.com/BtbN/FFmpeg-Builds/releases

# using chocolatey package manager
choco install ffmpeg

اطلاعات بیشتر

لینوکس

# Ubuntu
sudo apt install ffmpeg

# Arch
pacman -S ffmpeg

اطلاعات بیشتر


پیش‌نیازهای استیکر‌های ویدئویی (Video Sticker)

برای اطلاعات بیشتر مستندات انکودینگ (Encoding) را مرور کنید.
  • یکی از اضلاع (طول یا عرض) ویدئو باید دقیقا ۵۱۲ پیکسل باشد - ضلع دیگر می‌تواند ۵۱۲ پیکسل یا کمتر باشد.
  • طول ویدئو باید کمتر از ۳ ثانیه باشد.
  • فریم ریت تصویر می‌تواند تا ۳۰ فریم بر ثانیه (30FPS) باشد.
  • ویدئو باید یک لایه شفاش (Transparent) داشته باشد (طبق گفته مستندات این مورد موقتی‌ست).
  • سایز ویدئو نباید از ۲۵۶ کیلوبایت (256KB) تجاوز کند.
  • ویدئو باید در فرمت WEBM باشد و توسط کدک VP9 انکود (Encode) شده باشد.
  • ویدئو نباید هیچ کانال صوتی داشته باشد (بدون صدا باشد).
  • بهتر است ویدئو تکرار شوند باشد تا تجربه کاربری بهتری ایجاد کند.


فرمت‌دهی ویدئو توسط FFmpeg

برای فرمت‌دهی ویدئو به فرمت مورد نیاز می‌توانیم از دستور زیر استفاده کنیم:

ffmpeg -i video.mp4 -c:v vp9 -pix_fmt yuva420p -b:v 1M -vf "fps=30,scale=512:-1" -an video.webm


توضیح تنظیمات دستور (Flags)

-i | اجباری | آدرس(های) فایل ورودی

- ‏‏c:v | اجباری | تنظیم کدک؛ کدک VP9 از کانال آلفا (Alpha Channel) برای شفایت تصویر (Transparency) پشتیبانی می‌کند.

- pix_fmt | اجباری | فرمت پیکسل‌ها؛ فرمت yuva420p برای پشتبانی از کانال آلفا لازم است.

- b:v | اختیاری | تنظیمات بیت ریت ویدئو

- vf | اختیاری | تنظیمات فیلترهای ویدئو؛ استفاده از fps=30 برای تعیین فریم ریت ویدئو.

- vf | اجباری | تنظیمات فیلترهای ویدئو؛ استفاده از scale برای مشخص کردن ابعاد تصویر دیدئوی خروجی (در اینجا طول ویدئو ۵۱۲ پیکسل تعیین شده و عرض ویدئو بر اساس نسبت تصویر به‌صورت خودکار تعیین خواهد شد).

- an | اختیاری | تعیین بدون صدا بودن ویدئو خروجی. اگر ویدئوی ورودی بدون صداست نیازی به استفاده نیست.


منابع

مستندات استیکرهای تلگرام

اطلاعات کدک VP9 در مستندات FFmpeg

این بلاگ پست عالی با عنوان «Alpha Masking with FFMPEG»



این پست، قسمت دوازدهم از چای، مجموعه‌ای در باب «چیزی که امروز یادگرفتم» است. باقی چای‌ها رو می‌تونید از اینجا مشاهده کنید و در مورد فلسفه‌ی این کار بخونید.