FFMPEG(1) دستورات کاربر (پارچ لینوکس) FFMPEG(1)

ffmpeg - مبدل و پردازشگر چندرسانه‌ای همه‌کاره

ffmpeg [گزینه‌های_عمومی] {[گزینه‌های_ورودی] -i آدرس_ورودی} ... {[گزینه‌های_خروجی] آدرس_خروجی} ...

دستور ffmpeg یک مبدل و پردازشگر چندرسانه‌ای همه‌کاره و بسیار سریع است. این ابزار قادر است طیف وسیعی از ورودی‌ها - از جمله فایل‌ها، جریان‌های زنده و دستگاه‌های ضبط - را بخواند، فیلتر کند و آن‌ها را به خیل عظیمی از قالب‌های خروجی تبدیل (Transcode) نماید.

دستور ffmpeg از تعداد دلخواهی ورودی مشخص‌شده با گزینه "-i" می‌خواند و در تعداد دلخواهی خروجی می‌نویسد. هر چیزی در خط فرمان که به عنوان گزینه شناخته نشود، به عنوان آدرس یا فایل خروجی تلقی می‌گردد.

هر ورودی یا خروجی می‌تواند شامل هر تعداد جریان مقدماتی (استریم) از انواع مختلف (ویدیو/صدا/زیرنویس/داده/پیوست) باشد. انتخاب اینکه کدام استریم به کدام خروجی برود، به طور خودکار یا با استفاده از گزینه "-map" تعیین می‌شود (به بخش انتخاب استریم (STREAM SELECTION) مراجعه کنید).

برای ارجاع به ورودی‌ها یا خروجی‌ها از اندیس‌های بر پایه صفر استفاده می‌شود (نخستین ورودی 0 و دومی 1 است). استریم‌های درون یک ورودی یا خروجی نیز با اندیس مشخص می‌شوند؛ به عنوان مثال "2:3" به چهارمین استریم از سومین ورودی اشاره دارد.

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

فایل‌های ورودی و خروجی را با یکدیگر ترکیب نکنید -- ابتدا تمام فایل‌های ورودی و سپس تمام خروجی‌ها را تعیین نمایید.

چند مثال کاربردی و پایه:

  • تبدیل یک فایل رسانه‌ای به قالبی دیگر با انکود مجدد:
    ffmpeg -i input.avi output.mp4
  • تنظیم بیت‌ریت ویدیوی خروجی روی 64 کیلو‌بیت بر ثانیه:
    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4
  • اجبار نرخ فریم خروجی به 24 فریم بر ثانیه:
    ffmpeg -i input.avi -r 24 output.mp4
  • اجبار نرخ فریم ورودی خام به 1 فریم و خروجی به 24 فریم بر ثانیه:
    ffmpeg -r 1 -i input.m2v -r 24 output.mp4

گزینه قالب (-f) ممکن است برای فایل‌های ورودی خام ضروری باشد.

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

مؤلفه‌ها و اجزای در دسترس عبارتند از:

•
دی‌ماکسرها (Demuxers) (کوتاه‌شده‌ی demultiplexers) منابع ورودی را جهت استخراج موارد زیر می‌خوانند:
  • ویژگی‌های عمومی مانند فراداده، متادیتا و فصل‌ها؛
  • فهرست استریم‌های اولیه ورودی و مشخصات فنی آن‌ها.

به ازای هر گزینه -i یک نمونه دی‌ماکسر ایجاد می‌شود که بسته‌ها (packets) انکودشده را به دیکودرها یا ماکسرها می‌فرستد.

در ادبیات فنی گاهی به دی‌ماکسرها splitters نیز می‌گویند زیرا وظیفه اصلی آن‌ها تفکیک فایل به استریم‌های مجزا است.

نمایش شماتیک یک دی‌ماکسر به صورت زیر است:

┌──────────┬───────────────────────┐
│ demuxer  │                       │ packets for stream 0
╞══════════╡ elementary stream 0   ├──────────────────────►
│          │                       │
│  global  ├───────────────────────┤
│properties│                       │ packets for stream 1
│   and    │ elementary stream 1   ├──────────────────────►
│ metadata │                       │
│          ├───────────────────────┤
│          │                       │
│          │     ...........       │
│          │                       │
│          ├───────────────────────┤
│          │                       │ packets for stream N
│          │ elementary stream N   ├──────────────────────►
│          │                       │
└──────────┴───────────────────────┘
     ▲
     │
     │ read from file, network stream,
     │     grabbing device, etc.
     │
  • دیکودرها (Decoders) بسته‌های فشرده‌شده و انکودشده را برای یک استریم صوتی، ویدیویی یا زیرنویس دریافت کرده و آن‌ها را به فریم‌های خام (raw frames) (آرایه‌های پیکسلی برای ویدیو و PCM برای صدا) دیکود می‌کنند. دیکودرها داده را از دی‌ماکسر دریافت می‌کنند یا ممکن است به صورت مستقل عمل نمایند (دیکودرهای لوپ‌بک).

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

              ┌─────────┐
     packets  │         │ raw frames
    ─────────►│ decoder ├────────────►
              │         │
              └─────────┘
  • گراف فیلترها (Filtergraphs) فریم‌های خام صوت و تصویر را پردازش و تبدیل می‌کنند. یک فیلترگراف شامل یک یا چند فیلتر متصل به هم در قالب گراف است. فیلترگراف‌ها در دو نوع ساده (simple) و پیچیده (complex) به ترتیب با گزینه‌های -filter و -filter_complex پیکربندی می‌شوند.

    یک فیلترگراف ساده ویدیو که به عنوان نمونه عملیات deinterlacing (با فیلتر yadif) و سپس تغییر اندازه (با فیلتر scale) را انجام می‌دهد به شکل زیر است:

                 ┌────────────────────────┐
                 │  simple filtergraph    │
     frames from ╞════════════════════════╡ frames for
     a decoder   │  ┌───────┐  ┌───────┐  │ an encoder
    ────────────►├─►│ yadif ├─►│ scale ├─►│────────────►
                 │  └───────┘  └───────┘  │
                 └────────────────────────┘

    یک فیلترگراف پیچیده مستقل است و به هیچ استریم خاصی محدود نمی‌شود و می‌تواند چندین ورودی و خروجی با انواع مختلف داشته باشد. دیاگرام زیر یک فیلترگراف پیچیده با ۳ ورودی و ۲ خروجی ویدیویی را نشان می‌دهد:

              ┌─────────────────────────────────────────────────┐
              │               complex filtergraph               │
              ╞═════════════════════════════════════════════════╡
     frames   ├───────┐  ┌─────────┐      ┌─────────┐  ┌────────┤ frames
    ─────────►│input 0├─►│ overlay ├─────►│ overlay ├─►│output 0├────────►
              ├───────┘  │         │      │         │  └────────┤
     frames   ├───────┐╭►│         │    ╭►│         │           │
    ─────────►│input 1├╯ └─────────┘    │ └─────────┘           │
              ├───────┘                 │                       │
     frames   ├───────┐ ┌─────┐ ┌─────┬─╯              ┌────────┤ frames
    ─────────►│input 2├►│scale├►│split├───────────────►│output 1├────────►
              ├───────┘ └─────┘ └─────┘                └────────┤
              └─────────────────────────────────────────────────┘
  • انکودرها (Encoders) فریم‌های خام صوت، تصویر یا زیرنویس را دریافت کرده و آن‌ها را در قالب بسته‌های فشرده انکود می‌کنند. فرایند فشرده‌سازی معمولاً اتلافی (lossy) است، اگرچه انکودرهای بدون اتلاف (lossless) نیز با حجم خروجی بالاتر وجود دارند.

    نمایش شماتیک یک انکودر:

                 ┌─────────┐
     raw frames  │         │ packets
    ────────────►│ encoder ├─────────►
                 │         │
                 └─────────┘
  • ماکسرها (Muxers) (کوتاه‌شده multiplexers) بسته‌های انکودشده را از انکودرها (مسیر ترنسکدینگ) یا مستقیماً از دی‌ماکسرها (مسیر کپی استریم) دریافت کرده، آن‌ها را با هم درمی‌آمیزند (Interleave) و بایت‌های حاصل را در فایل خروجی، پایپ یا شبکه می‌نویسند.

    نمایش شماتیک یک ماکسر:

                           ┌──────────────────────┬───────────┐
     packets for stream 0  │                      │   muxer   │
    ──────────────────────►│  elementary stream 0 ╞═══════════╡
                           │                      │           │
                           ├──────────────────────┤  global   │
     packets for stream 1  │                      │properties │
    ──────────────────────►│  elementary stream 1 │   and     │
                           │                      │ metadata  │
                           ├──────────────────────┤           │
                           │                      │           │
                           │     ...........      │           │
                           │                      │           │
                           ├──────────────────────┤           │
     packets for stream N  │                      │           │
    ──────────────────────►│  elementary stream N │           │
                           │                      │           │
                           └──────────────────────┴─────┬─────┘
                                                        │
                         write to file, network stream, │
                             grabbing device, etc.      │
                                                        │
                                                        ▼

ساده‌ترین خط لوله در ffmpeg عملیات streamcopy است که در آن بسته‌های یک استریم ورودی بدون دیکود، فیلتر یا انکود مجدد مستقیماً در خروجی کپی می‌شوند. به عنوان مثال، در نظر بگیرید ورودی INPUT.mkv با ۳ استریم داریم و می‌خواهیم استریم دوم را در OUTPUT.mp4 بنویسیم:

┌──────────┬─────────────────────┐
│ demuxer  │                     │ unused
╞══════════╡ elementary stream 0 ├────────╳
│          │                     │
│INPUT.mkv ├─────────────────────┤          ┌──────────────────────┬───────────┐
│          │                     │ packets  │                      │   muxer   │
│          │ elementary stream 1 ├─────────►│  elementary stream 0 ╞═══════════╡
│          │                     │          │                      │OUTPUT.mp4 │
│          ├─────────────────────┤          └──────────────────────┴───────────┘
│          │                     │ unused
│          │ elementary stream 2 ├────────╳
│          │                     │
└──────────┴─────────────────────┘

خط لوله فوق با دستور زیر ساخته می‌شود:

ffmpeg -i INPUT.mkv -map 0:1 -c copy OUTPUT.mp4

سناریوهای پیچیده‌تر کپی استریم را نیز می‌توان ایجاد کرد، برای مثال ترکیب استریم‌ها از دو فایل ورودی مختلف در یک خروجی:

┌──────────┬────────────────────┐         ┌────────────────────┬───────────┐
│ demuxer 0│                    │ packets │                    │   muxer   │
╞══════════╡elementary stream 0 ├────────►│elementary stream 0 ╞═══════════╡
│INPUT0.mkv│                    │         │                    │OUTPUT.mp4 │
└──────────┴────────────────────┘         ├────────────────────┤           │
┌──────────┬────────────────────┐         │                    │           │
│ demuxer 1│                    │ packets │elementary stream 1 │           │
╞══════════╡elementary stream 0 ├────────►│                    │           │
│INPUT1.aac│                    │         └────────────────────┴───────────┘
└──────────┴────────────────────┘

که با دستور زیر اجرا می‌گردد:

ffmpeg -i INPUT0.mkv -i INPUT1.aac -map 0:0 -map 1:0 -c copy OUTPUT.mp4

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

┌──────────┬─────────────────────┐          ┌───────────────────┬───────────┐
│ demuxer  │                     │ packets  │                   │ muxer 0   │
╞══════════╡ elementary stream 0 ├─────────►│elementary stream 0╞═══════════╡
│          │                     │          │                   │OUTPUT0.mp4│
│INPUT.mkv ├─────────────────────┤          └───────────────────┴───────────┘
│          │                     │ packets  ┌───────────────────┬───────────┐
│          │ elementary stream 1 ├─────────►│                   │ muxer 1   │
│          │                     │          │elementary stream 0╞═══════════╡
└──────────┴─────────────────────┘          │                   │OUTPUT1.mp4│
                                            └───────────────────┴───────────┘

که با دستور زیر ساخته می‌شود:

ffmpeg -i INPUT.mkv -map 0:0 -c copy OUTPUT0.mp4 -map 0:1 -c copy OUTPUT1.mp4

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

┌──────────┬─────────────────────┐
│ demuxer  │                     │       audio packets
╞══════════╡ stream 0 (audio)    ├─────────────────────────────────────╮
│          │                     │                                     │
│INPUT.mkv ├─────────────────────┤ video    ┌─────────┐     raw        │
│          │                     │ packets  │  video  │ video frames   │
│          │ stream 1 (video)    ├─────────►│ decoder ├──────────────╮ │
│          │                     │          │         │              │ │
└──────────┴─────────────────────┘          └─────────┘              │ │
                                                                     ▼ ▼
                                                                     │ │
┌──────────┬─────────────────────┐ video    ┌─────────┐              │ │
│ muxer    │                     │ packets  │  video  │              │ │
╞══════════╡ stream 0 (video)    │◄─────────┤ encoder ├──────────────╯ │
│          │                     │          │(libx264)│                │
│OUTPUT.mp4├─────────────────────┤          └─────────┘                │
│          │                     │                                     │
│          │ stream 1 (audio)    │◄────────────────────────────────────╯
│          │                     │
└──────────┴─────────────────────┘

دستور خط فرمان متناظر:

ffmpeg -i INPUT.mkv -map 0:v -map 0:a -c:v libx264 -c:a copy OUTPUT.mp4

هنگام ترنسکدینگ، استریم‌های صوتی و تصویری می‌توانند پیش از انکود نهایی توسط فیلترگراف‌های ساده یا پیچیده پردازش شوند. اضافه کردن فیلتر به مثال ترنسکدینگ فوق به شکل زیر خواهد بود:

┌──────────┬───────────────┐
│ demuxer  │               │          ┌─────────┐
╞══════════╡ video stream  │ packets  │  video  │ frames
│INPUT.mkv │               ├─────────►│ decoder ├─────►───╮
│          │               │          └─────────┘         │
└──────────┴───────────────┘                              │
                                  ╭───────────◄───────────╯
                                  │   ┌────────────────────────┐
                                  │   │  simple filtergraph    │
                                  │   ╞════════════════════════╡
                                  │   │  ┌───────┐  ┌───────┐  │
                                  ╰──►├─►│ yadif ├─►│ scale ├─►├╮
                                      │  └───────┘  └───────┘  ││
                                      └────────────────────────┘│
                                                                │
                                                                │
┌──────────┬───────────────┐ video    ┌─────────┐               │
│ muxer    │               │ packets  │  video  │               │
╞══════════╡ video stream  │◄─────────┤ encoder ├───────◄───────╯
│OUTPUT.mp4│               │          │         │
│          │               │          └─────────┘
└──────────┴───────────────┘

دیکودرهای لوپ‌بک خروجی یک انکودر را مجدداً دیکود می‌کنند تا بتوان آن را دوباره به یک فیلترگراف پیچیده متصل نمود. این کار با دستور "-dec" و مشخص‌کردن اندیس خروجی صورت می‌گیرد:

ffmpeg -i INPUT                                        \
  -map 0:v:0 -c:v libx264 -crf 45 -f null -            \
  -threads 3 -dec 0:0                                  \
  -filter_complex '[0:v][dec:0]hstack[stack]'          \
  -map '[stack]' -c:v ffv1 OUTPUT

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

┌──────────┬───────────────┐
│ demuxer  │               │   ┌─────────┐            ┌─────────┐    ┌────────────────────┐
╞══════════╡ video stream  │   │  video  │            │  video  │    │ null muxer         │
│   INPUT  │               ├──►│ decoder ├──┬────────►│ encoder ├─┬─►│(discards its input)│
│          │               │   └─────────┘  │         │(libx264)│ │  └────────────────────┘
└──────────┴───────────────┘                │         └─────────┘ │
                                 ╭───────◄──╯   ┌─────────┐       │
                                 │              │loopback │       │
                                 │ ╭─────◄──────┤ decoder ├────◄──╯
                                 │ │            └─────────┘
                                 │ │
                                 │ │
                                 │ │  ┌───────────────────┐
                                 │ │  │complex filtergraph│
                                 │ │  ╞═══════════════════╡
                                 │ │  │  ┌─────────────┐  │
                                 ╰─╫─►├─►│   hstack    ├─►├╮
                                   ╰─►├─►│             │  ││
                                      │  └─────────────┘  ││
                                      └───────────────────┘│
                                                           │
┌──────────┬───────────────┐  ┌─────────┐                  │
│ muxer    │               │  │  video  │                  │
╞══════════╡ video stream  │◄─┤ encoder ├───────◄──────────╯
│  OUTPUT  │               │  │ (ffv1)  │
│          │               │  └─────────┘
└──────────┴───────────────┘

دستور ffmpeg گزینه "-map" را برای کنترل دستی انتخاب استریم‌ها در هر فایل خروجی فراهم ساخته است. کاربران می‌توانند از "-map" صرف‌نظر کنند تا ffmpeg به طور خودکار استریم‌ها را برگزیند. گزینه‌های "-vn / -an / -sn / -dn" نیز می‌توانند برای حذف و نادیده‌گرفتن استریم‌های ویدیو، صدا، زیرنویس و داده استفاده شوند.

قوانین انتخاب خودکار استریم:

  • ویدیو: استریمی که بالاترین وضوح (Resolution) را دارد انتخاب می‌شود.
  • صدا: استریمی که بیشترین تعداد کانال صوتی را داراست برگزیده می‌شود.
  • زیرنویس: نخستین استریم زیرنویس منطبق با نوع انکودر پیش‌فرض (متنی یا تصویری) انتخاب می‌گردد.

استریم‌های داده یا پیوست‌ها به طور خودکار انتخاب نمی‌شوند و فقط با گزینه "-map" قابل انتقال هستند.

هنگامی که از گزینه "-map" استفاده می‌شود، منحصراً استریم‌های نگاشت‌شده توسط کاربر در آن فایل خروجی قرار می‌گیرند.

مثال‌های زیر رفتار، جزئیات و نحوه عملکرد روش‌های انتخاب استریم در ffmpeg را نشان می‌دهند. این مثال‌ها سه فایل ورودی زیر را در نظر می‌گیرند:

input file 'A.avi'
      stream 0: video 640x360
      stream 1: audio 2 channels

input file 'B.mp4'
      stream 0: video 1920x1080
      stream 1: audio 2 channels
      stream 2: subtitles (text)
      stream 3: audio 5.1 channels
      stream 4: subtitles (text)

input file 'C.mkv'
      stream 0: video 1280x720
      stream 1: audio 2 channels
      stream 2: subtitles (image)

مثال: انتخاب خودکار استریم (automatic stream selection):

ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

سه فایل خروجی مشخص شده است. برای دو فایل اول گزینه‌ای از "-map" تعیین نشده است، بنابراین ffmpeg استریم‌ها را به طور خودکار برمی‌گزیند.

فایل out1.mkv کانتینر ماتروشکا است و ویدیو، صدا و زیرنویس می‌پذیرد. برای ویدیو، "stream 0" از B.mp4 (بالاترین رزولوشن)، برای صدا "stream 3" از B.mp4 (بیشترین کانال 5.1)، و برای زیرنویس نخستین استریم زیرنویس ("stream 2" از B.mp4) انتخاب می‌شود.

فایل out2.wav تنها جریان صوتی می‌پذیرد، بنابراین تنها استریم 3 از B.mp4 انتخاب می‌گردد.

برای out3.mov، از آن‌جا که گزینه "-map 1:a" تعیین شده است، انتخاب خودکار متوقف شده و تمام استریم‌های صوتی از ورودی دوم (B.mp4) به صورت کپی مستقیم (-c:a copy) منتقل می‌شوند.

مثال: انتخاب خودکار زیرنویس‌ها (automatic subtitles selection):

ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv

مثال: خروجی‌های بدون برچسب فیلترگراف (unlabeled filtergraph outputs):

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

تمام گزینه‌های عددی، چنانچه تصریح نشده باشد، یک رشته عددی را می‌پذیرند که می‌تواند با یکی از پیشوندهای استاندارد یکای SI همراه باشد، مانند: 'K' (کیلو)، 'M' (مگا)، یا 'G' (گیگا).

اگر حرف 'i' به پیشوند SI اضافه شود، به عنوان ضریب دودویی (بر پایه توان‌های 1024 به‌جای 1000) تفسیر می‌گردد؛ مانند: 'KiB', 'MiB', 'GiB'. اضافه کردن 'B' مقدار را در 8 ضرب می‌کند (تبدیل بایت به بیت).

گزینه‌هایی که آرگومان دریافت نمی‌کنند، گزینه‌های بولی (Boolean) هستند و مقدار true را ثبت می‌کنند. برای خاموش کردن آن‌ها می‌توان از پیشوند "no" استفاده کرد؛ به عنوان مثال -nofoo گزینه foo را غیرفعال می‌سازد.

گزینه‌های دارای آرگومان از سینتکس فایل نیز پشتیبانی می‌کنند؛ بدین صورت که اگر بلافاصله پس از خط‌تیره یک اسلش '/' اضافه شود، آرگومان به عنوان مسیر فایلی خوانده می‌شود که محتوای گزینه از داخل آن بارگذاری خواهد شد:

ffmpeg -i INPUT -/filter:v filter.script OUTPUT

دستور بالا توضیحات و ساختار فیلترگراف ویدیو را از فایل متنی filter.script بارگذاری خواهد کرد.

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

مشخص‌کننده استریم رشته‌ای است که معمولاً پس از علامت دو‌نقطه به نام گزینه افزوده می‌شود. برای نمونه "-codec:a:1 ac3" شامل مشخص‌کننده "a:1" است که دومین استریم صوتی را انتخاب کرده و کدک ac3 را برای آن برمی‌گزیند.

یک مشخص‌کننده می‌تواند با چندین استریم مطابقت داشته باشد؛ برای مثال "-b:a 128k" نرخ بیت 128 کیلوبیت را برای تمام استریم‌های صوتی اعمال می‌کند.

یک مشخص‌کننده خالی با تمام استریم‌ها مطابقت دارد. مثلاً "-codec copy"; تمام استریم‌ها را بدون انکود مجدد کپی می‌نماید.

حالت‌های مختلف مشخص‌کننده‌های استریم عبارتند از:

انتخاب استریم بر اساس اندیس عددی (مثلاً -threads:1 4 تعداد ریسه‌های دومین استریم را روی 4 تنظیم می‌کند).
نوع استریم: 'v' یا 'V' برای ویدیو، 'a' برای صدا، 's' برای زیرنویس، 'd' برای داده و 't' برای پیوست‌ها. حرف 'v' با تمام استریم‌های ویدیویی مطابقت دارد و 'V' فقط با ویدیوهایی که تصویر پیوست یا کاور نیستند.
استریم‌هایی که در برنامه‌ای با شناسه program_id قرار دارند.
#stream_id or i:stream_id
انتخاب بر اساس شناسه اختصاصی استریم (مانند PID در کانتینر MPEG-TS).
انتخاب استریم بر اساس تگ متادیتا با کلید key و مقدار اختیاری value (مانند -map 0:m:language:fas برای صدای فارسی).
انتخاب استریم‌های با پیکربندی قابل استفاده (کدک و پارامترهای پایه‌ای مانند ابعاد ویدیو یا نرخ نمونه‌برداری صدا باید موجود باشند).

این گزینه‌ها میان تمامی ابزارهای مجموعه ff* به صورت مشترک پشتیبانی می‌شوند.

نمایش مجوز برنامه (License).
نمایش راهنما. یک پارامتر اختیاری می‌تواند برای دریافت راهنما درباره یک مؤلفه خاص مشخص شود:
چاپ گزینه‌های پیشرفته علاوه بر گزینه‌های پایه.
چاپ فهرست کامل تمامی گزینه‌ها شامل انکودرها، دیکودرها، فیلترها و فرمت‌ها.
اطلاعات دقیق درباره دیکودر مشخص‌شده با decoder_name.
اطلاعات دقیق درباره انکودر مشخص‌شده با encoder_name.
اطلاعات تفصیلی درباره دی‌ماکسر مشخص‌شده با demuxer_name.
اطلاعات تفصیلی درباره ماکسر مشخص‌شده با muxer_name.
اطلاعات کامل فیلتر مشخص‌شده با filter_name.
نمایش نسخه برنامه و کتابخانه‌های مورد استفاده.
نمایش پیکربندی و پارامترهای بیلد برنامه.
نمایش تمام فرمت‌های قابل پشتیبانی (کانتینرها و دستگاه‌ها).
نمایش فهرست کامل دی‌ماکسرهای در دسترس.
نمایش فهرست کامل ماکسرهای در دسترس.
نمایش دستگاه‌های ورودی و خروجی در دسترس.
نمایش تمام کدک‌های شناخته‌شده برای کتابخانه libavcodec.
نمایش دیکودرهای در دسترس.
نمایش انکودرهای در دسترس.
نمایش تمامی فیلترهای ویدیویی و صوتی در دسترس libavfilter.
نمایش پروتکل‌های شبکه و ورودی/خروجی در دسترس (مانند http, rtmp, file).
تنظیم سطح گزارش‌دهی پیام‌ها (LogLevel)؛ گزینه‌های ممکن شامل: quiet, panic, fatal, error, warning, info, verbose, debug.
نام مستعار برای -loglevel.
تولید گزارش کامل خط فرمان و لاگ در فایلی با پسوند log در دایرکتوری جاری.
پنهان کردن بنر پیش‌فرض متنی حاوی اطلاعات کپی‌رایت و بیلد در ابتدای خروجی خط فرمان.

این گزینه‌ها مستقیماً توسط کتابخانه‌های libavformat، libavdevice و libavcodec ارائه می‌شوند. برای مشاهده فهرست کامل AVOptions از گزینه -help استفاده کنید. آن‌ها به دو دسته تقسیم می‌شوند:

عمومی
این گزینه‌ها برای هر کانتینر، کدک یا دستگاهی قابل تنظیم هستند.
اختصاصی
این گزینه‌ها مختص یک کانتینر، کدک یا سخت‌افزار خاص هستند. به عنوان مثال برای نوشتن متادیتا با تگ ID3v2.3 به جای ID3v2.4 پیش‌فرض در فایل MP3 از گزینه اختصاصی ماکسر MP3 استفاده می‌شود:
ffmpeg -i input.flac -id3v2_version 3 out.mp3

اجبار قالب فایل ورودی یا خروجی. به طور معمول قالب به صورت خودکار برای فایل‌های ورودی تشخیص داده می‌شود و برای خروجی نیز از پسوند فایل تخمین زده می‌شود.
آدرس یا مسیر فایل ورودی.
بازنویسی و جایگزینی فایل‌های خروجی بدون پرسش و تأیید کاربر.
عدم بازنویسی فایل‌های خروجی؛ چنانچه فایل خروجی وجود داشته باشد بلافاصله برنامه خارج می‌شود.
تعیین تعداد دفعات تکرار (Loop) استریم ورودی. مقدار 0 یعنی بدون تکرار و -1 به معنای حلقه نامحدود است.
انتخاب یک انکودر (پیش از خروجی) یا یک دیکودر (پیش از ورودی) برای یک یا چند استریم. مقدار codec نام انکودر/دیکودر است یا مقدار ویژه "copy" (فقط خروجی) که نشان می‌دهد استریم نباید مجدداً انکود شود.

مثال:

ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

تمام استریم‌های ویدیو را با libx264 انکود کرده و تمام استریم‌های صوتی را کپی می‌کند.

در ورودی، مدت‌زمان خواندن داده از فایل ورودی را محدود می‌سازد. در خروجی، نوشتن را پس از رسیدن مدت‌زمان به مقدار duration متوقف می‌کند.
توقف نوشتن خروجی یا خواندن ورودی در نقطه زمانی position.
تعیین سقف حجم فایل خروجی به بایت.
پرش زمانی (Seek) در ورودی یا خروجی به موقعیت زمانی مشخص‌شده توسط position (مثلاً 00:01:30 یا 90).
پرش زمانی نسبت به انتهای فایل (مقادیر منفی به نقاط پیش از پایان اشاره دارند).
تنظیم برچسب زمانی ثبت کانتینر در خروجی.
تنظیم تگ کلید/مقدار در متادیتای خروجی (مانند title="عنوان فیلم" یا author="نام نویسنده").
تنظیم وضعیت پیش‌فرض، اجباری یا اختیاری بودن استریم (مانند default, forced, hearing_impaired).
تعیین فرمت هدف استاندارد (مانند vcd, svcd, dvd, dv, pal-dvd).
ایجاد فیلترگراف مشخص‌شده و استفاده از آن برای پردازش استریم.
تعریف یک فیلترگراف پیچیده با چندین ورودی و/یا خروجی.

تنظیم تعداد فریم‌های ویدیویی خروجی (نام مستعار قدیمی برای -frames:v).
تنظیم نرخ فریم ویدیو بر حسب هرتز یا فریم بر ثانیه (مثلاً 24, 30, 60 یا 30000/1001).
تنظیم سقف حداکثر نرخ فریم خروجی.
تنظیم ابعاد فریم ویدیو به فرمت wxh (عرض در ارتفاع؛ مانند 1920x1080 یا 1280x720 یا اختصاراتی مانند hd1080).
تنظیم نسبت تصویر (Display Aspect Ratio) ویدیو (مانند 16:9 یا 4:3).
غیرفعال کردن ضبط یا پردازش ویدیو (صرف‌نظر کردن از استریم‌های ویدیو).
تنظیم کدک ویدیو (نام مستعار برای -codec:v).
شماره مرحله انکود چندمرحله‌ای (1 یا 2 در انکود دو مرحله‌ای two-pass).
نام مستعار برای -filter:v (اعمال فیلترگراف ویدیو بر روی خروجی).

تنظیم فرمت پیکسل (Pixel Format؛ مانند yuv420p, yuv444p, nv12, rgb24). برای مشاهده فهرست کامل فرمت‌ها از -pix_fmts استفاده کنید.
تنظیم فلگ‌های پیش‌فرض کتابخانه libswscale برای تغییر اندازه تصویر (مانند bicubic, lanczos, bilinear).
ثبت و ذخیره آمار انکود فریم‌های ویدیو در فایلی با ساختار vstats_HHMMSS.log.
تعیین نام اختصاصی فایل برای ذخیره آمار انکود ویدیو.
اجبار تگ ویدیو / کد چهارنویسه‌ای FourCC (نام مستعار برای -tag:v).
اجبار تولید فریم کلیدی (I-frame / Keyframe) در نقاط زمانی مشخص یا بر اساس روابط ریاضی (مناسب برای ساخت پکت‌های HLS و DASH).

تنظیم تعداد فریم‌های صوتی خروجی (نام مستعار قدیمی برای -frames:a).
تنظیم نرخ نمونه‌برداری صوت (Sampling Frequency) بر حسب هرتز (مانند 44100 یا 48000).
تنظیم کیفیت صدا در انکود VBR متغیر (نام مستعار برای -q:a).
تنظیم تعداد کانال‌های صوتی (مثلاً 1 برای مونو، 2 برای استریو، 6 برای 5.1).
غیرفعال کردن پردازش یا ضبط صدا (صرف‌نظر کردن از استریم‌های صوتی).
تنظیم کدک صوتی (نام مستعار برای -codec:a؛ مانند aac, libmp3lame, opus, flac).
نام مستعار برای -filter:a (اعمال فیلترگراف صوتی مانند ولوم، اکولایزر یا ری‌سمپل).

تنظیم کدک زیرنویس (نام مستعار برای -codec:s؛ مانند srt, subrip, ass, mov_text).
غیرفعال کردن پردازش یا ضبط زیرنویس (صرف‌نظر کردن از استریم‌های زیرنویس).
اصلاح مدت‌زمان نمایش زیرنویس‌ها برای جلوگیری از هم‌پوشانی نامطلوب (به ویژه در زیرنویس‌های DVB).

ایجاد یک یا چند استریم در فایل خروجی. این گزینه دو شیوه اصلی برای تعیین منبع داده دارد: شیوه نخست یک یا چند استریم را از یک فایل ورودی مشخص انتخاب می‌کند (که با -i تعریف شده است)، و شیوه دوم خروجی یک فیلترگراف پیچیده را تحویل می‌گیرد (که با -filter_complex تنظیم شده است).

قرار دادن علامت خط‌تیره "-" پیش از شناسه استریم، یک نگاشت منفی ایجاد می‌کند و استریم‌های منطبق را از نگاشت‌های قبلی حذف می‌نماید.

علامت سؤال "?" در انتهای اندیس استریم به این معناست که اگر استریم مورد نظر یافت نشد، برنامه با خطا متوقف نشود و از آن صرف‌نظر نماید.

خواندن ورودی با نرخ فریم بومی خود (سرعت زمان واقعی Realtime). این گزینه به ویژه برای شبیه‌سازی پخش زنده شبکه یا ارسال جریان‌های زنده RTMP/RTSP کاربرد دارد.
نمایش آمار محک زدن و زمان مصرفی CPU و حافظه در انتهای پردازش انکود.
اتمام نوشتن خروجی به محض پایان کوتاه‌ترین استریم ورودی (بسیار مفید هنگام ترکیب یک تصویر ثابت با یک فایل صوتی بلند).

یک فایل پیش‌تنظیم حاوی مجموعه‌ای از زوج‌های گزینه=مقدار در هر خط است که برای جلوگیری از نوشتن گزینه‌های طولانی در خط فرمان استفاده می‌شود. خطوطی که با '#' آغاز شوند به عنوان یادداشت در نظر گرفته می‌شوند.

گزینه‌های "-vstats" و "-vstats_file" تولید فایلی حاوی مشخصات آماری فریم‌های خروجی ویدیویی را فعال می‌کنند. اطلاعاتی مانند شماره فریم، کیفیت فریم (q)، نسبت سیگنال به نویز (PSNR)، حجم فریم و نرخ بیت متوسط در آن ثبت می‌گردد.

در صورت تعیین قالب و دستگاه ورودی، ffmpeg می‌تواند صدا و تصویر را مستقیماً ضبط کند:

ffmpeg -f alsa -ac 2 -i hw:0 -f video4linux2 -i /dev/video0 /tmp/out.mpg

برای ضبط از دسکتاپ و محیط گرافیکی لینوکس (X11):

ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 /tmp/desktop.mp4

در دستور فوق :0.0 شماره صفحه نمایش سرور X11 شما است (همانند متغیر محیطی DISPLAY).

هر فرمت و پروتکل پشتیبانی‌شده می‌تواند به عنوان ورودی برای ffmpeg استفاده شود:

  • تبدیل یک فایل ویدیویی به MP4 با انکودر H.264 و صدای AAC:
    ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
  • استخراج صدای یک ویدیو بدون انکود مجدد (کپی مستقیم):
    ffmpeg -i video.mp4 -vn -c:a copy audio.aac
  • استخراج فریم‌های ویدیویی به صورت عکس (یک عکس در هر ثانیه):
    ffmpeg -i input.mp4 -r 1 -f image2 frame_%04d.jpg
  • ساخت یک ویدیو از توالی عکس‌ها با نرخ 30 فریم بر ثانیه:
    ffmpeg -framerate 30 -i frame_%04d.jpg -c:v libx264 -pix_fmt yuv420p output.mp4
  • بریدن بخشی از ویدیو از دقیقه 1 به مدت 30 ثانیه:
    ffmpeg -ss 00:01:00 -i input.mp4 -t 30 -c copy cut.mp4

ffmpeg-all(1), ffplay(1), ffprobe(1), ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1)

توسعه‌دهندگان و جامعه پروژه FFmpeg.

برای مشاهده تاریخچه مشارکت‌کنندگان، به تاریخچه Git پروژه در https://git.ffmpeg.org/ffmpeg مراجعه کنید یا دستور git log را در درخت کد منبع FFmpeg اجرا نمایید.

نگه‌دارندگان مؤلفه‌ها در فایل MAINTAINERS در درخت کد منبع لیست شده‌اند.

2026-09-07 FFmpeg