چای ۱۲: فرمت‌دهی ویدئو برای 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 &quotfps=30,scale=512:-1&quot -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»این پست، قسمت دوازدهم از چای، مجموعه‌ای در باب «چیزی که امروز یادگرفتم» است. باقی چای‌ها رو می‌تونید از اینجا مشاهده کنید و در مورد فلسفه‌ی این کار بخونید.