برنامه نویسی

تبدیل ویدیو به وب متحرک با استفاده از FFMPEG با جمع آوری خودکار

اخیراً من نیاز به کلیپ کردن یک فیلم تلفیقی در یک سری انیمیشن های حلقه کوتاه داشتم. من می توانستم برای این کار از فرمت OLE GIF قابل اعتماد استفاده کنم ، اما می خواستم از وب مدرن تر ، خواهر به فرمت وب سایت محبوب برای فیلم استفاده کنم.

من نمی توانم هیچ ابزار یا راهنمای مناسبی پیدا کنم تا آنچه را که لازم داشتم انجام دهم ، بنابراین تصمیم می گیرم یکی را با هم شلاق بزنم. ویژگی های بزرگی که من می خواستم یک) سهولت در استفاده بود ، و ب) قادر به تولید خودکار میله های سیاه. مجموعه ای که من با آن کار می کردم ترکیبی از پرتره و چشم انداز بود ، بنابراین این یک ضرورت بود.

طبق معمول ، ffmpeg همه چیز لازم را برای رسیدگی به این حق پخته شده دارد. ابتدا به یک دستور اصلی نیاز داریم تا یک فیلم را به وب تبدیل کنیم.

$ ffmpeg -i  -loop 1 -an -vf fps=fps=20 
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من می دانم که fps=fps=20 به نظر می رسد مانند یک تایپی ، اما این نحو واقعی برای این فیلتر است. یک مقدار از 20 در اینجا تعادل خوبی بین پخش صاف و پرونده های کوچک وجود دارد. بنابراین اکنون می توانیم یک فیلم کامل را به یک وب حلقه حلقه تبدیل کنیم. اما اگر بخواهیم فقط یک بخش خاص را کلیپ کنیم ، چه می شود؟

$ ffmpeg -i  -ss  -to  -loop 1 -an -vf fps=fps=20 
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

-ss تنظیم زمان شروع کار را تنظیم می کند ، -to جدول زمانی پایان را تنظیم می کند. این می تواند به سادگی # ثانیه مانند 77 یا نماد زمانی کامل “00:01:17” باشد. اما این دستور کمی حجیم می شود. بنابراین بیایید آن را در یک فیلمنامه بپیچیم.

#!/bin/bash
start=""
end=""

if [ ! -z "$2" ]; then
  start="-ss $2"
fi

if [ ! -z "$3" ]; then
  end="-to $3"
fi

ffmpeg -i "$1" $start $end -loop 1 -an -vf fps=fps=20 "$4"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

سپس می توانیم از آن استفاده کنیم:

$ vid2webp infile.mp4 10 20 outfile.webp
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این خیلی لاغر است. با استفاده از این ، ما می توانیم کلیپ ها را از یک ویدیو به یک سری از پرونده های وب متحرک سریع و به راحتی برش دهیم. که نیاز را برآورده می کند بوهابشر اما ما نمی توانیم در آنجا متوقف شویم. شرط بعدی برای تشخیص میله های سیاه ، برای این کار ما به این امر نیاز داریم cropdetect فیلتر ضربه قطعه به دنبال زمان شروع کلیپ است ، نمونه 10 فریم را نشان می دهد و ابعاد فیلم را از آن استخراج می کند crop= خروجی

crop=$(ffmpeg $start -i "$1" -vframes 10 -vf cropdetect -f null -  2>&1 | grep -m 1 -oP 'crop=\K[0-9:]+')
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

از این طریق می توانیم مقادیر ارتفاع/عرض را با استفاده از آن استخراج کنیم cutبشر

width=$(echo "$crop" | cut -d':' -f1)
height=$(echo "$crop" | cut -d':' -f2)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

سپس مقیاس بندی را اعمال کنید. دستور BC در اینجا برای “محاسبات اساسی” با شماره های نقطه شناور استفاده می شود ، که Bash نمی تواند به تنهایی انجام دهد. پس از آن ، ما براساس ابعاد بزرگتر از x/y مقدار برای استفاده در فیلتر مقیاس ایجاد خواهیم کرد. در -2 مقدار مقابل این به FFMPEG می گوید که نسبت ابعاد را حفظ کند اما مقدار را تنظیم کنید که توسط 2 قابل تقسیم باشد. به این ترتیب ما هیچ مقادیر عجیب و غریب نمی گیریم 487.2 یا چیزی اگر ابعاد خرد شده کامل نباشد.

scale=0.8
width=$(echo "$width * $scale" | bc)
height=$(echo "$height * $scale" | bc)
if [ "$height" -gt "$width" ]; then
  scale="-2:$height"
else
  scale="$width:-2"
fi
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و در آخر این پارامترها را به دستور FFMPEG ما اضافه کنید:

ffmpeg -i "$1" $start $end -loop 1 -an -vf crop="$crop",scale="$scale",fps=fps="$fps" "$4"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، هنگامی که چندین بار اسکریپت خود را روی یک فیلم تلفیقی اجرا می کنیم ، همیشه یک خروجی خرد شده کاملاً بدون میله سیاه را برمی گردیم.

$ vid2webp infile.mp4 0 10 a.webp
$ vid2webp infile.mp4 10 18 b.webp
$ vid2webp infile.mp4 18 25 c.webp
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من این مفهوم را با چند ویژگی اضافی مانند بررسی خطا ، پیش فرض های پیش فرض با ENV VAR و خروجی نامزد خودکار به صورت خودکار ساختم. می توانید نسخه نهایی را از repo github من بگیرید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا