آموزش جامع و کامل کار با ffmpeg

FFmpeg - The Complete Guide

آموزش جامع و کامل کار با ffmpeg

در این مقاله آموزشی ابتدا به معرفی کتابخانه ffmpeg پرداخته و سپس آن را نصب خواهیم کرد. پس از اتمام مراحل نصب وارد کاربردهای فوق العاده آن خواهیم شد و مطمئن هستم که شما نیز جذب قدرت آن می شوید.

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

ffmpeg چیست؟

ffmpeg یک CLI یا ابزار Command Line Interface برای پردازش فایل های مولتی مدیا (ویدیوها، فایل های صوتی و غیره) است. البته لازم به ذکر است که ffpmeg در قالب کتابخانه هایی برای زبان پایتون و زبان های دیگر نیز موجود است بنابراین حتی می توانید در وب سایت خود نیز از آن استفاده کنید. بسیاری از برنامه های پخش و ویرایش ویدیو مانند یوتیوب و VLC از آن استفاده می شود. حتی مرورگر کرومیوم (پایه گوگل کروم) از ffmpeg برای نمایش ویدیو و پخش صوت استفاده می کند.

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

نصب ffmpeg در Ubuntu

حتما می دانید که کاربران لینوکس به انجام کارهای ساده به صورت دستی عادت کرده اند در حالی که کاربران ویندوز برای هر کاری از نرم افزار خاصی استفاده می کنند. این مسئله باعث شده است که ffmpeg بین کاربران لینوکس طرفداران بسیار زیادی پیدا کند چرا که انواع تبدیل فایل های مولتی مدیا را به راحتی انجام می دهد. کاربران Ubuntu برای نصب ffmpeg باید ابتدا repository هایشان را به روز رسانی کنند:

sudo apt update

در مرحله بعدی پکیج ffmpeg را نصب می کنیم:

sudo apt install ffmpeg

با انجام این کار پکیج برایتان نصب می شود. برای اطمینان از این موضوع دستور زیر را در ترمینال خود اجرا کنید:

ffmpeg -version

با اجرای این دستور باید چنین نتیجه ای را دریافت کنید:

ffmpeg version 4.3.1-4ubuntu1 Copyright (c) 2000-2020 the FFmpeg developers

built with gcc 10 (Ubuntu 10.2.0-9ubuntu2)

configuration: --prefix=/usr --extra-version=4ubuntu1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared

libavutil      56. 51.100 / 56. 51.100

libavcodec     58. 91.100 / 58. 91.100

libavformat    58. 45.100 / 58. 45.100

libavdevice    58. 10.100 / 58. 10.100

libavfilter     7. 85.100 /  7. 85.100

libavresample   4.  0.  0 /  4.  0.  0

libswscale      5.  7.100 /  5.  7.100

libswresample   3.  7.100 /  3.  7.100

libpostproc    55.  7.100 / 55.  7.100

با انجام این کار نسخه تقریبا به روزی برایتان نصب می شود اما همانطور که می دانید آپدیت های نرم افزارها با سرعت کمتری در پکیج های Ubuntu منتشر می شوند. به همین خاطر در صورتی که به آخرین و جدیدترین نسخه نیاز دارید (با اعشار آخر) می توانید به ترتیب دستورات زیر را اجرا کنید:

sudo add-apt-repository ppa:jonathonf/ffmpeg-4

sudo apt update

sudo apt install ffmpeg -y

نصب ffmpeg در Arch و Fedora

برای نصب ffmpeg در سیستم های Arch (یا سیستم هایی که بر اساس Arch نوشته شده اند) می توانید از دستور زیر استفاده کنید:

sudo pacman -S ffmpeg

همچنین برای نصب آن در سیستم های Fedora می توانید از این دستور استفاده نمایید:

sudo dnf install ffmpeg

نصب ffmpeg در ویندوز

استفاده از ffmpeg در ویندوز نیز بسیار آسان است و برخلاف بسیاری از برنامه ها به غیر از راه اندازی اولیه نیاز به پیکربندی پیچیده ندارد. در ابتدا باید به صفحه دانلود از وب سایت رسمی ffmpeg به آدرس https://ffmpeg.org/download.html مراجعه کنید. در این وب سایت سیستم عامل های لینوکس و ویندوز و مکینتاش را مشاهده خواهید کرد. به سادگی روی لوگوی ویندوز کلیک کرده و یکی از چند لینک ظاهر شده را انتخاب کنید. در زمان نگارش این مقاله دو وب سایت زیر در بخش ویندوز لیست شده اند:

مهم نیست روی کدام لینک کلیک کنید، مهم این است که به یکی از این وب سایت ها رفته و فایل مورد نظر را دانلود کنید. به طور مثال اگر به وب سایت https://www.gyan.dev/ffmpeg/builds بروید، در قسمت میانی صفحه بخشی به نام git را مشاهده می کنید و در آنجا نسخه های مختلف ffmpeg را می بینید. من نسخه git full را انتخاب می کنم که در زمان نگارش این مقاله لینکی به شکل زیر را دارد:

https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z

SHA256: 0d3dd222731adf98a893a183555f0fe12c395ed2d131d37fe26eee837a446e12

حجم این دانلود معمولا بیشتر از ۴۰ مگابایت نیست. زمانی که این فایل فشرده را دانلود کردید باید آن را از حالت فشرده خارج کنید. این کار با نرم افزار هایی مانند 7zip یا winrar انجام می شود. حالا محتویات استخراج شده را درون پوشه دلخواه و در یکی از درایور های خود قرار بدهید. من شخصا پوشه ای به نام ffmpeg را ایجاد کرده و آن را در درایور C قرار می دهم، سپس محتویات فایل فشرده را درون آن cut می کنم. در نهایت از کنترل پنل (Control Panel) ویندوز عبارت Environment Variables را جست و جو کنید تا متغیر های محلی سیستم باز شوند. روش دیگر این است که روی Computer (همان My Computer در ویندوز ۷) کلیک راست کرده و گزینه Properties را انتخاب کنید. حالا از پنجره باز شده روی Advanced system settings کلیک کرده و گزینه Environment Variables را انتخاب کنید. حالا مسیر پوشه bin از محتویات استخراج شده را به PATH سیستم اضافه کنید (این مسیر برای من C:\ffmpeg\bin است).

با انجام این کار می توانید CMD را باز کرده و دستور زیر را در آن تایپ کنید:

ffmpeg -version

اگر با اجرای این دستور نسخه ffmpeg را به همراه توضیحاتی دریافت کردید یعنی همه چیز را به درستی انجام داده اید اما در صورتی که خطا دریافت کردید و دستور ffmpeg ناشناخته بود یعنی آن را به درستی به PATH سیستم اضافه نکرده اید.

آشنایی با مفاهیم ابتدایی مانند ویدیو و صوت

قبل از آنکه بخواهیم وارد جزئیات کار و نوشتن دستور های مختلف بشویم باید با مفاهیم اولیه مانند ویدیو، صوت، کدک (codec) و امثال آن آشنا شویم تا هدف هر کدام از دستورهای این مقاله را درک کنید.

ویدیو و صوت

در صورتی که شما مجموعه ای از تصاویر را داشته باشید و با سرعت خاصی بین آن ها جا به شوید، توهم حرکت یا انیمیشن برایتان تداعی می شود. ویدیوهای دیجیتال نیز دقیقا با همین مکانیسم عمل می کنند و در اصل تصاویری هستند که به سرعت از جلوی چشمان شما عبور می کنند. مفهوم fps یا فریم بر ثانیه (frames per second) نیز از همینجا آمده است؛ هر فریم یک عکس از مجموعه عکس های ما است و معمولا در هر ثانیه ۳۰ فریم یا تصویر در ویدیوها جا به جا می شوند تا ما آن را به صورت ویدیو ببینم. البته نمایشگرهای مدرن و همچنین ویدیوهای با کیفیت می توانند تا ۳۰۰ فریم بر ثانیه نیز حرکت کنند که تجربه بسیار زیبایی را برای ما ایجاد می کنند.

ویدیو مجموعه ای از تصاویر است که با نام فریم شناخته شده و به سرعت نمایش داده می شوند.
ویدیو مجموعه ای از تصاویر است که با نام فریم شناخته شده و به سرعت نمایش داده می شوند.

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

Codec چیست؟

اگر در هر ثانیه ۳۰ تصویر از جلوی چشمان ما رد شوند، برای یک فیلم یک ساعته چه اتفاقی می افتد؟ طبیعتا در چنین حالتی میلیون ها یا میلیارد ها تصویر را خواهیم داشت و اگر بخواهیم تمام آن ها را در یک فایل قرار داده و اسمش را ویدیو یا فیلم بگذاریم، حجم عظیمی از داده ها را خواهیم داشت. مثلا یک فیلم ساده شاید چند صد گیگابایت حجم داشته باشد! بیایید یک نمونه را محاسبه کنیم.

فرض کنید فیلمی با رزولوشن 1080 در 1920 داشته باشیم و برای هر پیکسل حدود ۳ بایت حجم بگیریم. همچنین فرض می کنیم که این ویدیو ۳۰ دقیقه باشد و با سرعت ۲۴ فریم بر ثانیه حرکت کند:

toppf = 1080 * 1920 //تعداد کل پیکسل ها در هر فریم

cpp = 3 //حجم اشغال شده توسط هر پیکسل به بایت

tis = 30 * 60 //طول ویدیو در واحد ثانیه

fps = 24 //فریم بر ثانیه




required_storage = tis * fps * toppf * cpp

با ضرب تمام این مقادیر در هم متوجه می شویم که حجم این فیلم حدود 268738560000 بایت یا 250.28GB (یعنی ۲۵۰ گیگابایت) خواهد بود! اینجاست که CODEC ها وارد کار می شوند. وظیفه اصلی CODEC فشرده سازی این تصاویر با الگوریتم های خاص خودش است تا واقعا نیازی به ذخیره کردن میلیارد ها فریم نداشته باشیم. به زبان ساده CODEC فایل های ویدیویی را فشرده کرده و در موقع نیاز از حالت فشرده خارج می کند.

از CODEC های معروف می توان به H. 265 و H. 264 و MPEG-4 اشاره کرد. توجه کنید که هر Codec لزوما پسوند اختصاصی برای فایل هایش ندارد. مثلا ممکن است دو فیلم movie.mkv و movie.mp4 را داشته باشیم و با اینکه پسوند هایشان متفاوت است هر دو از یک Codec یکسان استفاده کنند (مثلا هر دو H. 264 باشند)، یعنی با یک الگوریتم یکسان فشرده شده باشند.

Container یا نگهدارنده

container format به فایل هایی گفته می شود که stream های مختلف مانند ویدیو و صوت را در خود دارند و علاوه بر آن اجازه همگام سازی این دو را نیز می دهند. همچنین فایل های container دارای metadata یا اطلاعات جانبی (مانند رزولوشن) در مورد فایل خود هستند. معمولا برای تشخیص container می توانیم به پسوند فایل مورد نظرمان نگاه کنیم. به طور مثال پسوند webm به نگهدارنده webm اشاره می کند:

مفهوم container ها برای فایل های مولتی مدیا
مفهوم container ها برای فایل های مولتی مدیا

توجه داشته باشید که Codec نرم افزار یا الگوریتم خاص برای فشرده سازی است در حالی که container فایل نهایی و اصلی فیلم ما است.

bitrate یا «نرخ بیت»

bitrate به نرخ انتقال اطلاعات (در قالب بیت) در واحد زمانی مشخصی گفته می شود. زمانی که در مورد bitrate برای ویدیوها صحبت می کنیم منظورمان سرعت انتقال اطلاعات ویدیو است. هر چه bitrate یا این سرعت انتقال بیشتر باشد، کیفیت ویدیو بهتر و البته حجم آن بالاتر خواهد بود. معمولا bitrate برای ویدیوهای HD در حدود ۵ تا ۲۰ مگابیت بر ثانیه (Mbps - به b کوچک دقت کنید که نشان دهنده بیت است نه بایت) و برای ویدیوهای عادی بین ۱ تا ۶ مگابیت بر ثانیه است. معمولا ویدیوهایی که با کیفیت استاندارد روی وب سایت ها می بینید در حد ۲ تا ۳ مگابیت بر ثانیه هستند.

تفاوت بیت ریت (bit rate) در یک ویدیوی یکسان
تفاوت بیت ریت (bit rate) در یک ویدیوی یکسان

نام عملیات های رایج ویدیویی

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

Transcoding: به فرآیند تبدیل یکی از stream ها (ویدیو یا صوت) از یک Codec به Codec دیگر، transcoding می گویند. معمولا زمانی از این فرآیند استفاده می شود که دستگاه مورد نظر ما (تلویزیون یا تلفن هوشمند یا ...) از codec مورد نظر پشتیبانی نکند و مجبور به تغییر این codec شویم یا اینکه codec جدیدتری را پیدا کرده ایم که حجم فایل را کمتر می کند و می خواهیم از آن استفاده کنیم.

نحوه ی انجام عملیات transcoding
نحوه انجام عملیات transcoding

Transmuxing: به فرآیند تبدیل از یک container به container دیگر گفته می شود. این فرآیند نیز معمولا به دلیل عدم سازگاری یا پشتیبانی برخی از دستگاه ها انجام می شود تا بتوانیم از فایل مورد نظر استفاده کنیم:

نحوه ی انجام عملیات Transmuxing
نحوه انجام عملیات Transmuxing

Transrating: به فرآیند تغییر bitrate یا ساخت نسخه ای جدید از ویدیو transrating گفته می شود. برخی از وب سایت ها برای کاربرانی که سرعت اینترنت کمتری دارند یک نسخه با bitrate پایین تر نیز ارائه می دهند و این موضوع یکی از کاربردهای اصلی transrating است.

Remuxing: به فرآیند تغییر از یک container به container دیگر remuxing گفته می شود. احتمالا می گویید مگر این تعریف transcoding نبود؟ در remuxing ما فقط container را دوباره بسته بندی می کنیم اما در transcoding پردازش از صفر شروع شده و یک ویدیوی کاملا جدید می سازیم. مثلا اگر بخواهیم یک زیرنویس را به فایل ویدیویی خود بچسبانیم قطعا remux می کنیم. چرا؟ به دلیل اینکه ما اصلا با ویدیو و مشخصات آن (مانند رزولوشن و bitrate) کاری نداریم بلکه می خواهیم یک subtitle track (ترک زیرنویس) را به container اضافه کنیم. طبیعتا remux کردن صد ها برابر سریع تر از transcoding است چرا که به اصل ویدیو دست نمی زنیم و معمولا در حد چند ثانیه طول می کشد. با این حساب در remuxing دست به encoding و decoding نمی زنیم.

Transsizing: به فرآیند تغییر رزولوشن ویدیو transsizing می گویند. دلیل انجام این کار می تواند کاهش اندازه ویدیو برای کاربرانی با اینترنت ضعیف تر باشد.

ساختار کلی دستورات ffmpeg

حالا که با مفاهیم اصلی ffmpeg آشنا شده اید باید به سراغ کار عملی با آن برویم. ساختار کلی یک دستور ffmpeg به شکل زیر است:

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

من کلیت این گزینه ها را توضیح می دهم اما یادتان باشد که تعدادشان بسیار زیاد است و نمی توانیم همه آن ها را بررسی کنیم. شما می توانید تمام این ستورات را در این صفحه github مشاهده کنید.

  • global options یا تنظیمات سراسری، تنظیمات خاصی هستند که می توانید به دستورات ffmpeg خود پاس بدهید و هر کدام کارهای خاصی انجام می دهند. این دستورات به این دلیل «سراسری» نامیده می شوند که روی تمام فرآیند تاثیر می گذارند. مثلا report- یک گزارش از تمام عملیات را آماده می کند یا y- باعث overwrite شدن فایل خروجی می شود (اگر نام فایل ورودی و خروجی یکی باشد فایل ورودی حذف شده و به جای آن فایل خروجی قرار می گیرد) یا vol- باعث تغییر شدت صدا می شود که به صورت پیش فرض روی ۲۵۶ است.
  • input_file_options گزینه هایی برای فایل های ورودی شما را مشخص می کند. بله شما می توانید چندین فایل ورودی داشته باشید و همچنین چندین فایل خروجی داشته باشید. البته حواستان باشد که ابتدا فایل های ورودی را مشخص کرده و سپس فایل های خروجی را مشخص کنید در غیر این صورت با مشکل مواجه می شوید.
  • هر فایلی که با فلگ i- مشخص نشده باشد برای ffmpeg یک فایل خروجی است بنابراین برای مشخص کردن ورودی ابتدا از i- استفاده کرده و سپس نام فایل (input_url) را می آورید. input_url یعنی آدرس فایل، چه به صورت محلی روی سیستم خودتان باشد و چه روی یک سرور دیگر.
  • output_file_options تنظیمات فایل خروجی شما است و شامل مواردی مانند تبدیل ها، مشخص کردن کیفیت، مشخص کردن Codec و امثال آن می شود.
  • output_url نیز آدرس فایل خروجی را مشخص می کند.

در صورتی که چندین فایل ورودی دارید باید تنظیمات را برای هر کدام جداگانه بنویسید، یعنی ابتدا تنظیمات را ذکر کرده و سپس نام فایل اول را می آورید، سپس تنظیمات را ذکر کرده و سپس نام فایل دوم را می آورید الی آخر. برای واضح تر شدن این دستورات چند ده مثال عملی را با هم انجام می دهیم تا کاملا متوجه موضوع بشوید.

نمونه های عملی از دستورات ffmpeg

مطالعه ساختار دستورات ffmpeg به درک شما از این دستورات کمک می کند اما به هیچ عنوان برای کار با ffmpeg کافی نیست به همین دلیل ما در این بخش شروع به بررسی مثال های کاربردی و شایع در هنگام کار با این کتابخانه می کنیم. شما می توانید تمام این دستورات را در یک فایل برای خودتان ذخیره کنید و در هنگام نیاز آن ها را در ترمینال یا CMD کپی کنید.

نمایش اطلاعات فایل ویدیویی/صوتی

در ابتدا یک فایل ویدیویی ساده را آماده کنید تا آن را با هم تست نماییم. ساده ترین کار با ffmpeg نمایش اطلاعات یک فایل ویدیویی است:

ffmpeg -i file_name

فلگ i- مشخص کننده فایل ورودی (input) است و باید به جای file_name نام فایل مورد نظرتان را (با پسوند) قرار بدهید. مثلا:

ffmpeg -i movie.mp4

اجرای چنین دستوری روی فایل من چنین نتیجه ای را می دهد:

ffmpeg version 4.3.1-4ubuntu1 Copyright (c) 2000-2020 the FFmpeg developers

  built with gcc 10 (Ubuntu 10.2.0-9ubuntu2)

  configuration: --prefix=/usr --extra-version=4ubuntu1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared

  WARNING: library configuration mismatch

  avcodec     configuration: --prefix=/usr --extra-version=4ubuntu1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libaribb24 --enable-liblensfun --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc

  libavutil      56. 51.100 / 56. 51.100

  libavcodec     58. 91.100 / 58. 91.100

  libavformat    58. 45.100 / 58. 45.100

  libavdevice    58. 10.100 / 58. 10.100

  libavfilter     7. 85.100 /  7. 85.100

  libavresample   4.  0.  0 /  4.  0.  0

  libswscale      5.  7.100 /  5.  7.100

  libswresample   3.  7.100 /  3.  7.100

  libpostproc    55.  7.100 / 55.  7.100

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'movie.mp4':

  Metadata:

    major_brand     : mp42

    minor_version   : 0

    compatible_brands: isommp42

    creation_time   : 2020-01-11T13:02:11.000000Z

    encoder         : Google

  Duration: 00:33:03.22, start: 0.000000, bitrate: 403 kb/s

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 271 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc (default)

    Metadata:

      creation_time   : 2020-01-11T13:02:11.000000Z

      handler_name    : ISO Media file produced by Google Inc. Created on: 01/11/2020.

    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)

    Metadata:

      creation_time   : 2020-01-11T13:02:11.000000Z

      handler_name    : ISO Media file produced by Google Inc. Created on: 01/11/2020.

At least one output file must be specified

همانطور که می بینید این یک گزارش طولانی است اما قسمت انتهایی آن مربوط به اطلاعات فایل ما است:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'movie.mp4':

  Metadata:

    major_brand     : mp42

    minor_version   : 0

    compatible_brands: isommp42

    creation_time   : 2020-01-11T13:02:11.000000Z

    encoder         : Google

  Duration: 00:33:03.22, start: 0.000000, bitrate: 403 kb/s

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 271 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc (default)

    Metadata:

      creation_time   : 2020-01-11T13:02:11.000000Z

      handler_name    : ISO Media file produced by Google Inc. Created on: 01/11/2020.

    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)

    Metadata:

      creation_time   : 2020-01-11T13:02:11.000000Z

      handler_name    : ISO Media file produced by Google Inc. Created on: 01/11/2020.

At least one output file must be specified

همانطور که می بینید bitrate ویدیوی من ۴۰۳ کیلوبیت است و ۳۳ دقیقه می باشد. Codec استفاده شده در آن h264 است و دارای رزولوشن 1280x720 می باشد. همچنین 29.97 fps یا به زبان ساده ۳۰ فریم بر ثانیه است. در ضمن creation_time زمان ساخت ویدیو است. اگر به قسمت audio توجه کنید می بینید که فرمت صوت در ویدیوی ما aac است. همچنین از نوع stereo و روی ۴۴۱۰۰ هرتز می باشد و bitrate ای برابر با 128 کیلوبیت بر ثانیه دارد. طبیعتا این نتیجه برای فایل شما متفاوت خواهد بود اما کلیت آن بدین شکل است.

در ضمن توجه داشته باشید که این دستور برای فایل های صوتی نیز کار می کند:

ffmpeg -i video_file.mp4

ffmpeg -i audio_file.mp3

تنها مشکل این دستور این است که این دستور اطلاعات اضافی را راجع به ffmpeg نیز چاپ می کند و صفحه ما شلوغ می شود. برای حل این مشکل می توانیم یک فلگ به نام hide_banner- را پاس بدهیم:

ffmpeg -i video_file.mp4 -hide_banner

ffmpeg -i audio_file.mp3 -hide_banner

این فلگ باعث مخفی شدن banner یا همان اطلاعات اولیه ffmpeg می شود بنابراین نتیجه زیر را دریافت می کنیم:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'movie.mp4':

  Metadata:

    major_brand     : mp42

    minor_version   : 0

    compatible_brands: isommp42

    creation_time   : 2020-01-11T13:02:11.000000Z

    encoder         : Google

  Duration: 00:33:03.22, start: 0.000000, bitrate: 403 kb/s

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 271 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc (default)

    Metadata:

      creation_time   : 2020-01-11T13:02:11.000000Z

      handler_name    : ISO Media file produced by Google Inc. Created on: 01/11/2020.

    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)

    Metadata:

      creation_time   : 2020-01-11T13:02:11.000000Z

      handler_name    : ISO Media file produced by Google Inc. Created on: 01/11/2020.

At least one output file must be specified

به همین راحتی اطلاعات یک فایل ویدیویی را دریافت می کنیم بدون اینکه نیازی به شلوغ کردن ترمینال و نمایش اطلاعات اضافی را داشته باشیم. داشتن اطلاعات یک فایل کمک بسیار بزرگی برای شما خواهد بود. مثلا فرض کنید در حال ویرایش یک فیلم در Adobe Premier یا نرم افزار های مشابه هستید و نوبت به گرفتن خروجی می رسد. اگر bitrate بالاتر از فایل اصلی را برای خروجی در نظر بگیرید حجم فایل را افزایش داده اید در حالی که هیچ ارتقاء کیفیتی نخواهیم داشت و اگر bitrate را کمتر از فایل اصلی در نظر بگیرید از کیفیت شما کاسته می شود که مسئله بدی است مگر اینکه بخواهید حجم فایل را کم کنید. بهترین راه این است که bitrate و روزلوشن فایل اصلی را برای فایل خروجی نیز در نظر بگیرید تا حجم و کیفیت فایل خروجی تغییر چندانی نداشته باشد.

تبدیل فرمت فایل های ویدیویی/صوتی

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

برای تبدیل فایل های ویدیویی یا صوتی به فرمت های مختلف در ffmpeg چندین راه وجود دارد که آسان ترین آن ها تغییر پسوند است! بله فقط با تغییر پسوند ffmpeg به صورت خودکار همه چیز را انتخاب کرده و فرآیند transcoding را شروع می کند. به چند مثال زیر دقت کنید:

ffmpeg -i video_input.mp4 video_output.avi

ffmpeg -i video_input.webm video_output.flv

ffmpeg -i audio_input.mp3 audio_output.ogg

ffmpeg -i audio_input.wav audio_output.flac

همانطور که گفتم در ffmpeg هر فایلی که فلگ i- را نداشته باشد به عنوان فایل خروجی در نظر گرفته می شود. در این چهار دستور فایل های صوتی و فایل های ویدیویی را داریم و هر کدام از آن ها را به هر فرمتی که خواستیم تبدیل کرده ایم. تقریبا فرمتی وجود ندارد که ffmpeg از آن پشتیبانی نکند اما در صورتی که می خواهید لیستی از فرمت های پشتیبانی شده (همان container ها) توسط ffmpeg را مشاهده کنید دستور زیر را در ترمینال خود اجرا نمایید:

ffmpeg -formats -hide_banner

با اجرای این دستور لیستی بسیار طولانی (چند صفحه) از فرمت های پشتیبانی شده برایتان چاپ می شود که ابتدای آن بدین شکل است:

File formats:

= Demuxing supported

 .E = Muxing supported

 --

 D  3dostr          3DO STR

  E 3g2             3GP2 (3GPP2 file format)

  E 3gp             3GP (3GPP file format)

 D  4xm             4X Technologies

  E a64             a64 - video for Commodore 64

 D  aa              Audible AA format files

 D  aac             raw ADTS AAC (Advanced Audio Coding)

 DE ac3             raw AC-3

 D  acm             Interplay ACM

 D  act             ACT Voice file format

 D  adf             Artworx Data Format

 D  adp             ADP

 D  ads             Sony PS2 ADS

  E adts            ADTS AAC (Advanced Audio Coding)

 DE adx             CRI ADX

 D  aea             MD STUDIO audio

 D  afc             AFC

 DE aiff            Audio IFF

 D  aix             CRI AIX

 DE alaw            PCM A-law

 D  alias_pix       Alias/Wavefront PIX image

 D  alp             LEGO Racers ALP

 DE alsa            ALSA audio output

 DE amr             3GPP AMR

 D  amrnb           raw AMR-NB

 D  amrwb           raw AMR-WB

 D  anm             Deluxe Paint Animation

 D  apc             CRYO APC

 D  ape             Monkey's Audio

 D  apm             Ubisoft Rayman 2 APM

 DE apng            Animated Portable Network Graphics

 DE aptx            raw aptX (Audio Processing Technology for Bluetooth)

 DE aptx_hd         raw aptX HD (Audio Processing Technology for Bluetooth)

 D  aqtitle         AQTitle subtitles

 D  argo_asf        Argonaut Games ASF

// بقیه فرمت ها

البته در نظر داشته باشید که می توانیم چندین فایل خروجی را نیز داشته باشیم! به طور مثال:

ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg

من در این دستور یک فایل ورودی به نام audio_input.wav دارم و در یک دستور آن را به دو فرمت mp3 و ogg تبدیل کرده ام. توجه کنید که این دستور فایل ورودی را به دو فایل تقسیم نمی کند بلکه یک بار آن را به wav و بار دوم آن را به ogg تبدیل می کند (فایل های wav و ogg از نظر محتوا یکی هستند).

نکته: این روش باعث transcode شدن فایل می شود، یعنی فایل خروجی از صفر ساخته می شود بنابراین عملیات، بر اساس حجم و کیفیت فایل ورودی، چندین دقیقه طول خواهد کشید.

روشی که تا این لحظه از آن استفاده می کنیم بسیار ساده است و روش های دیگری نیز برای انجام این کار وجود دارد که پیشرفته تر هستند. به طور مثال با پاس دادن گزینه qscale به فایل خروجی و تنظیم آن روی صفر، کیفیت فایل را در بهترین حالت ممکن نگه می داریم تا در حد ممکن به فایل اصلی نزدیک باشد:

ffmpeg -i video_input.wav -qscale 0 video_output.mp4

با انجام این کار فایل wav به یک فایل mp4 با کیفیت تقریبا یکسان تبدیل می شود. توجه داشته باشید که هنوز هم در حال transcode کردن هستیم.

یکی دیگر از گزینه های دیگر در تبدیل فرمت مشخص کردن codec است که با پاس دادن فلگ c- انجام می شود. به مثال زیر توجه کنید:

ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 video.webm

من ابتدا c- را پاس داده ام که یعنی می خواهم codec را مشخص کنم، سپس حرف v را به آن داده ام که یعنی فقط video codec را مشخص خواهم کرد (codec مسئول ویدیو) و با قسمت صوت کاری ندارم. در صورتی که می خواهید کدک صوتی را مشخص کنید باید به جای v از a استفاده کنید (یعنی c:a-).

بهتر است قبل از توضیح ادامه این دستور نکته خاصی را بدانید: گزینه c:v مشخص کننده کدک ویدیویی است و دستور معادلی به نام codec:v دارد. c:v با codec:v هیچ تفاوتی ندارند و c:v حالت خلاصه آن است. همچنین گزینه ای به نام vcodec وجود دارد که باز هم معادل codec:v و c:v است بنابراین هر سه یکی هستند. توضیح این موضوع لازم بود تا اگر در جایی از اینترنت با یکی از این سه پارامتر روبرو شدید مفهوم آن ها را بدانید.

حالا به توضیح دستور برمی گردیم؛ با مشخص کردن c:v- می گوییم که قصد مشخص کردن کدک ویدیویی را داریم حالا این کدک چه چیزی باشد؟ من در این مثال کدک libvpx-vp9 را انتخاب کرده ام اما شما می توانید هر کدک دیگری را مشخص کنید. این کدک VP9 نام دارد و برای فایل های فایل های WebM استفاده می شود. شاید بپرسید از کجا بدانیم چه کدک هایی وجود دارند؟ شما می توانید با اجرای دستور زیر به لیست کامل کدک های ffmpeg دسترسی داشته باشید:

ffmpeg -codecs -hide_banner

طبیعتا این لیست بسیار طولانی است اما نکته مهمی در این لیست وجود دارد که باید برایتان توضیح بدهم. با اجرای دستور زیر چنین نتیجه ای را می گیرید:

Codecs:

 D..... = Decoding supported

 .E.... = Encoding supported

 ..V... = Video codec

 ..A... = Audio codec

 ..S... = Subtitle codec

 ...I.. = Intra frame-only codec

 ....L. = Lossy compression

 .....S = Lossless compression

 -------

 D.VI.S 012v                 Uncompressed 4:2:2 10-bit

 D.V.L. 4xm                  4X Movie

 D.VI.S 8bps                 QuickTime 8BPS video

 .EVIL. a64_multi            Multicolor charset for Commodore 64 (encoders: a64multi )

 .EVIL. a64_multi5           Multicolor charset for Commodore 64, extended with 5th color (colram) (encoders: a64multi5 )

 D.V..S aasc                 Autodesk RLE

 D.V.L. agm                  Amuse Graphics Movie

 D.VIL. aic                  Apple Intermediate Codec

 DEVI.S alias_pix            Alias/Wavefront PIX image

 DEVIL. amv                  AMV Video

// دیگر کدک های موجود

شما در این لیست کدک های مختلف را مشاهده می کنید. مثلا اولین کدک 012v نام دارد اما قبل از آن حروف خاصی مانند D.VI.S را مشاهده می کنید که هر کدام معنای خاصی را دارند:

 D..... = Decoding وجود قابلیت

 .E.... = Encoding وجود قابلیت

 ..V... = یک کدک ویدیویی است

 ..A... = یک کدک صوتی است

 ..S... = یک کدک زیرنویس است

 ...I.. = تنها کدک بین فریمی است

 ....L. = فشرده سازی با کاهش کیفیت همراه است

 .....S = فشرده سازی بدون کاهش کیفیت است

حالا متوجه کارکرد هر کدام از این کدک ها می شوید. ما معمولا از کدک های مشهور استفاده می کنیم که چند مورد را در لیست زیر برایتان آورده ام:

  • کدک H.265 که در ffmpeg نام hevc را دارد.
  • کدک H.264 و MPEG-4 که در ffmpeg نام h264 را دارد.
  • کدک Avid AVI که در ffmpeg نام avrn را دارد.
  • کدک FLV که در ffmpeg نام flv1 را دارد.

همچنین در نظر داشته باشید که برای لیست کردن encoder ها می توانیم از دستور زیر استفاده کنیم:

ffmpeg -encoders -hide_banner

با اجرای این دستور نتیجه ای شبیه به این گزارش زیر را دریافت می کنید:

Encoders:

 V..... = Video

 A..... = Audio

 S..... = Subtitle

 .F.... = Frame-level multithreading

 ..S... = Slice-level multithreading

 ...X.. = Codec is experimental

 ....B. = Supports draw_horiz_band

 .....D = Supports direct rendering method 1

 ------

 V..... a64multi             Multicolor charset for Commodore 64 (codec a64_multi)

 V..... a64multi5            Multicolor charset for Commodore 64, extended with 5th color (colram) (codec a64_multi5)

 V..... alias_pix            Alias/Wavefront PIX image

 V..... amv                  AMV Video

 V..... apng                 APNG (Animated Portable Network Graphics) image

 V..... asv1                 ASUS V1

 V..... asv2                 ASUS V2

 V..X.. libaom-av1           libaom AV1 (codec av1)

// ادامه گزارش

بنابراین در صورتی که بخواهیم encoder را نیز خودتان انتخاب کنید، دستتان باز است.

حالا اگر نخواهیم transcoding داشته باشیم چطور؟ آیا می توانیم bitstream (داده های ویدیو) را کاملا کپی کنیم و آن را از صفر نسازیم؟ بله! به مثال زیر توجه کنید:

ffmpeg -i video_input.mp4 -c:v copy -c:a libvorbis video_output.avi

در اینجا c:v را روی copy گذاشته ام که یعنی bitstream یا داده های ویدیو کاملا کپی شوند و هیچ عملیات محاسباتی را روی آن انجام ندهیم (transcoding انجام نمی شود) اما کدک صوتی (c:a-) را تغییر داده ام و آن را روی libvorbis گذاشته ام. در این حالت پسوند فایل می تواند فریبنده باشد چرا که از mp4 به avi تبدیل شده است اما در اصل bitstream همان bitstream مربوط به mp4 است و اصلا تغییری نکرده است! در این حالت از آنجایی که transcoding انجام نمی شود سرعت عملیات بسیار سریع تر از روش transcoding است.

استخراج صوت از ویدیو

یکی از کاربردهای عالی ffmpeg استخراج صوت از ویدیو است. برای انجام این کار از فلگ vn- استفاده می کنیم. مثال:

ffmpeg -i video.mp4 -vn audio.mp3

طبیعتا می توانید به جای audio.mp3 هر نام دیگری را برای فایل خروجی انتخاب کنید و حتی codec های آن را نیز به روش توضیح داده شده در بخش قبل مشخص کنید. فلگ vn- باعث حذف ویدیو به صورت کامل می شود بنابراین خروجی قطعا صوت خالص است. توجه کنید که این دستور از bitrate فایل اصلی برای خروجی گرفتن از صوت استفاده می کند اما شما می توانید آن را تغییر دهید و پیشنهاد نیز می شود که آن را تغییر دهید چرا که در حالت عادی ممکن است حجم فایل صوتی استخراج شده بیش از اندازه بزرگ شود مگر آنکه bitrate را تغییر دهید:

ffmpeg -i video.mp4 -vn -ab 128k audio.mp3

فلگ ab- (یا دستور معادل آن b:a-) به شما اجازه می دهد bitrate را تنظیم کنید که به صورت پیش فرض روی 128000 بیت یا ۱۲۸ کیلوبیت است. همانطور که در کد بالا مشاهده می کنید، من آن را روی ۱۲۸ کیلوبیت گذاشته ام. فرآیند استخراج صوت از ویدیو فرآیند ساده ای است بنابراین زمان کمی خواهد برد. همچنین در نظر داشته باشید که بالاترین bitrate پشتیبانی شده در mp3 مقدار 320k است. از گزینه های معروف دیگر در این زمینه می توان به این گزینه ها اشاره کرد:

  • گزینه ar- که برای تنظیم audio frequency است.
  • گزینه ac- که تعداد کانال های صوتی (audio channel) را مشخص می کند.
  • گزینه f- که format را مشخص می کند. معمولا به این گزینه نیازی نیست چرا که به صورت خودکار از روی پسوند فایل مشخص می شود.

در ضمن یادتان باشد که ab- دقیقا برابر با b:a- است و تفاوتی بین آن ها وجود ندارد:

ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3

این دستور دقیقا معادل دستور زیر است:

ffmpeg -i video.mov -vn -ar 44100 -ac 2 -ab 128k -f mp3 audio.mp3

حذف صوت از ویدیو

ما در بخش قبلی ویدیو را حذف کردیم اما این بار نیاز به حذف صوت داریم بنابراین به جای vn- از فلگ an- استفاده می کنیم:

ffmpeg -i video_input.mp4 -an -video_output.mp4

با انجام این کار صوت به طور کامل حذف می شود و هر گزینه ای مربوط به صوت را که پاس داده باشید غیر فعال می کند.

استخراج تصویر از فیلم

برخی اوقات ویدیویی داریم که محتوای آن از نوع sideshow است (مانند ویدیوهایی که از powerpoint گرفته می شود) و ما می خواهیم slide های آن را به صورت تصویر داشته باشیم. من ابتدا دستور کامل آن را قرار می دهم و سپس بخش های مختلف آن را توضیح می دهم:

ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png

فلگ r- مشخص کننده frame rate است یعنی چه تعداد فریم در ثانیه به درون تصاویر استخراج شود. این مقدار به صورت پیش فرض روی ۲۵ است که بیش از حد زیاد است و من آن را روی ۱ گذاشته ام. f- مشخص کننده فرمت خروجی (همان container) است که من آن را روی image2 گذاشته ام. آخرین نکته، نام فایل خروجی است که قسمت عجیبی به نام 3d% دارد. این بخش مخفف 3 digits است که یعنی تصاویر ما به صورت سه رقمی نام گذاری شوند (مثلا image-000.png و image-001.png و image-002.png و الی آخر). طبیعتا اگر به جای 3d% از 2d% استفاده می کردید اعداد انتهایی نام فایل به صورت دو رقمی نام گذاری می شدند (image-00.png و image-01.png و ...).

در نظر داشته باشید که با دستور بالا در هر فریم یک تصویر را می سازیم بنابراین یک فیلم چند دقیقه ای صد ها تصویر تولید خواهد کرد!

تغییر رزولوشن یا aspect ratio

aspect ratio به معنی نسبت طول به عرض تصویر است. ما با استفاده از ffmpeg می توانیم رزولوشن و aspect ratio را تغییر بدهیم. برای تغییر رزولوشن باید از فلگ s- استفاده کنیم (مشخص کننده size) و رزولوشن جدید را به آن پاس بدهیم:

ffmpeg -i video_input.mov -s 1024x576 video_output.mp4

با این کار ویدیوی ما به رزولوشن 1024x576 تغییر می کند. طبیعتا شما می توانید این دستور را با توضیحات قبلی ترکیب کنید. مثلا صوت را نیز در همین تصویر ویرایش کنید:

ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov

برای تغییر aspect ratio نیز باید از فلگ aspect- استفاده نمایید:

ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4

من نسبت طول به عرض را روی ۴:۳ قرار داده ام.

اضافه کردن album art

حتما شما هم دیده اید که برخی از فایل های صوتی دارای یک تصویر هستند و زمانی که این فایل صوتی را با می کنید تصویرش را مشاهده می کنید. معمولا این تصویر در بین مردم به album art (کاور آلبوم) معروف است چرا که بیشتر برای فایل های موسیقی دیده می شود. برای انجام این کار از دستور زیر استفاده می نماییم:

ffmpeg -i in.mp3 -i test.png -map 0:0 -map 1:0 -c copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" out.mp3

طبیعتا باید به جای test.png نام تصویر مورد نظر را قرار بدهید تا به in.mp3 چسبیده شود. همانطور که می بینید من کدک را کپی کرده ام (c copy-) تا تغییری در ساختار فایل ایجاد نشود. همچنین  metadata- را نیز تغییر داده ایم. همانطور که گفتم metadata اطلاعات اضافی و جانبی فایل است. مثلا ما در اینجا title تصویر اضافه شده را album cover گذاشته ایم و comment آن را نیز coverr front گذاشته ایم اما هر دوی این مقادیر کاملا دلخواه هستند و می توانید هر چیز دیگری برایشان بنویسید.

روش دیگری نیز برای اضافه کردن تصویر به صوت وجود دارد اما با اضافه کردن album art کاملا متفاوت است! چطور؟ در دستور قبلی ما فقط یک تصویر را به ویدیو اضافه می کردیم و حجم فایل صوتی شما فقط به اندازه همان تصویر بالا می رفت و هیچ تغییری در ساختار تصویر ایجاد نمی شد اما دستور زیر تصویر را گرفته و آن را به یک فیلم تبدیل می کند!

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4

در اینجا تصویر به عنوان ظاهر ثابت ویدیو نمایش داده می شود و صدا در کنار آن قرار می گیرد. همچنین می بینید که من bitrate را به ۱۹۲ کیلوبیت تغییر داده ام تا حجم ویدیو زیاد نشود. در ضمن در صورتی که از نسخه های 4 به بعد ffmpeg استفاده می کنید نیازی به استفاده از فلگ strict experimental- ندارید.

استفاده کاربردی این روش این است که در سایت هایی مانند یوتیوب یا فیسبوک اجازه آپلود صوت را ندارید و باید حتما یک ویدیو را آپلود نمایید. با انجام این کار می توانید صوت مورد نظر را به ویدیو تبدیل کرده و آپلود نمایید.

اضافه کردن زیرنویس به فیلم

یکی از رایج ترین کاربردهای برنامه های ویرایش صوت و تصویر این است که زیرنویسی را به فیلمی اضافه کنند. برای انجام این کار می توانید به راحتی از روش زیر استفاده نمایید:

ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4

طبیعتا به جای video.mp4 باید نام ویدیوی خود را قرار بدهید و به جای subtitle.srt نام فایل زیرنویس خودتان با فرمت srt را بنویسید. نیازی به دستکاری دیگر گزینه ها نیست. با اجرای این دستور یک track جدید به container شما اضافه می شود که حاوی زیرنویس است و اگر player (نرم افزاری که با آن ویدیو را باز می کنید) از زیرنویس پشتیبانی کند، آن را برایتان نمایش خواهد داد.

مزیت انجام این کار این است که می توانید زیر نویس را غیر فعال یا فعال کنید اما روش دیگری به نام hardsub وجود دارد که با آن می توانید زیر نویس را روی فیلم burn کنید، یعنی زیرنویس دیگر نوشته اضافه شده به فیلم نیست بلکه جزئی از پیکسل های فیلم است و دیگر غیر فعال نمی شود. برای انجام این کار می توانید از دستور زیر استفاده نمایید:

ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi

همچنین اگر یک فیلم را دارید که از روش اول برای اضافه کردن زیرنویس استفاده کرده است و حالا فایل srt آن را ندارید اما می خواهید آن زیرنویس را به روش دوم (hardsub) تبدیل کنید، دستور زیر به شما کمک خواهد کرد:

ffmpeg -i video.mkv -vf subtitles=video.mkv out.avi

فشرده سازی فایل های ویدیویی

در بسیاری از مواقع با فیلم های بزرگی روبرو می شویم و می خواهیم حجم آن ها را کم کنیم. به طور مثال زمانی که می خواهید یک ویدیو را از طریق ایمیل برای دوست خود ارسال کنید یا ویدیویی را در شبکه های اجتماعی به اشتراک بگذارید یا یک ویدیوی تبلیغاتی را برای شرکت خود درست کنید تا مردم آن را ببینند. در تمام این حالات، حجم فایل کمتر بهتر است و مردم را ترغیب می کند تا فایل شما را باز کنند.

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

بحث اول برای فشرده سازی فایل های صوتی است. فایل های صوتی مانند فایل های ویدیویی چندین جنبه مختلف و موثر در حجم ندارند بلکه فقط یک عامل در حجم آن ها موثر است و آن هم bitrate می باشد بنابراین می توانیم آن را کاهش دهیم:

ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3

ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3

همانطور که قبلا هم توضیح دادم ab- و b:a- هر دو یکی هستند و هیچ تفاوتی ندارند. در دستور اول bitrate را روی ۱۲۸ کیلوبیت و در دستور دوم آن را روی ۱۹۲ کیلوبیت قرار داده ایم. معمولا bitrate های مشهور 96k, 112k, 128k, 160k, 192k, 256k, 320k هستند. طبیعتا هر چه bitrate بیشتر باشد کیفیت صوت و همچنین اندازه فایل آن بیشتر می شود.

اما فایل های ویدیویی چطور؟ فاکتورهای مختلفی در فشرده سازی فایل های ویدیویی نقش دارند بنابراین می توانیم از چندین جنبه به آن ها نگاه کنیم. اولین مسئله کاهش bitrate ویدیو است:

ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4

این دستور چیزی برای توضیح ندار به جز فلگ bufsize- که جدید است. زمانی که شما می خواهید bitrarte ویدیو را تغییر بدهید باید یک مقدار مشخص را به آن بدهید. مثلا در دستور بالا ۱۰۰۰ کیلوبیت یا یک مگابیت را مشخص کرده ایم اما واقعیت این است که این یک مگابیت فقط یک متوسط است. ffmpeg سعی می کند متوسط bitrate شما را در بازه های زمانی خاص روی یک مگابیت نگه دارد. مشکل اینجاست که اگر این بازه های زمانی را خودمان مشخص نکنیم احتمال دارد بازه ها بیش از حد طولانی شوند که یعنی bitrate ما بیش از حد از متوسط بیشتر شده یا بیش از حد از آن کمتر می شود (نوسان شدیدتر). برای حل این مشکل می توانیم bufsize- را مشخص کرده و مقدار کمتری را به آن بدهیم. هر چه مقدار bufsize کمتر باشد ffmpeg در بازه های زمانی کوتاه تری bitrate را بررسی می کند تا مطمئن شود که bitrate روی مقدار متوسط است.

در ffmpeg فلگی به نام crf وجود دارد که مخفف Constant Rate Factor است. هر چه مقدار crf کمتر باشد bitrate شما بیشتر خواهد بود. اگر ما crf را با یک CODEC عالی برای فشرده سازی به نام libx264 ترکیب کنیم، یک فشرده سازی ایده آل را خواهیم داشت که معمولا از دستکاری bitrate بهتر جواب می دهد:

ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4

معمولا crf برای فشرده سازی بین ۲۰ تا ۳۰ در نظر گرفته می شود اما شما می توانید با مقادیر مختلف بازی کنید و نتیجه هر حالت را ببینید تا به حالت ایده آل خودتان دست پیدا کنید.

روش بعدی فشرده سازی کاهش frame rate است که بنده اصلا پیشنهاد نمی کنم چرا که باعث کند شدن ویدیو و تکه تکه شدن آن می شود اما ممکن است در بعضی مواقع خاص استفاده شود:

ffmpeg -i video_input.mp4 -r 24 video_output.mp4

با این دستور، frame rate ویدیو را روی ۲۴ فریم بر ثانیه تنظیم کرده ایم.

روش بعدی کاهش رزولوشن تصویر (تعداد پیکسل های فیلم) است. من قبلا توضیح داده بودم که برای انجام این کار از فلگ s- استفاده می کنیم:

ffmpeg -i video_input.mov -s 1024x576 video_output.mp4

روش بعدی این است که صوت را نیز فشرده کنید! هر container حاوی فیلم و صوت آن فیلم است بنابراین کاهش حجم صوت به کاهش حجم فیلم نیز می انجامد:

ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4

فلگ ac- تعداد کانال های صوتی را مشخص می کند و من آن را روی ۲ گذاشته ام تا صوت ما استریو باشد. همچنین strict- را نیز ffmpeg را مجبور می کند که این کار را انجام بدهد و حتما تنظیمات انتخاب شده توسط ما را اعمال کند. استریو کردن صوت یکی از راه های مناسب برای افزایش کیفیت صدا بدون افزایش حجم زیاد آن است.

بریدن (cut) فایل ها مولتی مدیا

در بسیاری از اوقات لازم است که یک فایل را برش بزنیم و قسمت خاصی را از آن استخراج کنیم. اگر بخواهید برش را از ابتدای فایل شروع کنید تنها با استفاده از t- یک مدت زمان را محاسبه می کنید:

ffmpeg -i input_video.mp4 -t 5 output_video.mp4

ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav

من در دستور اول عدد ۵ را به t- داده ام که یعنی ۵ ثانیه اول فایل ویدیویی را می خواهم و بقیه اش برایم مهم نیست. در این حالت ۵ ثانیه duration یا «طول مدت» بخش مورد نظر ما است. در دستور دوم نیز ۵ ثانیه اول فایل صوتی را می خواهم اما در این حالت به جای duration از end time استفاده کرده ایم. یعنی چه؟ یعنی زمان پایانی برش را مشخص کرده ایم. آیا این دو حالت تفاوتی با هم دارند؟ اگر مانند این مثال بخواهید از ابتدای فایل برش بزنید هیچ تفاوتی ندارند و هر دو ۵ ثانیه اول را  به ما می دهند. طبیعتا از دستورات بالا مشخص است که برش زدن فایل برای فایل های صوتی یا ویدیویی تفاوتی ندارد.

سوال بعدی اینجاست که اگر نخواهیم از ابتدای فایل برش بزنیم چطور؟ در این حالت باید از ss- برای مشخص کردن ابتدای بازه و to- برای مشخص کردن انتهای بازه استفاده کنید. به چند مثال زیر توجه کنید:

ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3

ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav

ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264

ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg

همانطور که گفتم ss- شروع بازه را مشخص می کند بنابراین در دستور اول گفته ایم از دقیقه ۱ و ۱۴ ثانیه به بعد را برش بزند (یعنی قبل از آن را نمی خواهیم). در دستور دوم از ثانیه ۳۰ شروع کرده ایم اما به جای end time (فلگ to-) از duration (فلگ t-) استفاده کرده ام. یعنی چه؟ یعنی از ثانیه ۳۰ شروع کن و تا ۱۰ ثانیه بعد را برش بزن (فایل نهایی از ثانیه ۳۰ تا ثانیه ۴۰ خواهد بود). در دستور سوم ابتدا و انتهای بازه را مشخص کرده ایم که یعنی از دقیقه ۱ و ۳۰ تا دقیقه ۱ و ۴۰ را برش زده ایم. نهایتا دستور چهارم را داریم که در آن ss- (شروع بازه) را مشخص کرده ایم تا روی ۵ ثانیه باشد. یعنی شروع از ثانیه پنجم باشد یا به زبان دیگر ۵ ثانیه اول از فایل حذف می شود.

عملیات های پیشرفته تر ffmpeg

تا این قسمت هر چیزی که برایتان توضیح دادم از عملیات های ساده ffmpeg بود اما می توانیم عملیات های بسیار پیشرفته تری را نیز با آن انجام بدهیم. عملیات های مختلفی که در این بخش توضیح داده می شود نسبت به عملیات های قبلی دارای جزئیات بیشتر و شاید استفاده کمتری باشند. این بخش مخصوص کاربران لینوکس است اما کاربران ویندوز نیز می توانند با کمی جست و جو با این قابلیت ها آشنا شوند.

۱. تقسیم فایل های مولتی مدیا

اولین استفاده پیشرفته از ffmpeg تقسیم کردن یا splitting فایل های مولتی مدیا است. ما در بخش قبل در مورد cut کردن یا trim کردن فایل های مولتی مدیا صحبت کردیم اما split کردن (تقسیم کردن) با آن تفاوت دارد. چطور؟ زمانی که یک فایل مولتی مدیا را cut می کنیم، یعنی فقط قسمتی از آن را استخراج می کنیم و دیگر قسمت ها حذف می شوند اما زمانی که از split کردن صحبت می کنیم منظورمان گرفتن چند فایل خروجی از یک فایل ورودی است. به دستور زیر توجه کنید:

ffmpeg -i video.mp4 -t 00:00:30 video_1.mp4 -ss 00:00:30 video_2.mp4

ما در این دستور یک ویدیوی ورودی به نام video.mp4 را داریم اما می خواهیم چند خروجی مختلف از آن داشته باشیم. در قسمت اول از t- (مدت زمان یا duration) استفاده کرده ایم و ۳۰ ثانیه اول را مشخص کرده ایم. یعنی چه؟ یعنی خروجی اول ما که فایلی با نام video_1.mp4 خواهد بود فقط ۳۰ ثانیه اول فایل video.mp4 می باشد. در مرحله بعدی از ss- (زمان شروع یا start time) استفاده کرده ایم و ثانیه ۳۰ را برایش مشخص کرده ایم. یعنی خروجی دوم که video_2.mp4 نام خواهد داشت از ثانیه ۳۰ به بعد را شامل می شود (۳۰ ثانیه اول حذف خواهد شد).

با انجام این کار دو ویدیوی خروجی را دریافت کرده ایم که اولی شامل ۳۰ ثانیه ابتدای فیلم و دومی شامل بقیه فیلم است. به همین راحتی یک فیلم را به دو قسمت تقسیم کرده ایم. در نظر داشته باشید که می توانید هر تعداد قسمت را به همین شکل مشخص کنید و مثلا یک فیلم را به ۱۰ قسمت مختلف تقسیم نمایید.

۲. چسباندن فایل های مولتی مدیا

این عملیات دقیقا برعکس عملیات قبلی است، یعنی در آن سعی می کنیم چند فایل مختلف را به همدیگر چسبانده و یک خروجی از آن بگیریم. اگر بخواهیم دستورات این بخش را به صورت دستی و درون ترمینال بنویسیم همه چیز شلوغ و ناخوانا می شود بنابراین از روش بهتری استفاده می کنیم: فایل متنی! شما باید یک فایل متنی ساده (txt) ایجاد کنید و نامش را هر چیزی که می خواهید بگذارید (من نام فایل خودم را videos_to_join.txt می گذارم). کاربران لینوکس می توانند این کار را از درون ترمینال خود انجام بدهند:

touch videos_to_join.txt

vim videos_to_join.txt

کاربران ویندوز نیز می توانند به هر روشی که دوست دارند فایل متنی خود را ایجاد کنند. زمانی که این فایل متنی را باز کردید باید به نام فایل هایی که می خواهید ترکیب شوند را به همراه مسیر کاملشان بنویسید. البته در هنگام نوشتن باید به چند نکته مهم توجه کنید:

  • آدرس هر فایل باید در یک خط جداگانه نوشته شود و پشت سر هم نباشند.
  • ترتیب نوشتن فایل ها اهمیت دارد. هر فایلی که در ابتدا نوشته شود، به عنوان فایل اول قرار می گیرد.
  • تمام فایل ها باید پسوند یکسانی داشته باشند (یک نوع container باشند).

من از ubuntu استفاده می کنم به همین دلیل آدرس هایی که در فایل متنی ام می نویسم به شکل زیر خواهند بود:

/home/ubuntu/Desktop/video_1.mp4

/home/ubuntu/Desktop/video_2.mp4

/home/ubuntu/Desktop/video_3.mp4

طبیعتا در ویندوز آدرس شما چیزی شبیه به D:\movies\video_1.mp4 خواهد بود. این روش برای هر فایل ویدیویی یا صوتی کار می کند بنابراین هر تعداد فایل مورد نظر را در این فایل اضافه کرده و سپس آن را ذخیره کنید. تنها کاری که باقی مانده است باز کردن ترمینال یا CMD در محل این فایل و اجرای دستور زیر در آن است:

ffmpeg -f concat -i videos_to_join.txt output.mp4

concat مخفف concatenation یا «الحاق» است. با اجرای این دستور و مشخص کردن فایل متنی videos_to_join.txt به عنوان ورودی (با فلگ i-) یک فایل خروجی را خواهیم داشت.

۳. ادغام تصاویر در یک ویدیو

ما می توانیم با استفاده از ffmpeg تصاویر مختلف را به هم چسبانده و آن ها را به یک ویدیو تبدیل کنیم. این کار معمولا برای ساخت slideshow های ویدیویی کاربرد دارد و طبیعتا می توانید صوتی مانند یک آهنگ را نیز به آن اضافه کنید.

اگر قصد انجام چنین کاری را دارید در ابتدا باید مطمئن شویم تمام تصاویر مورد نظر شما درون یک پوشه قرار دارند. من پوشه جدیدی به نام my_photos را می سازم و سپس تمام تصاویر خودم را درون آن قرار می دهم. معمولا پسوند های پیشنهاد شده برای تصاویر png یا jpg هستند بنابراین بهتر است از آن ها استفاده کنید. همچنین باید مطمئن شوید که پسوند تمام تصاویر یکی است (یا همه png یا همه jpg باشند) در غیر این صورت ممکن است محصول نهایی شما با مشکلات خاصی مواجه شود. در صورتی که نیاز دارید برخی از تصاویر را به فرمت خاصی تبدیل کنید چطور؟ در این مقاله بار ها در این مورد صحبت کرده ایم و می دانیم که با تغییر پسوند در ffmpeg می توانید آن تصویر را تبدیل کنید.

برای اجرای خود عملیات نیز چند نکته مهم وجود دارد. اولا باید فرمت (f-) تصاویر ورودی روی image2pipe باشد. این فرمت به ما اجازه عملیات pipe را می دهد، یعنی اجازه می دهد که ابتدا با دستور cat تمام محتویات پوشه my_photos را خوانده و سپس آن را به ffmpeg پاس بدهیم:

cat my_photos/* | ffmpeg -f image2pipe -i - -c:v copy video.mkv

دستور cat در لینوکس و سیستم های Unix محتویات یک فایل یا یک مسیر را نمایش می دهد. من از این دستور استفاده کرده ام و محتویات درون پوشه my_photos را خوانده ام. حالا با علامت | نام تصاویر خوانده شده توسط cat را به سمت ffmpeg ارسال کرده ام که به آن pipe کردن می گویند. حالا ffmpeg را صدا زده و فرمت (f-) را روی image2pipe می گذاریم. از آنجایی که ورودی ما (نام تصاویر) با دستور cat ارسال شده است دیگر نیازی به مشخص کردن ورودی نداریم بنابراین به جای آن یک علامت خط فاصله گذاشته ایم (دقیقا بعد از i-). نهایتا کدک ویدیو را نیز کپی کرده ایم و یک ویدیوی mkv را خواهیم داشت. اگر از کاربران ویندوز هستید پیشنهاد می کنم از git bash یا cmder یا ترمینال های مشابه استفاده کنید تا دستور cat را داشته باشید.

در حال حاضر اگر این فایل ویدیویی را پخش کنید، متوجه خواهید شد که برخی از عکس ها اصلا در ویدیو حضور ندارند! چرا؟ در واقع تمام تصاویر اضافه شده اند اما مشکل اینجاست که ffmpeg بسیار سریع از آن ها رد شده است و برای هر تصویر فقط یک فریم را در نظر گرفته است در حالی که خود ffmpeg به صورت پیش فرض روی ۲۳ فریم بر ثانیه کار می کند! با این حساب ۲۳ تصویر در یک ثانیه برایمان نمایش داده می شوند! برای حل این مشکل باید frame rate را نیز با فلگ framerate- مشخص کنیم:

cat my_photos/* | ffmpeg -framerate 1 -f image2pipe -i - -c:v copy video.mkv

من در دستور بالا frame rate را روی ۱ گذاشته ام تا دیگر با سرعت ۲۳ فریم بر ثانیه برای هر تک تصویر حرکت نکنیم. این یعنی هر فریم (و طبیعتا هر تصویر) تا ۱ ثانیه نمایش داده می شود.

سوال بعدی اینجاست که اگر بخواهیم صوتی را نیز به این ویدیو اضافه کنیم چطور؟ برای این کار یک فایل صوتی را نیز به عنوان ورودی دیگری مشخص می کنید، سپس کدک آن را نیز کپی می کنید (c:a copy-) اما از آنجایی که می خواهیم کدک ویدیو را نیز کپی کنیم از دستور خلاصه c copy- استفاده می کنیم تا هر دو کدک ویدیو و صوت کپی شوند. در نهایت یک بحث باقی می ماند: چطور طول ویدیو و صوت را یکی کنیم؟ برای این کار تعداد تصاویر را بر طول صوت (بر واحد ثانیه) تقسیم کنید. مثلا طول فایل صوتی من ۲۲ ثانیه است و ۹ تصویر دارم. اگر ۹ را بر ۲۲ تقسیم کنیم عدد ۰.۴۰ را به دست می آوریم بنابراین باید frame rate خود را روی این عدد بگذاریم:

cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv

۴. ضبط صفحه نمایش!

بله تیتر را درست خوانده اید! شما می توانید با استفاده از ffmpeg صفحه نمایش خود را ضبط کنید! دقیقا مانند یک نرم افزار screen recorder! انجام این کار اصلا سخت نیست اما نکات خاصی دارد که باید قبل از انجام کار با آن آشنا باشید. نکته اول فرمت ضبط است. برای ضبط صفحه حتما باید فرمت x11grab را انتخاب نمایید. نکته دوم تنظیم ورودی روی صفحه نمایش مورد نظر شما است. برخی از افراد چندین مانیتور را به یک کیس متصل می کنند بنابراین باید مشخص کنیم قصد ضبط کدام مانیتور را داریم. افرادی که فقط یک مانیتور دارند یا از لپتاپ استفاده می کنند معمولا عدد 0:0 را به عنوان ورودی تعیین می کنند. نکته سوم مشخص کردن رزولوشن آن مانیتور خاص است. من از یک لپتاپ با رزولوشن ۱۳۶۶ در ۷۶۸ استفاده می کنم بنابراین رزولوشن من این است. در نظر داشته باشید که رزولوشن حتما باید قبل از فلگ i- (ورودی) مشخص شده باشد:

ffmpeg -f x11grab -s 1366x768 -i :0.0 output.mp4

با اجرای این دستور فرآیند ضبط شروع می شود و هر گاه Ctrl + C را در ترمینال فشار دهید، ضبط متوقف می شود.

ممکن است شما رزولوشن مانیتور خود را ندانید. با اینکه این خصوصیت در کنترل پنل یا display settings نمایش داده می شود اما کاربران لینوکس می توانند از روش دیگری برای فول اسکرین کردن ضبط استفاده کنند. شما باید دستور زیر را به جای رزولوشن قرار بدهید:

-s $(xdpyinfo | grep dimensions | awk '{print $2;}')

با این حساب دستور کامل شما بدین شکل خواهد شد:

ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4

۵. ضبط وبکم!

ضبط ویدیو از وبکم شما یا دوربین های USB بسیار آسان تر از ضبط صفحه است. ما می دانیم که در لینوکس دستگاه های متصل به سیستم در مسیر dev/ ذخیره می شوند و معمولا به شکل dev/video0/ و dev/video1/ و ... هستند بنابراین باید دستگاه وبکم خود را پیدا کنید و آن را به عنوان ورودی مشخص کنید:

ffmpeg -i /dev/video0 output.mkv

طبیعتا با فشردن کلید های Ctrl + C در ترمینال، فرآیند ضبط متوقف می شود. کاربران ویندوز می توانند از دستور زیر استفاده کنند:

ffmpeg -y -f vfwcap -i list

اطلاعات و توضیحات بیشتر در این صفحه موجود می باشد.

۶. ضبط صدا

لینوکس معمولا صدا را از طریق ALSA و pulseaudio مدیریت می کند و ffmpeg توانایی ضبط هر دو را دارد اما از آنجایی که من خودم روی Ubuntu کار می کنم به سراغ pulseaudio می رویم چرا که سیستم های debian به صورت پیش فرض آن را نصب دارند. برای این کار باید ابتدا alsa را force کنید (f-) و ورودی را نیز روی default قرار بدهید. default یعنی دستگاه پیش فرض ضبط در سیستم شما که معمولا از طریق تنظیمات صوت سیستم قابل مشاهده است.

ffmpeg -f alsa -i default output.mp3

با اجرای این دستور ffmpeg شروع به ضبط صدا می کند.

همچنین شما می توانید وبکم و صوت را به همراه یکدیگر ضبط کنید! به دستور زیر توجه نمایید:

ffmpeg -i /dev/video0 -f alsa -i default -c:v libx264 -c:a flac -r 30 output.mkv

همانطور که می بینید من در این دستور علاوه بر وبکم و صوت، به سراغ جزئیاتی مانند تعیین کدک libx264 برای ویدیو و کدک flac برای صدا رفته ام. در ضمن می توانید به جای ضبط صدا، یک فایل صوتی از قبل آماده شده را به ویدیوی خود اضافه کنید:

ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 -i audio.wav -c:a copy output.mp4

نکته: ffmpeg در بازه های زمانی خاصی ضبط می کند بنابراین اگر فایل ضبط شده توسط شما فقط چند ثانیه باشد (از آن بازه کمتر باشد) ممکن است هیچ چیزی روی سیستم شما ذخیره نشود. برای اطمینان از ذخیره ویدیو یا صوت بهتر است چند ثانیه پس از اتمام کارتان را نیز ضبط کنید.

فیلترهای ffmpeg

در ffmpeg فیلترهایی وجود دارد که بر ویدیو یا صوت تاثیر می گذارند. ساختار کلی کار با این فیلترها به شکل زیر است:

ffmpeg -i input.mp4 -vf "filter=setting_1=value_1:setting_2=value_2,etc" output.mp4

همانطور که می بینید من از vf- (مخفف video filter یا فیلتر ویدیویی) استفاده می کنم چرا که فایل ما یک فایل ویدیویی است (af- برای فیلترهای صوتی است). همانطور که مشخص است فیلترها درون علامت quotation (علامت ") نوشته می شوند. هر فیلتر با ویرگول انگلیسی (comma) از دیگر فیلترها جدا می شود و تنظیمات هر فیلتر با علامت دو نقطه از هم جدا می شود.

این مقاله به انداه کافی طولانی شده است بنابراین نمی توانم تمام فیلترهای ffmpeg را برایتان توضیح بدهم اما شما می توانید با مراجعه به documentation رسمی ffmpeg در مورد انواع فیلترها مطالعه کنید. تعداد این فیلترها تقریبا نامحدود است!

فیلتر اول برای تغییر scale یا همان aspect ratio ویدیو است:

ffmpeg -i input.mp4 -vf "scale=w=800:h=600" output.mp4

با این کار عرض را برابر ۸۰۰ و طول را برابر ۶۰۰ گذاشته ایم. در نظر داشته باشید که شما می توانید عملیات های ریاضی را نیز در این فیلترها انجام بدهید. مثلا:

ffmpeg -i input.mkv -vf "scale=w=1/2*in_w:h=1/2*in_h" output.mkv

در این طول و عرض ویدیو را نصف کرده ایم (یک دوم). in_w مخفف input_width و به معنی عرض ویدیوی ورودی است و in_h یا input_height نیز به معنی طول ویدیوی ورودی است. به زبان ساده طول و عرض ویدیوی خروجی باید یک دوم یا نصف طول و عرض ویدیوی ورودی باشد.

فیلتر بعدی برای crop کردن است و به صورت پیش فرض از نقطه وسط ویدیو شروع می کند:

ffmpeg -i input.mkv -vf "crop=w=400:h=400" output.mkv

اما اگر بخواهید از نطقه دیگری مانند گوشه چپ و بالای تصویر شروع کنید باید مانند جدول مختصات x و y را روی صفر بگذارید:

ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4

فیلتر بعدی چند برابر کردن شدت صدای یک ویدیو یا فایل صوتی است. به مثال زیر توجه کنید:

ffmpeg -i input.wav -af "volume=1.5" output.wav

ffmpeg -i input.ogg -af "volume=0.75" output.ogg

در دستور اول شدت صوت را ۱.۵ برابر کرده ایم (افزایش) و در دستور دوم آن را ۰.۷۵ برابر کرده ایم (کاهش).

فیلتر بعدی مربوط به چرخاندن یا rotate کردن ویدیو است. چرخش ویدیو در ffmpeg همیشه بر اساس حرکت عقربه های ساعت است و در واحد رادیان انجام می شود. برای تبدیل میزان چرخش در واحد زاویه به رادیان باید درجه را در عدد پی (۳.۱۴) ضرب کرده و روی ۱۸۰ تقسیم کنیم. به طور مثال:

ffmpeg -i input.avi -vf "rotate=90*PI/180"

ffmpeg -i input.mp4 -vf "rotate=PI"

دستور اول ویدیو را ۹۰ درجه در جهت عقربه های ساعت می چرخاند و دستور دوم نیز تصویر را ۱۸۰ درجه می چرخاند (۳.۱۴ رادیان برابر ۱۸۰ درجه است).

همانطور که گفتم تعداد فیلترهای ffmpeg بسیار زیاد است و با مراجعه به documentation آن می توانید موارد بسیار زیادی را پیدا کنید. امیدوارم این مقاله به درک شما از ffmpeg کمک بهتری کرده باشد.


منبع: وب سایت itsfoss

نویسنده شوید

دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

محمود رنجبر
30 مرداد 1400
سلام خدمت دوستان من میخوام ویدیو استریم کنم در سایت php ولی به جایی نمیرسم از react stream استفاده کردم ادیتور به همه چیز مثال هاش ایراد میگیره یه پکیج خوب برای استریم ویدیو در php نه لاراول میتونید معرفی کنید برای این کار که مثال هم داشته باشه سپاس از راهنمایی تون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

mohsen
20 تیر 1400
جدا خسته نباشید میگم با همچین مقالهای که گذاشتین. به شدت دنبال همچین چیز کاملی بودم که اصلا پیدا نمیشه به زبون فارسی ایول

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.