در این مقاله آموزشی ابتدا به معرفی کتابخانه ffmpeg پرداخته و سپس آن را نصب خواهیم کرد. پس از اتمام مراحل نصب وارد کاربردهای فوق العاده آن خواهیم شد و مطمئن هستم که شما نیز جذب قدرت آن می شوید.
نکته: این آموزش دارای دو بخش ساده و حرفه ای است. بخش ساده برای کاربران لینوکس و ویندوز طراحی شده است اما بخش حرفه ای مختص کاربران لینوکس است.
ffmpeg یک CLI یا ابزار Command Line Interface برای پردازش فایل های مولتی مدیا (ویدیوها، فایل های صوتی و غیره) است. البته لازم به ذکر است که ffpmeg در قالب کتابخانه هایی برای زبان پایتون و زبان های دیگر نیز موجود است بنابراین حتی می توانید در وب سایت خود نیز از آن استفاده کنید. بسیاری از برنامه های پخش و ویرایش ویدیو مانند یوتیوب و VLC از آن استفاده می شود. حتی مرورگر کرومیوم (پایه گوگل کروم) از ffmpeg برای نمایش ویدیو و پخش صوت استفاده می کند.
طبیعتا ffmpeg یک ابزار بسیار پیشرفته است و قابلیت های بی شماری را دارد که برای آشنایی با آن ها نیاز به دوره ای جداگانه خواهیم داشت اما اینطور نیست که فقط برنامه نویسان بتوانند از آن استفاده کنند. همانطور که توضیح دادم ffmpeg می تواند به صورت CLI نیز استفاده شود، یعنی در ترمینال یا CMD شما باز شده و با چند خط کد ساده کارهای خارق العاده ای انجام می دهد. ما در این مقاله روی حالت CLI این ابزار تمرکز می کنیم تا شما به عنوان یک کاربر حرفه ای (و نه یک برنامه نویس) با آن آشنا شوید.
حتما می دانید که کاربران لینوکس به انجام کارهای ساده به صورت دستی عادت کرده اند در حالی که کاربران ویندوز برای هر کاری از نرم افزار خاصی استفاده می کنند. این مسئله باعث شده است که 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 (یا سیستم هایی که بر اساس Arch نوشته شده اند) می توانید از دستور زیر استفاده کنید:
sudo pacman -S ffmpeg
همچنین برای نصب آن در سیستم های Fedora می توانید از این دستور استفاده نمایید:
sudo dnf install 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) نیز از همینجا آمده است؛ هر فریم یک عکس از مجموعه عکس های ما است و معمولا در هر ثانیه ۳۰ فریم یا تصویر در ویدیوها جا به جا می شوند تا ما آن را به صورت ویدیو ببینم. البته نمایشگرهای مدرن و همچنین ویدیوهای با کیفیت می توانند تا ۳۰۰ فریم بر ثانیه نیز حرکت کنند که تجربه بسیار زیبایی را برای ما ایجاد می کنند.
صوت ها نیز موجی از فشار هستند که در هوا پخش می شوند. این موج فشار بین مولکول های هوا منتقل شده و به گوش شما می رسد. اگر به استخر رفته باشید متوجه می شوید که زیر آب نیز می توانید تا حد ضعیفی صدا را بشنوید. چرا؟ به دلیل اینکه این موج فشار می تواند در گازها، مایعات و حتی جامدات نیز منتقل شود و تنها تفاوت مقدار انتقال موج و شدت تضعیف آن در حین انتقال است.
اگر در هر ثانیه ۳۰ تصویر از جلوی چشمان ما رد شوند، برای یک فیلم یک ساعته چه اتفاقی می افتد؟ طبیعتا در چنین حالتی میلیون ها یا میلیارد ها تصویر را خواهیم داشت و اگر بخواهیم تمام آن ها را در یک فایل قرار داده و اسمش را ویدیو یا فیلم بگذاریم، حجم عظیمی از داده ها را خواهیم داشت. مثلا یک فیلم ساده شاید چند صد گیگابایت حجم داشته باشد! بیایید یک نمونه را محاسبه کنیم.
فرض کنید فیلمی با رزولوشن 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 format به فایل هایی گفته می شود که stream های مختلف مانند ویدیو و صوت را در خود دارند و علاوه بر آن اجازه همگام سازی این دو را نیز می دهند. همچنین فایل های container دارای metadata یا اطلاعات جانبی (مانند رزولوشن) در مورد فایل خود هستند. معمولا برای تشخیص container می توانیم به پسوند فایل مورد نظرمان نگاه کنیم. به طور مثال پسوند webm به نگهدارنده webm اشاره می کند:
توجه داشته باشید که Codec نرم افزار یا الگوریتم خاص برای فشرده سازی است در حالی که container فایل نهایی و اصلی فیلم ما است.
bitrate به نرخ انتقال اطلاعات (در قالب بیت) در واحد زمانی مشخصی گفته می شود. زمانی که در مورد bitrate برای ویدیوها صحبت می کنیم منظورمان سرعت انتقال اطلاعات ویدیو است. هر چه bitrate یا این سرعت انتقال بیشتر باشد، کیفیت ویدیو بهتر و البته حجم آن بالاتر خواهد بود. معمولا bitrate برای ویدیوهای HD در حدود ۵ تا ۲۰ مگابیت بر ثانیه (Mbps - به b کوچک دقت کنید که نشان دهنده بیت است نه بایت) و برای ویدیوهای عادی بین ۱ تا ۶ مگابیت بر ثانیه است. معمولا ویدیوهایی که با کیفیت استاندارد روی وب سایت ها می بینید در حد ۲ تا ۳ مگابیت بر ثانیه هستند.
زمانی که با ویدیو یا صوت کار می کنیم معمولا عملیات هایی را روی آن انجام می دهیم که نام های خاصی دارند. گرچه دانستن این نام ها ضروری نیست اما از آن ها در فضای مجازی زیاد استفاده می شود (مخصوصا وب سایت های انگلیسی) بنابراین درک مفهوم هر کدام از آن ها به شما کمک بزرگی می کند.
Transcoding: به فرآیند تبدیل یکی از stream ها (ویدیو یا صوت) از یک Codec به Codec دیگر، transcoding می گویند. معمولا زمانی از این فرآیند استفاده می شود که دستگاه مورد نظر ما (تلویزیون یا تلفن هوشمند یا ...) از codec مورد نظر پشتیبانی نکند و مجبور به تغییر این codec شویم یا اینکه codec جدیدتری را پیدا کرده ایم که حجم فایل را کمتر می کند و می خواهیم از آن استفاده کنیم.
Transmuxing: به فرآیند تبدیل از یک container به container دیگر گفته می شود. این فرآیند نیز معمولا به دلیل عدم سازگاری یا پشتیبانی برخی از دستگاه ها انجام می شود تا بتوانیم از فایل مورد نظر استفاده کنیم:
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 [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
من کلیت این گزینه ها را توضیح می دهم اما یادتان باشد که تعدادشان بسیار زیاد است و نمی توانیم همه آن ها را بررسی کنیم. شما می توانید تمام این ستورات را در این صفحه github مشاهده کنید.
در صورتی که چندین فایل ورودی دارید باید تنظیمات را برای هر کدام جداگانه بنویسید، یعنی ابتدا تنظیمات را ذکر کرده و سپس نام فایل اول را می آورید، سپس تنظیمات را ذکر کرده و سپس نام فایل دوم را می آورید الی آخر. برای واضح تر شدن این دستورات چند ده مثال عملی را با هم انجام می دهیم تا کاملا متوجه موضوع بشوید.
مطالعه ساختار دستورات 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 = فشرده سازی بدون کاهش کیفیت است
حالا متوجه کارکرد هر کدام از این کدک ها می شوید. ما معمولا از کدک های مشهور استفاده می کنیم که چند مورد را در لیست زیر برایتان آورده ام:
همچنین در نظر داشته باشید که برای لیست کردن 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 است. از گزینه های معروف دیگر در این زمینه می توان به این گزینه ها اشاره کرد:
در ضمن یادتان باشد که 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 به معنی نسبت طول به عرض تصویر است. ما با استفاده از 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 (کاور آلبوم) معروف است چرا که بیشتر برای فایل های موسیقی دیده می شود. برای انجام این کار از دستور زیر استفاده می نماییم:
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 را مجبور می کند که این کار را انجام بدهد و حتما تنظیمات انتخاب شده توسط ما را اعمال کند. استریو کردن صوت یکی از راه های مناسب برای افزایش کیفیت صدا بدون افزایش حجم زیاد آن است.
در بسیاری از اوقات لازم است که یک فایل را برش بزنیم و قسمت خاصی را از آن استخراج کنیم. اگر بخواهید برش را از ابتدای فایل شروع کنید تنها با استفاده از 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 تقسیم کردن یا 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
کاربران ویندوز نیز می توانند به هر روشی که دوست دارند فایل متنی خود را ایجاد کنند. زمانی که این فایل متنی را باز کردید باید به نام فایل هایی که می خواهید ترکیب شوند را به همراه مسیر کاملشان بنویسید. البته در هنگام نوشتن باید به چند نکته مهم توجه کنید:
من از 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 -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
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.