این نرم افزار برای کار با «رسانه»های مختلف(صدا و تصویر) ساخته شده است این ابزار یکی از قویترین ابزارهای آزاد برای کار بر روی صدا و تصویر است در اغلب سیستمهای عامل است. FFmpeg یک چارچوب نرمافزاری قدرتمند و رایگان برای پردازش ویدئو، صوت و دیگر فایلهای چندرسانهای است. این نرمافزار ابزارهای مختلفی را برای ضبط، تبدیل، فشردهسازی، ویرایش و پخش فایلهای چندرسانهای فراهم میکند. FFmpeg میتواند به عنوان یک ابزار خط فرمان یا به عنوان کتابخانهای برای برنامهنویسی استفاده شود. در اینجا برخی از ویژگیها و کاربردهای مهم FFmpeg آورده شده است:
ویژگیهای FFmpeg:
پشتیبانی از فرمتهای گسترده:
پشتیبانی از تقریبا تمامی فرمتهای صوتی و تصویری رایج مانند MP4, AVI, MKV, MP3, AAC و بسیاری دیگر.
ابزارهای متنوع:
شامل ابزارهای مختلفی مانند ffmpeg (برای تبدیل و پردازش)، ffplay (برای پخش) و ffprobe (برای بررسی اطلاعات فایلها).
فیلترها و افکتها:
امکان اعمال فیلترهای مختلف روی ویدئو و صوت، مانند برش، چرخش، تغییر رزولوشن، تنظیم رنگ و غیره.
پشتیبانی از کدکها:
پشتیبانی از اکثر کدکهای رایج مانند H.264، H.265، VP9، AAC و غیره.
برخی از کاربردهای مهم FFmpeg:
برای نصب این برنامه، بهتر است که از ابزار مدیر بستهی توزیع خود استفاده کنید. برای توزیعهای مشهور، دستوراتی اینچنین مورد نیاز است:
Ubuntu ( and related distributions) or Debian:
apt-get install ffmpeg
در ویندوز نیاز به نصب ندارد و آخرین نسخه ویندوزی در سایت رسمی قابل دانلود است.
فرمت کلی کار با این ابزار به صورت زیر است:
1
|
ffmpeg [global options] [options] -i input [options] output
|
در این دستور input نام ورودی و output نام خروجی است. در این مطلب همیشه input ورودی و output خروجی را مشخص میکند. لازم به ذکر است که فرمت و کدک فایل ورودی به صورت خودکار تشخیص داده میشود و همچنین فرمت و کدک فایل خروجی نیز، بر اساس پسوند فایل، به صورت خودکار مشخص میشود. اگرچه هرکدام از این موارد نیز قابل تعیین شدن توسط کاربر هستند. علاوه بر این شما میتوانید در بخش options، با گزینههای بسیار بیشتری، روی عملیات تبدیل کنترل داشته باشید. و همچنین توجه کنید که دو بخش [options] وجود دارد که یکی قبل از فایل ورودی و دیگری قبل از فایل خروجی آورده شده است. دستورات به کار رفته در این دو بخش مشابهاند و هر کدام به ترتیب به فایل ورودی و خروجی اعمال میشوند. اگرچه ما اکثر این تنظیمات را به فایل خروجی اعمال میکنیم ولی در مواردی خاص شاید نیاز باشد برای فایل ورودی نیز برخی گزینهها را معین کنیم. از این موارد خاص میتوان به تعیین اندازهی ورودی برای عکسبرداری با وبکم اشاره کرد.
بخش [global options] نیز تنظیمات کلی برنامه را تحت کنترل دارد. تمام گزینههای این بخش به صورت کامل در صفحات راهنمای ffmpeg موجود هستند. برای دیدن این صفحات از دستور man ffmpeg استفاده کنید. از این بخش میتوان به گزینههایی مانند -formats یا -codecs اشاره کرد.
در این بخش کاربردهای ساده و معمول ffmpeg را به صورت مختصر و بدون توضیح اضافه بیان میکنیم.
-تبدیل ویدئو به ویدئو یا صوت به صوت
1
|
ffmpeg -i input output
|
فرمت فایل خروجی، با توجه به پسوند تعیین میشود. اگر نیاز به مشخص کردن گزینههای بیشتر دارید گزینههای تصویر ffmpeg یا گزینههای صوت ffmpeg را ببینید.
-جدا کردن صوت از فایل
1
|
ffmpeg -i input -nv output
|
اگر نیاز به گزینههای بیشتری برای صوت خروجی، مانند کیفیت و کدک، دارید بخشگزینههای صوت ffmpegرا ببینید.
البته در این دستور میتوان -nv را حذف کرد و برنامه به صورت خودکار از روی پسوند فایل خروجی (فرمت صوتی مانند mp3) تصویر را حذف خواهد کرد. ولی برای اطمینان بیشتر این گزینه را اضافه کردیم.
-جداکردن تصویر از فایل
1
|
ffmpeg -i input -na output
|
شاید کاربرد آن نسبت به گزینههای قبلی کمتر باشد ولی خب، وجود دارد.
بر خلاف دستور قبلی وجود -na ضروری است.
بریدن بخشی از ویدئو یا صوت
1
|
ffmpeg -i input -codec copy -ss start -t duration output
|
ورودی و خروجی در دستوز بالا مشخص هستند. بخش -codec copy به برنامه میگوید که از همان کدکهای فایل ورودی استفاده کند، و در صورتی که این بخش را حذف کنید کدکهای پیشفرض ffmpeg جایگزین خواهند شد و ممکن است با افت کیفیت و سرعت تبدیل روبهرو شوید. start زمان شروع برش را مشخص میکند. میتوانید آنرا به ثانیه یا به فرمت H:M:S مشخص کنید که در آن به جای H ساعت، به جای M دقیقه و به جای S ثانیه را بنویسید. duration هم زمان برش را مشخص میکند و مانند start تعیین میشود. مثلا
1
|
ffmpeg -i input.mp4 -codec copy -ss 10 -t 0:1:2 output.mp4
|
یعنی اینکه از ثانیهی دهم فایل ورودی به مدت یک دقیقه و دو ثانیه جدا کن و در خروجی قرار بده.
گرفتن عکس و فیلم از صفحه نمایش
بله! میتوانید با این ابزار از صفحه نمایش خود نیز عکس و فیلم بگیرید.
ابتدا فیلم:
1
|
ffmpeg -f x11grab -r 25 -s size -i :0.0[+x,y] output
|
پرواضح است که output فایل خروجی را مشخص میکند. در بخش size اندازهی نمایشگر خود را برای ضبط تمام صفحه وارد کنید. فرمت ورودی به شکل WxH است که به جای H و W به ترتیب مقادیر ارتفاع و پهنای نمایشگر را قرار دهید. اگر میخواهید ضبط به صورت تمام صفحه انجام نشود اندازهی دلخواه را وارد کنید. در بخش دلخواه [+x,y] میتوانید مشخص کنید که ضبط از مکان مشخصی روی صفحهی نمایشگر انجام شود. مبدأ این مختصات قسمت پایین چپ نمایشگر شما است.
عکس:
1
|
ffmpeg -f x11grab -r 25 -s size -frames 1 -i :0.0[+x,y] output
|
به اضافه شدن گزینهی -frames 1 دقت کنید. این گزینه به برنامه میگوید که فقط یک فریم از ورودی (صفحه نمایش) را ذخیره کند. گزینههای دیگر همانند فیلم برداری است.
فیلمبرداری و عکس برداری با وبکم و دیگر دستگاههای ورودی
این کار هم با ffmpeg انجام پذیر است. دستور زیر از وبکم شما فیلمبرداری کرده، ذخیره میکند.
1
|
ffmpeg -f video4linux2 -i /dev/video0 output
|
خیلی ساده هست. فقط فایل خروجی را بدهید تا برایتان ضبط کند! البته میتوانید از گزینههای مختلفی برای ورودی و نیز خروجی استفاده کنید. مثلا اندازهی خروجی را تعیین کنید یا حتی با استفاده از میکروفون در حین ضبط تصویر، ضبط صدا نیز انجام دهید. یافتن اینها را به شما واگذار میکنیم. برخی از این گزینهها را در موارد قبل دیدهاید و اگر مایل هستید گزینههای بیشتری را ببینید به صفحات راهنمای ffmpeg مراجعه کنید.
به /dev/video0 دقت کنید. این مسیر دستگاه شما در لینوکس است. اکثر وبکمها از همین مسیر استفاده میکنند ولی اگر میدانید دستگاهتان مسیر دیگری دارد آن را جایگزین کنید.
همچنین به جای video4linux2، در صورتی که نتیجه نگرفتید، میتوانید از video4linux استفاده کنید.
در صورت تمایل برای عکسبرداری، مانند عکسبرداری از صفحهنمایش، گزینهی -frames 1 را اضافه کنید.
برخی گزینههای قابل استفاده برای ویدئو در جدول زیر آورده شده اند. برای راهنمایی بیشتر بخش Video Options صفحهی راهنمای ffmpeg را ببینید. این گزینهها را میتوانید قبل از فایل ورودی یا خروجی به کار ببرید تا به هرکدام که خواستید اعمال شوند.
اندازهی تصویر را تعیین میکند. برای مثال 1024×768 همچنین برخی از اختصارهای مشهور، مانند wga را نیز میتوانید در اینجا استفاده کنید. برای دیدن لیستی از اختصارات، از صفحهی man ffmpeg دیدن کنید.
-s “size”
فریم در ثانیهی(fps) را تعیین میکند، مثلا 25 .
-r “rate”
در حین عملیات تبدیل، «تصویر»ی موجود در فایل را نادیده میگیرد. کاربرد این گزینه برای استخراج صوت از یک فایل ویدئویی است. در بخش قبل کاربرد این گزینه را دیدید.
-vn
در حین عملیات تبدیل، «تصویر»ی موجود در فایل را نادیده میگیرد. کاربرد این گزینه برای استخراج صوت از یک فایل ویدئویی است. در بخش قبل کاربرد این گزینه را دیدید.
----
کدک ویدئو را تنظیم میکند. برای دیدن لیستی از کدکهای موجود روی سیستم خود از دستور ffmpeg -codecs استفاده کنید. در خروجی این دستور علامت E کنار اسم کدک به این معناست که شما میتوانید فایلی را به این کدک تبدیل کنید. وجود D در کنار اسم کدک به معنای این است که ffmpeg قابلیت خواندن فایل با این کدک را دارد. همچنین وجود حرف V در کنار کدک نشانگر آن است که آن کدک، یک کدک تصویری است.
-vcodec “codec”
فیلتری را به ویدئو اعمال میکند. در بخشی مجزا برخی فیلترهای قابل اعمال را کمی بررسی خواهیم کرد. ولی به دلیل پیشرفتهتر بودن موضوع، بهتر است لینکهای بخش فیلترها را ببینید.
-vf “filter”
کاهش حجم ویدیو یا تصویر در ffmpeg
الحاق زیرنویس به فیلم
ffmpeg -i 1.mp4 -i 1.srt -c:s mov_text -c:v copy -c:a copy 2.mp4
برش تصویر
برای بریدن بخشی از فیلم (crop کردن): مقادیر w و h اندازه و مقادیر x,y نقطهی شروع بریدن تعیین میکنند. مبدأ این مختصات نقطهی بالا چپ تصویر است.
ffmpeg -vf crop=w:h:x:y -i input output
ffmpeg -i 1.mp4 -vf crop=iw/2:ih/2 -crf 30 outputdn.mp4
کم حجم نمودن فیلم
ffmpeg -i input.mp4 -vcodec h264 -b:v 700k -acodec mp3 -vf "scale=iw/4:iw/4" output.mp4
ffmpeg -i inputfile.mp4 -vcodec h264 -b:v 700k -acodec mp3 outputfile.mp4
ffmpeg -i input.mp4 -vcodec h264 -acodec mp2 outputfile.mp4
ffmpeg -i Rec003_.mp4 -vf scale=320:240 output.mp4
scale=1920x1080
Resolution scale calculator: calculate resolution downscaling options for video editing
کم حجم نمودن فیلم اما اگر ابعاد آن خیلی کم است از بزرگنمایی آن خودداری شود
ffmpeg -i input.jpg -vf "scale='min(320,iw)':'min(240,ih)'" input_not_upscaled.png
Scaling – FFmpeg
تغییر سایز تصویر، هم طول و عرض وارد شود
100 of left right crop
120 of top bottom crop
ffmpeg -i input.mp4 -filter:v "crop=in_w-2*100:in_h-2*120" output.webm
کاهش حجم ویدیو
هر چه عدد بعد از -crf بزرگت باشد کیفیت پایین تر میآید اما در -b هر چه کوچک تر باشد کیفیت پایین میآید
ffmpeg -i input.mp4 -b 1000000 output.mp4
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4
ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 -crf 30 outputd.mp4
گزینههای پرکاربرد صوت در جدول زیر نشان داده شدهاند. برای گزینههای بیشتر، بخش Audio Options صفحات راهنمای ffmpeg را ببینید. این گزینهها را میتوانید قبل از فایل ورودی یا خروجی به کار ببرید تا به هرکدام که خواستید اعمال شوند.
حذف صوت از فایل ورودی
-an
تنظیم کدک صوتی. برای دیدن لیستی از کدکهای موجود روی سیستم از ffmpeg -codecs استفاده کنید. وجود حرف A در کناز اسم هر کدک نشانگر آن است که آن کدک، یک کدک صوتی است و وجود حرف E به معنای این است که شما میتوانید با این کدک خروجی تولید کنید. وجود حرف D نیز به معنای قابلیت خواندن کدک توسط برنامه است.
-acodec “codec”
بالا بردن سرعت پخش صدا atempo
ffmpeg -i input.mp3 -filter:a "atempo=2.0" output.mp3
بالا بردن صدا
ffmpeg -i input.wma -filter:a "volume=60" output.mp3
تعیین کیفیت صوت. مثلا مقادیری مانند 128k
-aq “quality”
سرعت نمونهبرداری را تعیین میکند. rate سرعت را بر حسب هرتز مشخص میکند.
-ar “rate”
تعداد کانالهای صوتی را تعیین میکند.
-ac “channels”
کم حجم نمودن صوت با حداقل کاهش کیفیت
ffmpeg -i input.MP3 -acodec libmp3lame -ac 2 -ab 64k -ar 44100 output.mp3
کم حجم نمودن صوت با کاهش کیفیت
ffmpeg -i inputfile.mp3 -acodec libmp3lame -b:a 8k -ac 1 -ar 11025 outputfile.mp3
انتخاب مقدار کیفیت
$ ffmpeg -b 192k -i file file.mp3
با انتخاب مقدار کیفیت
ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3
انتخاب مقدار کیفیت
ffmpeg -b 192k -i file file.mp3
در حین عملیات تبدیل، فیلترهای مختلفی به فایل قابل اعمال هستند. از فیلترها میتوان برای مقاصدی مانند بریدن بخشی از تصویر (crop کردن)، افزودن نوشته به تصویر و بسیاری کارهای دیگر استفاده کرد.
برای دیدن لیستی از فیلترها و نحوهی اعمال هر کدام اینجا و اینجا را ببینید.
به عنوان مثالی دیگر، دستور زیر مستطیلی روی تصویر رسم میکند.
1
|
ffmpeg -vf drawbox=x:y:w:h:color -i input output
|
به عنوان نکتهی پایانی این بخش دقت کنید که این فیلترها به هرگونه ورودی یا خروجی قابل اعمال هستند. مثلا میتوانید فیلتر dawbox را به همراه فیلمبرداری از صفحهنمایش به کار ببرید. این گونه کاربردها، در صورت صرف کمی خلاقیت، میتواند بسیار جالب باشد.
تبدیل گروهی در لینوکس
for i in *.*; do ffmpeg -i "$i" "$i.mp3" ;done
or
for %%A IN (*.avi) DO ffmpeg -i "%%A" "%%A.mpg"
تبدیل گروهی در لینوکس (حلقه for در خط فرمان)
for i in *.*; do ffmpeg -i "$i" "$i.mp3" ;done
تبدیل گروهی در ویندوز (حلقه for در خط فرمان)
for /r %i in (*) do ffmpeg -i "%i" -c:v mpeg4 -vtag xvid "%i.avi"
متصل نمودن چند فایل
ffmpeg -i concat:"1.VOB|2.VOB|3.VOB" -c copy output.webm
حذف چند ثانیه
Create segments:
ffmpeg -t 00:11:00 -i input.mp4 -map 0 -c copy segment1.mp4
ffmpeg -ss 00:11:10 -i input.mp4 -map 0 -c copy segment2.mp4
Create input.txt:
file 'segment1.mp4'
file 'segment2.mp4'
Concatenate with the concat demuxer:
ffmpeg -f concat -i input.txt -map 0 -c copy output.mp4
دانلود فایلها از سرور تلبیون
ffmpeg -i "rtmpe://www.s4.telewebion.com:1935/vod/mp4:/media/telewebion/tv3/2014-11-12/2012/file.mp4" -vcodec copy -acodec copy out1.mkv
برش زدن زمانی فایل صوتی یا تصویری
ffmpeg -i input.mp4 -ss start -t duration output.mp4
ffmpeg -i input.mp4 -ss 00:00:03 -t 00:00:08 -async 1 output.mp4
ffmpeg -ss 93 -i 1.mp4 -c copy -t 120 output.mp4
جدا سازی به وسیله زمان به طور مثال 49 ثانیه Split by time
ffmpeg -i t.ogg -map 0 -c copy -f segment -segment_time 49 -reset_timestamps 1 out%02d.ogg
افزایش دوبرابری سرعت پخش صدا و تصویر(اگر مقدار setpts پایین آورده شود سرعت بیشتر خواهد شد دقت شود سرعت پخش صدا نیز باید بصورت متوازن تغیر کند )
ffmpeg -i 08.mp4 -filter:a "atempo=2.0" -filter:v "setpts=0.5*PTS" j08_.mkv
دانلود ویدیو استریم m3u8
ffmpeg -i "http://host/folder/file.m3u8" -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 file.mp4
---
----
---
----
---
----
---
----
-c copy -vcodec copy
is redundant. -c copy says "for all streams, do a stream copy" (no re-encoding). And then -vcodec copy says "for the video stream[s], do a stream copy". -c copy is all that's needed. You could also do -vcodec copy -acodec copy or -codec copy since -c is just a short version of -codec.
-crf 50
As you pointed out, since there's no transcoding going on, this video quality flag does nothing. And if it did work, 50 is such low quality that you probably wouldn't like the result. Also this flag is only supported by some codecs. (I wish ffmpeg gave you a warning when you pass in a useless flag!)
-bsf:a aac_adtstoasc
These days ffmpeg is smart enough to automatically insert this filter when needed. IMHO it's cleaner to just rely on that rather than always inserting it even when it's not necessary. (like in non-AAC+MPEG-TS streams) If you turn on verbose messaging with -v verbose you'll see that ffmpeg informs you of this:
$ ffmpeg -i https://...m3u8 -v verbose -c copy test.mp4
$ ffmpeg -i https://../stream.m3u8 -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 test2.mp4