目錄
1 概要
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
2 描述
ffmpeg
是一個通用的媒體轉換器。它可以讀取各種輸入 - 包括即時擷取/錄製裝置 - 濾鏡處理,並將它們轉碼為大量的輸出格式。
ffmpeg
從任意數量的輸入(可以是常規檔案、管道、網路串流、擷取裝置等)讀取,這些輸入由 -i
選項指定,並寫入任意數量的輸出,這些輸出由純輸出 URL 指定。在命令列上找到的任何無法解釋為選項的內容都被視為輸出 URL。
原則上,每個輸入或輸出都可以包含任意數量的不同類型(視訊/音訊/字幕/附件/資料)的基本串流,儘管允許的串流計數和/或類型可能受到容器格式的限制。從哪些輸入中選擇哪些串流進入哪個輸出,可以自動完成,也可以使用 -map
選項(請參閱「串流選擇」章節)。
要在選項中引用輸入/輸出,您必須使用它們的索引(從 0 開始)。例如,第一個輸入是 0
,第二個是 1
,依此類推。同樣,輸入/輸出中的串流也由它們的索引引用。例如,2:3
指的是第三個輸入或輸出中的第四個串流。另請參閱「串流指定器」章節。
作為一般規則,選項應用於下一個指定的檔案。因此,順序很重要,您可以在命令列上多次使用相同的選項。每次出現都會應用於下一個輸入或輸出檔案。此規則的例外是全域選項(例如,詳細程度),應首先指定。
不要混合輸入和輸出檔案 - 首先指定所有輸入檔案,然後指定所有輸出檔案。也不要混合屬於不同檔案的選項。所有選項僅適用於下一個輸入或輸出檔案,並在檔案之間重置。
以下是一些簡單的範例。
- 透過重新編碼媒體串流,將輸入媒體檔案轉換為不同的格式
ffmpeg -i input.avi output.mp4
- 將輸出檔案的視訊位元率設定為 64 kbit/s
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4
- 強制輸出檔案的影格率為 24 fps
ffmpeg -i input.avi -r 24 output.mp4
- 強制輸入檔案(僅對原始格式有效)的影格率為 1 fps,輸出檔案的影格率為 24 fps
ffmpeg -r 1 -i input.m2v -r 24 output.mp4
原始輸入檔案可能需要格式選項。
3 詳細描述
ffmpeg
使用以下列出的組件建構轉碼管道。然後,程式的運作包括輸入資料區塊從來源向下流動到接收器,同時被它們沿途遇到的組件轉換。
以下類型的組件可用
- 解多工器("demultiplexers" 的簡稱)讀取輸入來源以提取
- 全域屬性,例如中繼資料或章節;
- 輸入基本串流及其屬性的列表
為每個 -i 選項建立一個解多工器實例,並將編碼的 封包 發送到 解碼器 或 多工器。
在其他文獻中,解多工器有時稱為 分離器,因為它們的主要功能是將檔案分離為基本串流(儘管有些檔案只包含一個基本串流)。
解多工器的示意圖如下
┌──────────┬───────────────────────┐ │ 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. │
- 解碼器 接收音訊、視訊或字幕基本串流的編碼(壓縮)封包,並將它們解碼為原始 影格(視訊的像素陣列,音訊的 PCM)。解碼器通常與 解多工器 中的基本串流相關聯(並從中接收其輸入),但有時也可能單獨存在(請參閱「回環解碼器」)。
解碼器的示意圖如下
┌─────────┐ packets │ │ raw frames ─────────►│ decoder ├────────────► │ │ └─────────┘
- 濾鏡圖 處理和轉換原始音訊或視訊 影格。濾鏡圖由一個或多個連結成圖的個別 濾鏡 組成。濾鏡圖有兩種風味 - 簡單 和 複雜,分別使用 -filter 和 -filter_complex 選項配置。
簡單濾鏡圖與 輸出基本串流 相關聯;它從 解碼器 接收要過濾的輸入,並將過濾後的輸出發送到該輸出串流的 編碼器。
執行去交錯(使用
yadif
去交錯器)然後調整大小(使用scale
濾鏡)的簡單視訊濾鏡圖可能如下所示┌────────────────────────┐ │ simple filtergraph │ frames from ╞════════════════════════╡ frames for a decoder │ ┌───────┐ ┌───────┐ │ an encoder ────────────►├─►│ yadif ├─►│ scale ├─►│────────────► │ └───────┘ └───────┘ │ └────────────────────────┘
複雜濾鏡圖是獨立的,不與任何特定串流相關聯。它可能有多個(或零個)輸入,可能是不同類型(音訊或視訊),每個輸入都從解碼器或另一個複雜濾鏡圖的輸出接收資料。它也有一個或多個輸出,這些輸出饋送到編碼器或另一個複雜濾鏡圖的輸入。
以下範例圖表示具有 3 個輸入和 2 個輸出(全部為視訊)的複雜濾鏡圖
┌─────────────────────────────────────────────────┐ │ complex filtergraph │ ╞═════════════════════════════════════════════════╡ frames ├───────┐ ┌─────────┐ ┌─────────┐ ┌────────┤ frames ─────────►│input 0├─►│ overlay ├─────►│ overlay ├─►│output 0├────────► ├───────┘ │ │ │ │ └────────┤ frames ├───────┐╭►│ │ ╭►│ │ │ ─────────►│input 1├╯ └─────────┘ │ └─────────┘ │ ├───────┘ │ │ frames ├───────┐ ┌─────┐ ┌─────┬─╯ ┌────────┤ frames ─────────►│input 2├►│scale├►│split├───────────────►│output 1├────────► ├───────┘ └─────┘ └─────┘ └────────┤ └─────────────────────────────────────────────────┘
來自第二個輸入的影格覆蓋在來自第一個輸入的影格之上。來自第三個輸入的影格被重新縮放,然後複製到兩個相同的串流中。其中一個覆蓋在組合的前兩個輸入之上,結果作為濾鏡圖的第一個輸出公開。另一個副本最終成為濾鏡圖的第二個輸出。
- 編碼器 接收原始音訊、視訊或字幕 影格,並將它們編碼為編碼的 封包。編碼(壓縮)過程通常是 有損 的 - 它會降低串流品質以使輸出更小;有些編碼器是 無損 的,但代價是輸出大小要大得多。視訊或音訊編碼器從某些濾鏡圖的輸出接收其輸入,字幕編碼器從解碼器接收輸入(因為尚不支援字幕濾鏡處理)。每個編碼器都與某些多工器的 輸出基本串流 相關聯,並將其輸出發送到該多工器。
編碼器的示意圖如下
┌─────────┐ raw frames │ │ packets ────────────►│ encoder ├─────────► │ │ └─────────┘
- 多工器("multiplexers" 的簡稱)從編碼器(轉碼 路徑)或直接從解多工器(串流複製 路徑)接收其基本串流的編碼 封包,交錯它們(當有多個基本串流時),並將產生的位元組寫入輸出檔案(或管道、網路串流等)。
多工器的示意圖如下
┌──────────────────────┬───────────┐ 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. │ │ ▼
3.1 串流複製
ffmpeg
中最簡單的管道是單串流 串流複製,即複製一個 輸入基本串流 的封包,而無需解碼、濾鏡處理或編碼它們。例如,考慮一個名為 INPUT.mkv 的輸入檔案,其中包含 3 個基本串流,我們從中取出第二個並將其寫入檔案 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
在此命令列中
- 有一個輸入 INPUT.mkv;
- 此輸入沒有輸入選項;
- 有一個輸出 OUTPUT.mp4;
- 此輸出有兩個輸出選項
-
-map 0:1
選擇要使用的輸入串流 - 從索引為 0(即第一個)的輸入中選擇索引為 1(即第二個)的串流; -
-c copy
選擇copy
編碼器,即無解碼或編碼的串流複製。
-
串流複製對於更改基本串流計數、容器格式或修改容器級中繼資料很有用。由於沒有解碼或編碼,因此速度非常快,並且沒有品質損失。但是,由於各種因素(例如,目標容器所需的某些資訊在來源中不可用),它可能在某些情況下不起作用。顯然也不可能應用濾鏡,因為濾鏡在解碼後的影格上運作。
可以建構更複雜的串流複製情境 - 例如,將來自兩個輸入檔案的串流組合到單個輸出中
┌──────────┬────────────────────┐ ┌────────────────────┬───────────┐ │ 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
此處的輸出 -map 選項使用兩次,在輸出檔案中建立兩個串流 - 一個由第一個輸入饋送,另一個由第二個輸入饋送。單個 -c 選項實例為這兩個串流選擇串流複製。您也可以將此選項的多個實例與 串流指定器 一起使用,以將不同的值應用於每個串流,這將在後續章節中示範。
相反的情境是將來自單個輸入的多個串流分割為多個輸出
┌──────────┬─────────────────────┐ ┌───────────────────┬───────────┐ │ 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
請注意,即使它們的值相同,每個輸出檔案也需要單獨的 -c 選項實例。這是因為非全域選項(大多數選項都是)僅在它們放置之前的檔案的上下文中適用。
這些範例當然可以進一步推廣為將任意數量的輸入重新對應到任意數量的輸出。
3.2 轉碼
轉碼 是解碼串流然後再次編碼它的過程。由於編碼往往在計算上很昂貴,並且在大多數情況下會降低串流品質(即它是 有損 的),因此您應該僅在需要時進行轉碼,否則執行串流複製。轉碼的典型原因包括
- 應用濾鏡 - 例如,調整大小、去交錯或覆蓋視訊;重新取樣或混合音訊;
- 您想要將串流饋送到無法解碼原始編解碼器的設備。
請注意,除非您為音訊、視訊和字幕串流指定 -c copy,否則 ffmpeg
將轉碼所有這些串流。
考慮一個範例管道,它讀取一個包含一個音訊串流和一個視訊串流的輸入檔案,轉碼視訊並將音訊複製到單個輸出檔案中。這可以示意性地表示如下
┌──────────┬─────────────────────┐ │ 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
請注意它如何使用串流指定器 :v
和 :a
來選擇輸入串流,並將 -c 選項的不同值應用於它們;有關更多詳細資訊,請參閱「串流指定器」章節。
3.3 濾鏡處理
轉碼時,音訊和視訊串流可以在編碼之前使用 簡單 或 複雜 濾鏡圖進行濾鏡處理。
3.3.1 簡單濾鏡圖
簡單濾鏡圖是指那些只有一個輸入和一個輸出,並且兩者類型相同(音訊或視訊)的濾鏡圖。它們使用每個串流的 -filter 選項(帶有 -vf 和 -af 別名,分別用於 -filter:v(視訊)和 -filter:a(音訊))配置。請注意,簡單濾鏡圖與它們的輸出串流綁定,因此例如,如果您有多個音訊串流,-af 將為每個串流建立一個單獨的濾鏡圖。
從上面的轉碼範例中,新增濾鏡處理(並為了清楚起見省略音訊)使其看起來像這樣
┌──────────┬───────────────┐ │ demuxer │ │ ┌─────────┐ ╞══════════╡ video stream │ packets │ video │ frames │INPUT.mkv │ ├─────────►│ decoder ├─────►───╮ │ │ │ └─────────┘ │ └──────────┴───────────────┘ │ ╭───────────◄───────────╯ │ ┌────────────────────────┐ │ │ simple filtergraph │ │ ╞════════════════════════╡ │ │ ┌───────┐ ┌───────┐ │ ╰──►├─►│ yadif ├─►│ scale ├─►├╮ │ └───────┘ └───────┘ ││ └────────────────────────┘│ │ │ ┌──────────┬───────────────┐ video ┌─────────┐ │ │ muxer │ │ packets │ video │ │ ╞══════════╡ video stream │◄─────────┤ encoder ├───────◄───────╯ │OUTPUT.mp4│ │ │ │ │ │ │ └─────────┘ └──────────┴───────────────┘
3.3.2 複雜濾鏡圖
複雜濾鏡圖是指那些無法簡單地描述為應用於一個串流的線性處理鏈的濾鏡圖。例如,當圖有多個輸入和/或輸出,或者當輸出串流類型與輸入不同時,就是這種情況。複雜濾鏡圖使用 -filter_complex 選項配置。請注意,此選項是全域的,因為複雜濾鏡圖就其本質而言,無法明確地與單個串流或檔案相關聯。-filter_complex 的每個實例都會建立一個新的複雜濾鏡圖,並且可以有任意數量的濾鏡圖。
複雜濾鏡圖的一個簡單範例是 overlay
濾鏡,它有兩個視訊輸入和一個視訊輸出,其中包含一個視訊覆蓋在另一個視訊之上。它的音訊對應物是 amix
濾鏡。
3.4 回環解碼器
雖然解碼器通常與解多工器串流相關聯,但也可以建立 "回環" 解碼器,這些解碼器解碼來自某些編碼器的輸出,並允許將其回饋到複雜濾鏡圖。這是使用 -dec
指令完成的,該指令將應該解碼的輸出串流的索引作為參數。每個這樣的指令都會建立一個新的回環解碼器,索引從零開始的連續整數。然後,這些索引應該用於在複雜濾鏡圖連結標籤中引用回環解碼器,如 -filter_complex 的文件中所述。
解碼 AVOptions 可以透過將它們放在 -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
讀取輸入視訊,並
- (第 2 行)使用低品質的
libx264
對其進行編碼; - (第 3 行)使用 3 個執行緒解碼此編碼串流;
- (第 4 行)將解碼後的視訊與原始輸入視訊並排放置;
- (第 5 行)然後將組合後的視訊以無損方式編碼並寫入 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) │ │ │ │ └─────────┘ └──────────┴───────────────┘
4 串流選擇
ffmpeg
提供了 -map
選項,用於手動控制每個輸出檔案中的串流選擇。使用者可以跳過 -map
,讓 ffmpeg 執行如下所述的自動串流選擇。-vn / -an / -sn / -dn
選項可用於跳過包含視訊、音訊、字幕和資料串流,無論是手動對應還是自動選擇的,但複雜濾鏡圖的輸出串流除外。
4.1 描述
以下小節描述了串流選擇中涉及的各種規則。接下來的範例展示了如何在實務中應用這些規則。
雖然盡一切努力準確反映程式的行為,但 FFmpeg 仍在持續開發中,程式碼可能自撰寫本文時起已更改。
4.1.1 自動串流選擇
在特定輸出檔案沒有任何 map 選項的情況下,ffmpeg 會檢查輸出格式,以查看可以包含在其中的串流類型,即視訊、音訊和/或字幕。對於每種可接受的串流類型,ffmpeg 將從所有輸入中選擇一個串流(如果可用)。
它將根據以下標準選擇該串流
- 對於視訊,它是解析度最高的串流,
- 對於音訊,它是通道最多的串流,
- 對於字幕,它是找到的第一個字幕串流,但有一個注意事項。輸出格式的預設字幕編碼器可以是基於文字的或基於圖像的,並且只會選擇相同類型的字幕串流。
在多個相同類型且評級相同的串流的情況下,將選擇索引最低的串流。
資料或附件串流不會自動選擇,只能使用 -map
包含。
4.1.2 手動串流選擇
當使用 -map
時,只有使用者對應的串流才會包含在該輸出檔案中,但以下描述的濾鏡圖輸出可能是一個例外。
4.1.3 複雜濾鏡圖
如果存在任何帶有未標記墊的複雜濾鏡圖輸出串流,它們將被新增到第一個輸出檔案。如果輸出格式不支援串流類型,這將導致嚴重錯誤。在沒有 map 選項的情況下,包含這些串流會導致跳過其類型的自動串流選擇。如果存在 map 選項,則除了對應的串流之外,還包含這些濾鏡圖串流。
帶有標記墊的複雜濾鏡圖輸出串流必須對應一次且僅對應一次。
4.1.4 串流處理
串流處理獨立於串流選擇,但以下描述的字幕除外。串流處理透過針對特定 輸出 檔案中的串流的 -codec
選項設定。特別是,編解碼器選項在串流選擇過程之後由 ffmpeg 應用,因此不影響後者。如果未為串流類型指定 -codec
選項,ffmpeg 將選擇輸出檔案多工器註冊的預設編碼器。
字幕存在例外情況。如果為輸出檔案指定了字幕編碼器,則將包含找到的任何類型(文字或圖像)的第一個字幕串流。ffmpeg 不會驗證指定的編碼器是否可以轉換選定的串流,或者轉換後的串流是否在輸出格式中可接受。這也普遍適用:當使用者手動設定編碼器時,串流選擇過程無法檢查編碼後的串流是否可以多工處理到輸出檔案中。如果不能,ffmpeg 將中止,所有 輸出檔案都將處理失敗。
4.2 範例
以下範例說明了 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)
範例:自動串流選擇
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov
指定了三個輸出檔案,對於前兩個,未設定 -map
選項,因此 ffmpeg 將自動為這兩個檔案選擇串流。
out1.mkv 是一個 Matroska 容器檔案,接受視訊、音訊和字幕串流,因此 ffmpeg 將嘗試選擇每種類型的一個串流。
對於視訊,它將從 B.mp4 中選擇 stream 0
,這是所有輸入視訊串流中解析度最高的。
對於音訊,它將從 B.mp4 中選擇 stream 3
,因為它具有最多的通道數。
對於字幕,它將從 B.mp4 中選擇 stream 2
,這是 A.avi 和 B.mp4 中的第一個字幕串流。
out2.wav 僅接受音訊串流,因此僅選擇 B.mp4 中的 stream 3
。
對於 out3.mov,由於設定了 -map
選項,因此不會發生自動串流選擇。-map 1:a
選項將從第二個輸入 B.mp4 中選擇所有音訊串流。此輸出檔案中不會包含其他串流。
對於前兩個輸出,所有包含的串流都將被轉碼。選擇的編碼器將是每個輸出格式註冊的預設編碼器,這可能與選定輸入串流的編解碼器不符。
對於第三個輸出,音訊串流的編解碼器選項已設定為 copy
,因此不會發生或可以發生解碼-濾鏡處理-編碼操作。選定串流的封包應從輸入檔案傳送並在輸出檔案中進行多工處理。
範例:自動字幕選擇
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
雖然 out1.mkv 是一個接受字幕串流的 Matroska 容器檔案,但只會選擇視訊和音訊串流。C.mkv 的字幕串流是基於圖像的,而 Matroska 多工器的預設字幕編碼器是基於文字的,因此預計字幕的轉碼操作將失敗,因此不會選擇該串流。但是,在 out2.mkv 中,命令中指定了字幕編碼器,因此,除了視訊串流之外,還選擇了字幕串流。-an
的存在停用了 out2.mkv 的音訊串流選擇。
範例:未標記的濾鏡圖輸出
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
此處使用 -filter_complex
選項設定濾鏡圖,並且僅包含單個視訊濾鏡。overlay
濾鏡需要正好兩個視訊輸入,但未指定任何輸入,因此使用前兩個可用的視訊串流,即 A.avi 和 C.mkv 的視訊串流。濾鏡的輸出墊沒有標籤,因此發送到第一個輸出檔案 out1.mp4。因此,跳過了視訊串流的自動選擇,否則它將選擇 B.mp4 中的串流。通道最多的音訊串流,即 B.mp4 中的 stream 3
,會自動選擇。但是,不會選擇字幕串流,因為 MP4 格式沒有註冊預設字幕編碼器,並且使用者未指定字幕編碼器。
第二個輸出檔案 out2.srt 僅接受基於文字的字幕串流。因此,即使第一個可用的字幕串流屬於 C.mkv,它也是基於圖像的,因此被跳過。選定的串流,B.mp4 中的 stream 2
,是第一個基於文字的字幕串流。
範例:標記的濾鏡圖輸出
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \ -map '[outv]' -an out1.mp4 \ out2.mkv \ -map '[outv]' -map 1:a:0 out3.mkv
上面的命令將失敗,因為標記為 [outv]
的輸出墊已對應兩次。任何輸出檔案都將不會被處理。
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \ -an out1.mp4 \ out2.mkv \ -map 1:a:0 out3.mkv
上面的命令也會失敗,因為 hue 濾鏡輸出有一個標籤 [outv]
,但沒有對應到任何地方。
應將命令修改如下:
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \ -map '[outv1]' -an out1.mp4 \ out2.mkv \ -map '[outv2]' -map 1:a:0 out3.mkv
來自 B.mp4 的視訊串流被發送到 hue 濾鏡,其輸出使用 split 濾鏡複製一次,並且兩個輸出都被標記。然後,每個副本都對應到第一個和第三個輸出檔案。
overlay 濾鏡需要兩個視訊輸入,它使用前兩個未使用的視訊串流。這些串流是來自 A.avi 和 C.mkv 的串流。overlay 輸出未標記,因此無論 -map
選項是否存在,它都會發送到第一個輸出檔案 out1.mp4。
aresample 濾鏡會接收到第一個未使用的音訊串流,即 A.avi 的音訊串流。由於此濾鏡輸出也未標記,因此它也會對應到第一個輸出檔案。-an
的存在僅抑制音訊串流的自動或手動串流選擇,而不是從濾鏡圖發送的輸出。這兩個對應的串流應排序在 out1.mp4 中對應的串流之前。
對應到 out2.mkv
的視訊、音訊和字幕串流完全由自動串流選擇決定。
out3.mkv 由來自 hue 濾鏡的複製視訊輸出和來自 B.mp4 的第一個音訊串流組成。
5 選項
所有數值選項(除非另有說明)都接受表示數字的字串作為輸入,後跟 SI 單位字首之一,例如:'K'、'M' 或 'G'。
如果將 'i' 附加到 SI 單位字首,則完整字首將被解釋為二進制倍數的單位字首,二進制倍數基於 1024 的冪而不是 1000 的冪。將 'B' 附加到 SI 單位字首會將值乘以 8。這允許使用例如:'KB'、'MiB'、'G' 和 'B' 作為數字後綴。
不帶參數的選項是布林選項,並將對應的值設定為 true。可以透過在選項名稱前加上 "no" 將它們設定為 false。例如,使用 "-nofoo" 會將名稱為 "foo" 的布林選項設定為 false。
帶參數的選項支援特殊語法,其中命令列上給定的參數被解釋為從中載入實際參數值的文件路徑。要使用此功能,請在選項名稱前立即新增斜線 '/'(在開頭的破折號之後)。例如
ffmpeg -i INPUT -/filter:v filter.script OUTPUT
將從名為 filter.script 的檔案載入濾鏡圖描述。
5.1 串流指定器
某些選項是每個串流應用的,例如位元率或編解碼器。串流指定器用於精確指定給定選項屬於哪個或哪些串流。
串流指定器是一個字串,通常附加到選項名稱,並用冒號與其分隔。例如,-codec:a:1 ac3
包含 a:1
串流指定器,它與第二個音訊串流匹配。因此,它將為第二個音訊串流選擇 ac3 編解碼器。
一個串流指定器可以匹配多個串流,以便將選項應用於所有這些串流。例如,-b:a 128k
中的串流指定器與所有音訊串流匹配。
空串流指定器與所有串流匹配。例如,-codec copy
或 -codec: copy
將複製所有串流而不重新編碼。
串流指定器的可能形式為
- stream_index
匹配具有此索引的串流。例如,
-threads:1 4
將第二個串流的執行緒計數設定為 4。如果 stream_index 用作附加串流指定器(請參閱下文),則它從匹配的串流中選擇串流編號 stream_index。串流編號基於 libavformat 檢測到的串流順序,除非還指定了串流群組指定器或程式 ID。在這種情況下,它基於群組或程式中串流的順序。- stream_type[:additional_stream_specifier]
stream_type 是以下之一:'v' 或 'V' 表示視訊,'a' 表示音訊,'s' 表示字幕,'d' 表示資料,'t' 表示附件。'v' 匹配所有視訊串流,'V' 僅匹配非附加圖片、視訊縮圖或封面藝術的視訊串流。如果使用 additional_stream_specifier,則它匹配同時具有此類型並匹配 additional_stream_specifier 的串流。否則,它匹配指定類型的所有串流。
- g:group_specifier[:additional_stream_specifier]
匹配屬於具有指定器 group_specifier 的群組的串流。如果使用 additional_stream_specifier,則它匹配既是群組的一部分又匹配 additional_stream_specifier 的串流。group_specifier 可以是以下之一
- group_index
匹配具有此群組索引的串流。
- #group_id 或 i:group_id
匹配具有此群組 ID 的串流。
- p:program_id[:additional_stream_specifier]
匹配屬於具有 ID program_id 的程式的串流。如果使用 additional_stream_specifier,則它匹配既是程式的一部分又匹配 additional_stream_specifier 的串流。
- #stream_id 或 i:stream_id
依串流 ID(例如,MPEG-TS 容器中的 PID)匹配串流。
- m:key[:value]
匹配具有中繼資料標籤 key 且具有指定值的串流。如果未給出 value,則匹配包含具有任何值的給定標籤的串流。key 或 value 中的冒號字元 ':' 需要使用反斜線逸出。
- disp:dispositions[:additional_stream_specifier]
匹配具有給定 disposition 的串流。dispositions 是使用 '+' 連接的一個或多個 disposition(如 -dispositions 選項列印的)的列表。
- u
匹配具有可用配置的串流,編解碼器必須已定義,並且必須存在基本資訊,例如視訊尺寸或音訊取樣率。
請注意,在
ffmpeg
中,按中繼資料匹配僅適用於輸入檔案。
5.2 通用選項
這些選項在 ff* 工具之間共用。
- -L
顯示許可證。
- -h, -?, -help, --help [arg]
顯示說明。可以指定可選參數以列印有關特定項目的說明。如果未指定參數,則僅顯示基本(非進階)工具選項。
arg 的可能值為
- long
除了基本工具選項外,還列印進階工具選項。
- full
列印完整的選項列表,包括編碼器、解碼器、解多工器、多工器、濾鏡等的共用和私有選項。
- decoder=decoder_name
列印有關名為 decoder_name 的解碼器的詳細資訊。使用 -decoders 選項取得所有解碼器的列表。
- encoder=encoder_name
列印有關名為 encoder_name 的編碼器的詳細資訊。使用 -encoders 選項取得所有編碼器的列表。
- demuxer=demuxer_name
列印有關名為 demuxer_name 的解多工器的詳細資訊。使用 -formats 選項取得所有解多工器和多工器的列表。
- muxer=muxer_name
列印有關名為 muxer_name 的多工器的詳細資訊。使用 -formats 選項取得所有多工器和解多工器的列表。
- filter=filter_name
列印有關名為 filter_name 的濾鏡的詳細資訊。使用 -filters 選項取得所有濾鏡的列表。
- bsf=bitstream_filter_name
列印有關名為 bitstream_filter_name 的位元串流濾鏡的詳細資訊。使用 -bsfs 選項取得所有位元串流濾鏡的列表。
- protocol=protocol_name
列印有關名為 protocol_name 的協定的詳細資訊。使用 -protocols 選項取得所有協定的列表。
- -version
顯示版本。
- -buildconf
顯示建置配置,每行一個選項。
- -formats
顯示可用的格式(包括裝置)。
- -demuxers
顯示可用的解多工器。
- -muxers
顯示可用的多工器。
- -devices
顯示可用的裝置。
- -codecs
顯示 libavcodec 已知的所有編解碼器。
請注意,在整個文件中,術語「編解碼器」用作更正確的媒體位元串流格式的簡稱。
- -decoders
顯示可用的解碼器。
- -encoders
顯示所有可用的編碼器。
- -bsfs
顯示可用的位元串流濾鏡。
- -protocols
顯示可用的協定。
- -filters
顯示可用的 libavfilter 濾鏡。
- -pix_fmts
顯示可用的像素格式。
- -sample_fmts
顯示可用的取樣格式。
- -layouts
顯示通道名稱和標準通道佈局。
- -dispositions
顯示串流 disposition。
- -colors
顯示已識別的顏色名稱。
- -sources device[,opt1=val1[,opt2=val2]...]
顯示輸入裝置的自動偵測來源。某些裝置可能會提供無法自動偵測的系統相關來源名稱。傳回的列表不能假定為始終完整。
ffmpeg -sources pulse,server=192.168.0.4
- -sinks device[,opt1=val1[,opt2=val2]...]
顯示輸出裝置的自動偵測接收器。某些裝置可能會提供無法自動偵測的系統相關接收器名稱。傳回的列表不能假定為始終完整。
ffmpeg -sinks pulse,server=192.168.0.4
- -loglevel [flags+]loglevel | -v [flags+]loglevel
設定日誌記錄級別和程式庫使用的旗標。
可選的 flags 字首可以包含以下值
- ‘repeat’
表示不應將重複的日誌輸出壓縮到第一行,並且將省略「最後一條訊息重複 n 次」行。
- ‘level’
表示日誌輸出應將
[level]
字首新增到每個訊息行。這可以用作日誌著色的替代方案,例如,將日誌轉儲到檔案時。
旗標也可以單獨使用,方法是在 '+'/'-' 字首之前新增以設定/重置單個旗標,而不影響其他 flags 或更改 loglevel。當同時設定 flags 和 loglevel 時,預期在最後一個 flags 值和 loglevel 之前使用 '+' 分隔符。
loglevel 是一個字串或一個數字,包含以下值之一
- ‘quiet, -8’
完全不顯示任何內容;保持靜默。
- ‘panic, 0’
僅顯示可能導致進程崩潰的嚴重錯誤,例如斷言失敗。目前沒有用於任何內容。
- ‘fatal, 8’
僅顯示嚴重錯誤。這些是進程絕對無法繼續的錯誤之後的錯誤。
- ‘error, 16’
顯示所有錯誤,包括可以從中恢復的錯誤。
- ‘warning, 24’
顯示所有警告和錯誤。將顯示任何與可能不正確或意外事件相關的訊息。
- ‘info, 32’
在處理期間顯示資訊性訊息。這是警告和錯誤之外的訊息。這是預設值。
- ‘verbose, 40’
與
info
相同,但更詳細。- ‘debug, 48’
顯示所有內容,包括偵錯資訊。
- ‘trace, 56’
例如,要啟用重複的日誌輸出,新增
level
字首,並將 loglevel 設定為verbose
ffmpeg -loglevel repeat+level+verbose -i input output
另一個範例,啟用重複的日誌輸出,而不影響
level
字首旗標或 loglevel 的目前狀態ffmpeg [...] -loglevel +repeat
預設情況下,程式會記錄到 stderr。如果終端支援著色,則顏色用於標記錯誤和警告。可以透過設定環境變數
AV_LOG_FORCE_NOCOLOR
停用日誌著色,或可以透過設定環境變數AV_LOG_FORCE_COLOR
強制著色。- -report
將完整命令列和日誌輸出轉儲到目前目錄中名為
program-YYYYMMDD-HHMMSS.log
的檔案中。此檔案對於錯誤報告很有用。它也暗示-loglevel debug
。將環境變數
FFREPORT
設定為任何值都具有相同的效果。如果該值是以 ':' 分隔的 key=value 序列,則這些選項將影響報告;如果選項值包含特殊字元或選項分隔符 ':',則必須逸出選項值(請參閱 ffmpeg-utils 手冊中的「引號和逸出」章節)。以下選項被識別
- file
設定用於報告的檔案名稱;
%p
展開為程式的名稱,%t
展開為時間戳記,%%
展開為純%
- level
使用數值設定日誌詳細程度級別(請參閱
-loglevel
)。
例如,要使用日誌級別
32
(日誌級別info
的別名)將報告輸出到名為 ffreport.log 的檔案FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
剖析環境變數中的錯誤不是致命的,也不會出現在報告中。
- -hide_banner
禁止列印橫幅。
所有 FFmpeg 工具通常都會顯示版權聲明、建置選項和程式庫版本。此選項可用於禁止列印此資訊。
- -cpuflags flags (全域)
允許設定和清除 cpu 旗標。此選項用於測試。除非您知道自己在做什麼,否則不要使用它。
ffmpeg -cpuflags -sse+mmx ... ffmpeg -cpuflags mmx ... ffmpeg -cpuflags 0 ...
此選項的可能旗標為
- ‘x86’
- ‘mmx’
- ‘mmxext’
- ‘sse’
- ‘sse2’
- ‘sse2slow’
- ‘sse3’
- ‘sse3slow’
- ‘ssse3’
- ‘atom’
- ‘sse4.1’
- ‘sse4.2’
- ‘avx’
- ‘avx2’
- ‘xop’
- ‘fma3’
- ‘fma4’
- ‘3dnow’
- ‘3dnowext’
- ‘bmi1’
- ‘bmi2’
- ‘cmov’
- ‘ARM’
- ‘armv5te’
- ‘armv6’
- ‘armv6t2’
- ‘vfp’
- ‘vfpv3’
- ‘neon’
- ‘setend’
- ‘AArch64’
- ‘armv8’
- ‘vfp’
- ‘neon’
- ‘PowerPC’
- ‘altivec’
- ‘Specific Processors’
- ‘pentium2’
- ‘pentium3’
- ‘pentium4’
- ‘k6’
- ‘k62’
- ‘athlon’
- ‘athlonxp’
- ‘k8’
- -cpucount count (全域)
覆寫 CPU 計數的偵測。此選項用於測試。除非您知道自己在做什麼,否則不要使用它。
ffmpeg -cpucount 2
- -max_alloc bytes
設定 ffmpeg 系列 malloc 函數在堆積上配置區塊的最大大小限制。使用此選項時要格外小心。如果您不完全理解這樣做的後果,請勿使用。預設值為 INT_MAX。
5.3 AVOptions
這些選項由 libavformat、libavdevice 和 libavcodec 程式庫直接提供。要查看可用 AVOptions 的列表,請使用 -help 選項。它們分為兩類
- 通用
這些選項可以為任何容器、編解碼器或裝置設定。通用選項列在容器/裝置的 AVFormatContext 選項和編解碼器的 AVCodecContext 選項下。
- 私有
這些選項特定於給定的容器、裝置或編解碼器。私有選項列在其對應的容器/裝置/編解碼器下。
例如,要將 ID3v2.3 標頭而不是預設 ID3v2.4 寫入 MP3 檔案,請使用 MP3 多工器的 id3v2_version 私有選項
ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有編解碼器 AVOptions 都是每個串流的,因此應將串流指定器附加到它們
ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
在上面的範例中,多通道音訊串流對應兩次以進行輸出。第一個實例使用編解碼器 ac3 和位元率 640k 進行編碼。第二個實例被下混為 2 個通道並使用編解碼器 aac 進行編碼。使用輸出串流的絕對索引為其指定了 128k 的位元率。
注意:-nooption 語法不能用於布林 AVOptions,請使用 -option 0/-option 1。
注意:透過在選項名稱前加上 v/a/s 來指定每個串流 AVOptions 的舊的未記錄方式現在已過時,並將很快移除。
5.4 主要選項
- -f fmt (輸入/輸出)
強制輸入或輸出檔案格式。通常會自動偵測輸入檔案的格式,並從輸出檔案的副檔名猜測格式,因此在大多數情況下不需要此選項。
- -i url (輸入)
輸入檔案 URL
- -y (全域)
覆寫輸出檔案而不詢問。
- -n (全域)
不要覆寫輸出檔案,如果指定的輸出檔案已存在,則立即退出。
- -stream_loop number (輸入)
設定輸入串流應循環的次數。迴圈 0 表示不循環,迴圈 -1 表示無限迴圈。
- -recast_media (全域)
允許強制使用與解多工器偵測或指定的媒體類型不同的解碼器。適用於解碼多工處理為資料串流的媒體資料。
- -c[:stream_specifier] codec (輸入/輸出,每個串流)
- -codec[:stream_specifier] codec (輸入/輸出,每個串流)
為一個或多個串流選擇編碼器(在輸出檔案之前使用時)或解碼器(在輸入檔案之前使用時)。codec 是解碼器/編碼器的名稱,或特殊值
copy
(僅限輸出),表示串流不應重新編碼。例如
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
使用 libx264 編碼所有視訊串流並複製所有音訊串流。
對於每個串流,都會應用最後一個匹配的
c
選項,因此ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
將複製除第二個視訊之外的所有串流,第二個視訊將使用 libx264 編碼,而第 138 個音訊將使用 libvorbis 編碼。
- -t duration (輸入/輸出)
當用作輸入選項(在
-i
之前)時,限制從輸入檔案讀取的資料的 duration。當用作輸出選項(在輸出 URL 之前)時,在輸出持續時間達到 duration 後停止寫入輸出。
duration 必須是時間持續時間規格,請參閱 ffmpeg-utils(1) 手冊中的時間持續時間章節。
-to 和 -t 是互斥的,-t 具有優先權。
- -to position (輸入/輸出)
在 position 停止寫入輸出或讀取輸入。position 必須是時間持續時間規格,請參閱 ffmpeg-utils(1) 手冊中的時間持續時間章節。
-to 和 -t 是互斥的,-t 具有優先權。
- -fs limit_size (輸出)
設定檔案大小限制,以位元組表示。超過限制後,不再寫入其他位元組區塊。輸出檔案的大小略大於請求的檔案大小。
- -ss position (輸入/輸出)
當用作輸入選項(在
-i
之前)時,在此輸入檔案中搜尋到 position。請注意,在大多數格式中,不可能精確搜尋,因此ffmpeg
將搜尋到 position 之前的最接近的搜尋點。當轉碼並且啟用 -accurate_seek(預設值)時,將解碼並丟棄搜尋點和 position 之間的額外區段。當執行串流複製或使用 -noaccurate_seek 時,它將被保留。當用作輸出選項(在輸出 URL 之前)時,解碼但丟棄輸入,直到時間戳記達到 position。
position 必須是時間持續時間規格,請參閱 ffmpeg-utils(1) 手冊中的時間持續時間章節。
- -sseof position (輸入)
-
類似於
-ss
選項,但相對於「檔案結尾」。也就是說,負值在檔案中較早,0 在 EOF 處。 - -isync input_index (輸入)
將輸入指定為同步來源。
這將取得目標輸入和參考輸入的開始時間之間的差異,並將目標檔案的時間戳記偏移該差異。兩個輸入的來源時間戳記應來自相同的時鐘來源,以獲得預期的結果。如果設定了
copyts
,則也必須設定start_at_zero
。如果任一輸入沒有開始時間戳記,則不會進行同步調整。可接受的值是那些指有效的 ffmpeg 輸入索引的值。如果同步參考是目標索引本身或 -1,則不會對目標時間戳記進行任何調整。同步參考本身可能未與任何其他輸入同步。
預設值為 -1。
- -itsoffset offset (輸入)
設定輸入時間偏移。
offset 必須是時間持續時間規格,請參閱 ffmpeg-utils(1) 手冊中的時間持續時間章節。
偏移會新增到輸入檔案的時間戳記。指定正偏移表示對應的串流會延遲 offset 中指定的時間持續時間。
- -itsscale scale (輸入,每個串流)
重新縮放輸入時間戳記。scale 應為浮點數。
- -timestamp date (輸出)
在容器中設定錄製時間戳記。
date 必須是日期規格,請參閱 ffmpeg-utils(1) 手冊中的日期章節。
- -metadata[:metadata_specifier] key=value (輸出,每個中繼資料)
設定中繼資料鍵/值對。
可以給出可選的 metadata_specifier 以在串流、章節或程式上設定中繼資料。請參閱
-map_metadata
文件以取得詳細資訊。此選項會覆寫使用
-map_metadata
設定的中繼資料。也可以透過使用空值來刪除中繼資料。例如,要在輸出檔案中設定標題
ffmpeg -i in.avi -metadata title="my title" out.flv
要設定第一個音訊串流的語言
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
- -disposition[:stream_specifier] value (輸出,每個串流)
設定串流的 disposition 旗標。
預設值:預設情況下,所有 disposition 旗標都從輸入串流複製,除非此選項適用的輸出串流由複雜濾鏡圖饋送 - 在這種情況下,預設情況下不設定 disposition 旗標。
value 是以 '+' 或 '-' 分隔的 disposition 旗標序列。'+' 字首新增給定的 disposition,'-' 移除它。如果第一個旗標也以 '+' 或 '-' 作為字首,則產生的 disposition 是由 value 更新的預設值。如果第一個旗標沒有字首,則產生的 disposition 為 value。也可以透過將 disposition 設定為 0 來清除 disposition。
如果未為輸出檔案指定任何
-disposition
選項,則當輸出檔案中存在多個此類型的串流,並且沒有此類型的串流已標記為預設時,ffmpeg 將自動在每種類型的第一個串流上設定 '預設' disposition 旗標。-dispositions
選項列出了已知的 disposition 旗標。例如,要使第二個音訊串流成為預設串流
ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv
要使第二個字幕串流成為預設串流,並從第一個字幕串流中移除預設 disposition
ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv
要新增嵌入式封面/縮圖
ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4
要新增 'original' 並從第一個音訊串流中移除 'comment' disposition 旗標,而不移除其其他 disposition 旗標
ffmpeg -i in.mkv -c copy -disposition:a:0 +original-comment out.mkv
要移除 'original' 並將 'comment' disposition 旗標新增到第一個音訊串流,而不移除其其他 disposition 旗標
ffmpeg -i in.mkv -c copy -disposition:a:0 -original+comment out.mkv
要在第一個音訊串流上僅設定 'original' 和 'comment' disposition 旗標(並移除其其他 disposition 旗標)
ffmpeg -i in.mkv -c copy -disposition:a:0 original+comment out.mkv
要從第一個音訊串流中移除所有 disposition 旗標
ffmpeg -i in.mkv -c copy -disposition:a:0 0 out.mkv
並非所有多工器都支援嵌入式縮圖,並且支援縮圖的多工器僅支援少數格式,例如 JPEG 或 PNG。
- -program [title=title:][program_num=program_num:]st=stream[:st=stream...] (輸出)
-
建立具有指定 title、program_num 的程式,並將指定的 stream 新增到其中。
- -stream_group [map=input_file_id=stream_group][type=type:]st=stream[:st=stream][:stg=stream_group][:id=stream_group_id...] (輸出)
-
建立指定 type 和 stream_group_id 的串流群組,或透過 map 對應輸入群組,將指定的 stream 和/或先前定義的 stream_group 新增到其中。
type 可以是以下之一
- iamf_audio_element
將屬於相同 IAMF 音訊元素的 stream 分組
對於此群組 type,以下選項可用
- audio_element_type
音訊元素類型。支援以下值
- channel
可縮放通道音訊表示
- scene
環繞聲表示
- demixing
用於重建可縮放通道音訊表示的分離資訊。此選項必須與其餘選項以 ',' 分隔,並採用以下 key=value 選項
- parameter_id
影格中參數區塊可能參考的識別碼
- dmixp_mode
分離參數的預定義組合
- recon_gain
用於重建可縮放通道音訊表示的重建增益資訊。此選項必須與其餘選項以 ',' 分隔,並採用以下 key=value 選項
- parameter_id
影格中參數區塊可能參考的識別碼
- layer
定義音訊元素中通道佈局的層。此選項必須與其餘選項以 ',' 分隔。可以定義多個 ',' 分隔的條目,並且必須設定至少一個。
它採用以下 ":" 分隔的 key=value 選項
- ch_layout
圖層的通道佈局
- flags
以下旗標可用
- recon_gain
是否發出訊號指示 recon_gain 是否以中繼資料形式存在於影格中的參數區塊中
- output_gain
- output_gain_flags
output_gain 適用於哪些通道。以下旗標可用
- FL
- FR
- BL
- BR
- TFL
- TFR
- ambisonics_mode
環繞聲模式。如果 audio_element_type 設定為 channel,則此選項無效。
支援以下值
- mono
每個環繞聲通道都編碼為群組中的單獨單聲道串流
- default_w
預設權重值
- iamf_mix_presentation
將屬於所有 IAMF 音訊元素相同 IAMF 混合呈現參考的 stream 分組
對於此群組 type,以下選項可用
- submix
混合呈現中的子混合。此選項必須與其餘選項以 ',' 分隔。可以定義多個 ',' 分隔的條目,並且必須設定至少一個。
它採用以下 ":" 分隔的 key=value 選項
- parameter_id
影格中參數區塊可能參考的識別碼,用於後處理混合音訊訊號以產生用於播放的音訊訊號
- parameter_rate
影格中參數區塊中的取樣率持續時間欄位(參考此 parameter_id)表示為
- default_mix_gain
當沒有針對給定影格共用相同 parameter_id 的參數區塊時,要套用的預設混合增益值
- element
參考此混合呈現中使用的音訊元素,以產生用於播放的最終輸出音訊訊號。此選項必須與其餘選項以 '|' 分隔。可以定義多個 '|' 分隔的條目,並且必須設定至少一個。
它採用以下 ":" 分隔的 key=value 選項
- stg
此子混合參考的音訊元素的 stream_group_id
- parameter_id
影格中參數區塊可能參考的識別碼,用於在與其他已處理的音訊元素求和之前,對參考和呈現的音訊元素應用任何處理
- parameter_rate
影格中參數區塊中的取樣率持續時間欄位(參考此 parameter_id)表示為
- default_mix_gain
當沒有針對給定影格共用相同 parameter_id 的參數區塊時,要套用的預設混合增益值
- annotations
描述子混合元素的 key=value 字串,其中 "key" 是符合 BCP-47 的字串,用於指定 "value" 字串的語言。"key" 必須與混合的 annotations 中的 "key" 相同
- headphones_rendering_mode
指示當在耳機上播放時,輸入基於通道的音訊元素是呈現給立體聲揚聲器還是使用雙耳渲染器進行空間化。如果參考音訊元素的 audio_element_type 設定為 channel,則此選項無效。
支援以下值
- stereo
- binaural
- layout
指定此子混合的佈局,在此佈局上測量響度資訊。此選項必須與其餘選項以 '|' 分隔。可以定義多個 '|' 分隔的條目,並且必須設定至少一個。
它採用以下 ":" 分隔的 key=value 選項
- layout_type
-
- loudspeakers
佈局遵循 ITU-2051-3 的揚聲器聲音系統慣例。
- binaural
佈局是雙耳的。
- sound_system
通道佈局與 ITU-2051-3 的聲音系統 A 到 J 之一,以及 7.1.2 和 3.1.2 匹配。如果 layout_type 設定為 binaural,則此選項無效。
- integrated_loudness
程式整合響度資訊,如 ITU-1770-4 中定義。
- digital_peak
音訊訊號的數位(取樣)峰值,如 ITU-1770-4 中定義。
- true_peak
音訊訊號的真實峰值,如 ITU-1770-4 中定義。
- dialog_anchored_loudness
對白響度資訊,如 ITU-1770-4 中定義。
- album_anchored_loudness
專輯響度資訊,如 ITU-1770-4 中定義。
- annotations
描述混合的 key=value 字串字串,其中 "key" 是符合 BCP-47 的字串,用於指定 "value" 字串的語言。"key" 必須與所有子混合元素的 annotations 中的 "key" 相同
例如,要從多個 WAV 輸入檔案建立可縮放的 5.1 IAMF 檔案
ffmpeg -i front.wav -i back.wav -i center.wav -i lfe.wav -map 0:0 -map 1:0 -map 2:0 -map 3:0 -c:a opus -stream_group type=iamf_audio_element:id=1:st=0:st=1:st=2:st=3, demixing=parameter_id=998, recon_gain=parameter_id=101, layer=ch_layout=stereo, layer=ch_layout=5.1, -stream_group type=iamf_mix_presentation:id=2:stg=0:annotations=en-us=Mix_Presentation, submix=parameter_id=100:parameter_rate=48000|element=stg=0:parameter_id=100:annotations=en-us=Scalable_Submix|layout=sound_system=stereo|layout=sound_system=5.1 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.iamf
要將來自具有四個串流的輸入 IAMF 檔案的兩個串流群組(音訊元素和混合呈現)複製到 mp4 輸出中
ffmpeg -i input.iamf -c:a copy -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group map=0=1:stg=0 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.mp4
- -target type (輸出)
指定目標檔案類型(
vcd
、svcd
、dvd
、dv
、dv50
)。type 可以加上pal-
、ntsc-
或film-
字首,以使用對應的標準。然後會自動設定所有格式選項(位元率、編解碼器、緩衝區大小)。您可以直接輸入ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
儘管如此,只要您知道它們不與標準衝突,您就可以指定其他選項,例如
ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
為每個目標設定的參數如下。
VCD
pal: -f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324 -s 352x288 -r 25 -codec:v mpeg1video -g 15 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680 -ar 44100 -ac 2 -codec:a mp2 -b:a 224k ntsc: -f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324 -s 352x240 -r 30000/1001 -codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680 -ar 44100 -ac 2 -codec:a mp2 -b:a 224k film: -f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324 -s 352x240 -r 24000/1001 -codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680 -ar 44100 -ac 2 -codec:a mp2 -b:a 224k
SVCD
pal: -f svcd -packetsize 2324 -s 480x576 -pix_fmt yuv420p -r 25 -codec:v mpeg2video -g 15 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1 -ar 44100 -codec:a mp2 -b:a 224k ntsc: -f svcd -packetsize 2324 -s 480x480 -pix_fmt yuv420p -r 30000/1001 -codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1 -ar 44100 -codec:a mp2 -b:a 224k film: -f svcd -packetsize 2324 -s 480x480 -pix_fmt yuv420p -r 24000/1001 -codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1 -ar 44100 -codec:a mp2 -b:a 224k
DVD
pal: -f dvd -muxrate 10080k -packetsize 2048 -s 720x576 -pix_fmt yuv420p -r 25 -codec:v mpeg2video -g 15 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008 -ar 48000 -codec:a ac3 -b:a 448k ntsc: -f dvd -muxrate 10080k -packetsize 2048 -s 720x480 -pix_fmt yuv420p -r 30000/1001 -codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008 -ar 48000 -codec:a ac3 -b:a 448k film: -f dvd -muxrate 10080k -packetsize 2048 -s 720x480 -pix_fmt yuv420p -r 24000/1001 -codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008 -ar 48000 -codec:a ac3 -b:a 448k
DV
pal: -f dv -s 720x576 -pix_fmt yuv420p -r 25 -ar 48000 -ac 2 ntsc: -f dv -s 720x480 -pix_fmt yuv411p -r 30000/1001 -ar 48000 -ac 2 film: -f dv -s 720x480 -pix_fmt yuv411p -r 24000/1001 -ar 48000 -ac 2
dv50
目標與dv
目標相同,不同之處在於為所有三個標準設定的像素格式為yuv422p
。上面參數的任何使用者設定值都將覆寫目標預設值。在這種情況下,輸出可能不符合目標標準。
- -dn (輸入/輸出)
作為輸入選項,阻止檔案的所有資料串流被濾鏡處理或自動選擇或對應到任何輸出。請參閱
-discard
選項以單獨停用串流。作為輸出選項,停用資料錄製,即自動選擇或對應任何資料串流。如需完全手動控制,請參閱
-map
選項。- -dframes number (輸出)
設定要輸出的資料影格數。這是
-frames:d
的過時別名,您應該改用它。- -frames[:stream_specifier] framecount (輸出,每個串流)
在 framecount 個影格後停止寫入串流。
- -q[:stream_specifier] q (輸出,每個串流)
- -qscale[:stream_specifier] q (輸出,每個串流)
使用固定品質比例 (VBR)。q/qscale 的含義取決於編解碼器。如果在沒有 stream_specifier 的情況下使用 qscale,則它僅適用於視訊串流,這是為了保持與先前行為的相容性,並且通常不希望在未使用 stream_specifier 時將相同的編解碼器特定值指定給兩個不同的編解碼器(即音訊和視訊)。
- -filter[:stream_specifier] filtergraph (輸出,每個串流)
建立由 filtergraph 指定的濾鏡圖,並使用它來濾鏡處理串流。
filtergraph 是要應用於串流的濾鏡圖的描述,並且必須具有單個輸入和與串流類型相同的單個輸出。在濾鏡圖中,輸入與標籤
in
關聯,輸出與標籤out
關聯。有關濾鏡圖語法的更多資訊,請參閱 ffmpeg-filters 手冊。如果您想建立具有多個輸入和/或輸出的濾鏡圖,請參閱 -filter_complex 選項。
- -reinit_filter[:stream_specifier] integer (輸入,每個串流)
此布林選項確定當輸入影格參數在串流中間更改時,是否重新初始化饋送到此串流的濾鏡圖。預設情況下啟用此選項,因為大多數視訊和所有音訊濾鏡都無法處理輸入影格屬性的偏差。重新初始化後,現有的濾鏡狀態會遺失,例如某些濾鏡中可用的影格計數
n
參考。重新初始化時緩衝的任何影格都會遺失。觸發重新初始化的屬性包括:對於視訊,影格解析度或像素格式;對於音訊,取樣格式、取樣率、通道數或通道佈局。- -filter_threads nb_threads (全域)
定義用於處理濾鏡管道的執行緒數。每個管道將產生一個執行緒池,其中包含這麼多執行緒可用於平行處理。預設值是可用的 CPU 數量。
- -pre[:stream_specifier] preset_name (輸出,每個串流)
為匹配的串流指定預設。
- -stats (全域)
將編碼進度/統計資訊記錄為「info」級別日誌(請參閱
-loglevel
)。預設為開啟,要明確停用它,您需要指定-nostats
。- -stats_period time (全域)
設定更新編碼進度/統計資訊的週期。預設值為 0.5 秒。
- -progress url (全域)
將程式友善的進度資訊發送到 url。
進度資訊會定期寫入,並在編碼過程結束時寫入。它由 "key=value" 行組成。key 僅包含英數字元。進度資訊序列的最後一個鍵始終為 "progress",值為 "continue" 或 "end"。
更新週期使用
-stats_period
設定。例如,將進度資訊記錄到 stdout
ffmpeg -progress pipe:1 -i in.mkv out.mkv
- -stdin
啟用標準輸入上的互動。預設為開啟,除非標準輸入用作輸入。要明確停用互動,您需要指定
-nostdin
。停用標準輸入上的互動很有用,例如,如果 ffmpeg 位於背景進程群組中。大致相同的結果可以使用
ffmpeg ... < /dev/null
實現,但它需要 shell。- -debug_ts (全域)
列印時間戳記/延遲資訊。預設為關閉。此選項主要用於測試和偵錯目的,並且輸出格式可能會因版本而異,因此不應由可移植腳本使用。
另請參閱選項
-fdebug ts
。- -attach filename (輸出)
將附件新增到輸出檔案。某些格式(如 Matroska)支援此功能,例如用於呈現字幕的字型。附件實作為特定類型的串流,因此此選項將向檔案新增新串流。然後可以像往常一樣在此串流上使用每個串流的選項。使用此選項建立的附件串流將在所有其他串流(即使用
-map
或自動對應建立的串流)之後建立。請注意,對於 Matroska,您還必須設定 mimetype 中繼資料標籤
ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv
(假設附件串流將是輸出檔案中的第三個)。
- -dump_attachment[:stream_specifier] filename (輸入,每個串流)
將匹配的附件串流擷取到名為 filename 的檔案中。如果 filename 為空,則將使用
filename
中繼資料標籤的值。例如,要將第一個附件擷取到名為 'out.ttf' 的檔案中
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
要將所有附件擷取到由
filename
標籤確定的檔案中ffmpeg -dump_attachment:t "" -i INPUT
技術說明 – 附件實作為編解碼器 extradata,因此此選項實際上可用於從任何串流擷取 extradata,而不僅僅是附件。
5.5 視訊選項
- -vframes number (輸出)
設定要輸出的視訊影格數。這是
-frames:v
的過時別名,您應該改用它。- -r[:stream_specifier] fps (輸入/輸出,每個串流)
設定影格率(Hz 值、分數或縮寫)。
作為輸入選項,忽略檔案中儲存的任何時間戳記,而是產生假設恆定影格率 fps 的時間戳記。這與用於某些輸入格式(如 image2 或 v4l2)的 -framerate 選項不同(在較舊版本的 FFmpeg 中,它曾經是相同的)。如有疑問,請使用 -framerate 而不是輸入選項 -r。
作為輸出選項
- 視訊編碼
在編碼影格之前複製或丟棄影格,以實現恆定輸出影格率 fps。
- 視訊串流複製
向多工器指示 fps 是串流影格率。在這種情況下,不會丟棄或複製任何資料。如果 fps 與封包時間戳記確定的實際串流影格率不符,這可能會產生無效的檔案。另請參閱
setts
位元串流濾鏡。
- -fpsmax[:stream_specifier] fps (輸出,每個串流)
設定最大影格率(Hz 值、分數或縮寫)。
當輸出影格率自動設定並且高於此值時,會限制輸出影格率。在批次處理中或當輸入影格率被錯誤地偵測為非常高時很有用。它不能與
-r
一起設定。在串流複製期間會忽略它。- -s[:stream_specifier] size (輸入/輸出,每個串流)
設定影格大小。
作為輸入選項,這是 video_size 私有選項的快捷方式,某些解多工器可以識別該選項,因為影格大小既未儲存在檔案中,也未可配置 – 例如,原始視訊或視訊擷取器。
作為輸出選項,這會在對應濾鏡圖的結尾插入
scale
視訊濾鏡。請直接使用scale
濾鏡將其插入到開頭或其他位置。格式為 'wxh'(預設值 - 與來源相同)。
- -aspect[:stream_specifier] aspect (輸出,每個串流)
設定由 aspect 指定的視訊顯示縱橫比。
aspect 可以是浮點數字串,也可以是 num:den 形式的字串,其中 num 和 den 是縱橫比的分子和分母。例如,"4:3"、"16:9"、"1.3333" 和 "1.7777" 是有效的參數值。
如果與 -vcodec copy 一起使用,它將影響儲存在容器級別的縱橫比,但不會影響儲存在編碼影格中的縱橫比(如果存在)。
- -display_rotation[:stream_specifier] rotation (輸入,每個串流)
設定視訊旋轉中繼資料。
rotation 是一個小數,指定視訊在顯示之前應逆時針旋轉的度數。
此選項會覆寫檔案中儲存的旋轉/顯示轉換中繼資料(如果有的話)。當視訊正在轉碼(而不是複製)並且啟用
-autorotate
時,視訊將在濾鏡處理階段旋轉。否則,如果多工器支援,中繼資料將寫入輸出檔案。如果給出了
-display_hflip
和/或-display_vflip
選項,它們將在由此選項指定的旋轉之後應用。- -display_hflip[:stream_specifier] (輸入,每個串流)
設定在顯示時是否應水平翻轉影像。
有關更多詳細資訊,請參閱
-display_rotation
選項。- -display_vflip[:stream_specifier] (輸入,每個串流)
設定在顯示時是否應垂直翻轉影像。
有關更多詳細資訊,請參閱
-display_rotation
選項。- -vn (輸入/輸出)
作為輸入選項,阻止檔案的所有視訊串流被濾鏡處理或自動選擇或對應到任何輸出。請參閱
-discard
選項以單獨停用串流。作為輸出選項,停用視訊錄製,即自動選擇或對應任何視訊串流。如需完全手動控制,請參閱
-map
選項。- -vcodec codec (輸出)
設定視訊編解碼器。這是
-codec:v
的別名。- -pass[:stream_specifier] n (輸出,每個串流)
選擇通行證編號(1 或 2)。它用於執行兩次通行證視訊編碼。視訊的統計資訊在第一次通行證中記錄到日誌檔案中(另請參閱選項 -passlogfile),在第二次通行證中,使用該日誌檔案以精確請求的位元率產生視訊。在通行證 1 上,您可以停用音訊並將輸出設定為 null,Windows 和 Unix 的範例
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null
- -passlogfile[:stream_specifier] prefix (輸出,每個串流)
將兩次通行證日誌檔案名稱字首設定為 prefix,預設檔案名稱字首為 “ffmpeg2pass”。完整的檔案名稱將為 PREFIX-N.log,其中 N 是輸出串流特定的編號
- -vf filtergraph (輸出)
建立由 filtergraph 指定的濾鏡圖,並使用它來濾鏡處理串流。
這是
-filter:v
的別名,請參閱 -filter 選項。- -autorotate
根據檔案中繼資料自動旋轉視訊。預設啟用,使用 -noautorotate 停用它。
- -autoscale
根據第一影格的解析度自動縮放視訊。預設啟用,使用 -noautoscale 停用它。當停用自動縮放時,濾鏡圖的所有輸出影格可能不在相同的解析度中,並且可能不適合某些編碼器/多工器。因此,除非您真的知道自己在做什麼,否則不建議停用它。停用自動縮放的風險由您自行承擔。
5.6 進階視訊選項
- -pix_fmt[:stream_specifier] format (輸入/輸出,每個串流)
設定像素格式。使用
-pix_fmts
顯示所有支援的像素格式。如果無法選擇選定的像素格式,ffmpeg 將列印警告並選擇編碼器支援的最佳像素格式。如果 pix_fmt 以+
作為字首,則如果無法選擇請求的像素格式,ffmpeg 將以錯誤退出,並且濾鏡圖內的自動轉換將停用。如果 pix_fmt 是單個+
,ffmpeg 將選擇與輸入(或圖輸出)相同的像素格式,並且自動轉換將停用。- -sws_flags flags (輸入/輸出)
設定 libswscale 程式庫的預設旗標。這些旗標由自動插入的
scale
濾鏡和簡單濾鏡圖中的濾鏡使用,如果在濾鏡圖定義中未覆寫。有關縮放器選項的列表,請參閱 ffmpeg-scaler 手冊。
- -rc_override[:stream_specifier] override (輸出,每個串流)
特定間隔的速率控制覆寫,格式為以斜線分隔的 "int,int,int" 列表。前兩個值是開始和結束影格編號,最後一個值是要使用的量化器(如果為正數)或品質因數(如果為負數)。
- -vstats
將視訊編碼統計資訊轉儲到 vstats_HHMMSS.log。有關格式描述,請參閱 vstats 檔案格式 章節。
- -vstats_file file
將視訊編碼統計資訊轉儲到 file。有關格式描述,請參閱 vstats 檔案格式 章節。
- -vstats_version file
指定要使用的 vstats 格式版本。預設值為
2
。有關格式描述,請參閱 vstats 檔案格式 章節。- -vtag fourcc/tag (輸出)
強制視訊標籤/fourcc。這是
-tag:v
的別名。- -force_key_frames[:stream_specifier] time[,time...] (輸出,每個串流)
- -force_key_frames[:stream_specifier] expr:expr (輸出,每個串流)
- -force_key_frames[:stream_specifier] source (輸出,每個串流)
-
force_key_frames 可以採用以下形式的參數
- time[,time...]
如果參數由時間戳記組成,ffmpeg 將根據編碼器時間基底將指定的時間四捨五入到最接近的輸出時間戳記,並在第一個時間戳記等於或大於計算時間戳記的影格處強制關鍵影格。請注意,如果編碼器時間基底太粗糙,則關鍵影格可能會在時間戳記低於指定時間的影格上強制執行。預設編碼器時間基底是輸出影格率的倒數,但可以透過
-enc_time_base
設定為其他值。如果其中一個時間是 "
chapters
[delta]",則會將其展開為檔案中所有章節的開始時間,並按 delta 位移,以秒為單位表示時間。此選項可用於確保在章節標記或輸出檔案中的任何其他指定位置存在搜尋點。例如,要在 5 分鐘處插入關鍵影格,以及在每個章節開始前 0.1 秒插入關鍵影格
-force_key_frames 0:05:00,chapters-0.1
- expr:expr
如果參數以
expr:
作為字首,則字串 expr 將被解釋為運算式,並針對每個影格進行評估。如果評估為非零,則強制執行關鍵影格。expr 中的運算式可以包含以下常數
- n
目前處理的影格編號,從 0 開始
- n_forced
強制影格的編號
- prev_forced_n
上一個強制影格的編號,當尚未強制執行關鍵影格時,它為
NAN
- prev_forced_t
上一個強制影格的時間,當尚未強制執行關鍵影格時,它為
NAN
- t
目前處理的影格的時間
例如,要每 5 秒強制執行一個關鍵影格,您可以指定
-force_key_frames expr:gte(t,n_forced*5)
要從第 13 秒開始,在上次強制影格的時間後 5 秒強制執行一個關鍵影格
-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
- source
如果參數為
source
,ffmpeg 將在當前編碼的影格在其來源中標記為關鍵影格時強制執行關鍵影格。如果必須丟棄此特定來源影格,請強制下一個可用的影格成為關鍵影格。
請注意,強制執行過多的關鍵影格對某些編碼器的前瞻演算法非常有害:使用固定 GOP 選項或類似選項會更有效率。
- -apply_cropping[:stream_specifier] source (輸入,每個串流)
根據檔案中繼資料在解碼後自動裁剪視訊。預設值為 all。
- none (0)
不應用任何裁剪中繼資料。
- all (1)
同時應用編解碼器和容器級別裁剪。這是預設模式。
- codec (2)
應用編解碼器級別裁剪。
- container (3)
應用容器級別裁剪。
- -copyinkf[:stream_specifier] (輸出,每個串流)
執行串流複製時,也複製在開頭找到的非關鍵影格。
- -init_hw_device type[=name][:device[,key=value...]]
使用給定的裝置參數初始化名為 name 的 type 類型的新硬體裝置。如果未指定名稱,它將接收 "type%d" 形式的預設名稱。
device 和後續參數的含義取決於裝置類型
- cuda
device 是 CUDA 裝置的編號。
以下選項被識別
- primary_ctx
如果設定為 1,則使用主要裝置上下文而不是建立新的裝置上下文。
範例
- -init_hw_device cuda:1
選擇系統上的第二個裝置。
- -init_hw_device cuda:0,primary_ctx=1
選擇第一個裝置並使用主要裝置上下文。
- dxva2
device 是 Direct3D 9 顯示配接器的編號。
- d3d11va
device 是 Direct3D 11 顯示配接器的編號。如果未指定,它將嘗試使用預設的 Direct3D 11 顯示配接器或硬體 VendorId 由 'vendor_id' 指定的第一個 Direct3D 11 顯示配接器。
範例
- -init_hw_device d3d11va
在預設的 Direct3D 11 顯示配接器上建立 d3d11va 裝置。
- -init_hw_device d3d11va:1
在索引為 1 的 Direct3D 11 顯示配接器上建立 d3d11va 裝置。
- -init_hw_device d3d11va:,vendor_id=0x8086
在硬體 VendorId 為 0x8086 的第一個 Direct3D 11 顯示配接器上建立 d3d11va 裝置。
- vaapi
device 是 X11 顯示名稱、DRM 渲染節點或 DirectX 配接器索引。如果未指定,它將嘗試開啟預設 X11 顯示器 ($DISPLAY),然後開啟第一個 DRM 渲染節點 (/dev/dri/renderD128),或 Windows 上的預設 DirectX 配接器。
以下選項被識別
- kernel_driver
當未指定 device 時,使用此選項指定與所需裝置關聯的內核驅動程式的名稱。僅當硬體加速方法 drm 和 vaapi 啟用時,此選項才可用。
- vendor_id
當未指定 device 和 kernel_driver 時,使用此選項指定與所需裝置關聯的供應商 ID。僅當硬體加速方法 drm 和 vaapi 啟用且未指定 kernel_driver 時,此選項才可用。
範例
- -init_hw_device vaapi
在預設裝置上建立 vaapi 裝置。
- -init_hw_device vaapi:/dev/dri/renderD129
在 DRM 渲染節點 /dev/dri/renderD129 上建立 vaapi 裝置。
- -init_hw_device vaapi:1
在 DirectX 配接器 1 上建立 vaapi 裝置。
- -init_hw_device vaapi:,kernel_driver=i915
在與內核驅動程式 'i915' 關聯的裝置上建立 vaapi 裝置。
- -init_hw_device vaapi:,vendor_id=0x8086
在與供應商 ID '0x8086' 關聯的裝置上建立 vaapi 裝置。
- vdpau
device 是 X11 顯示名稱。如果未指定,它將嘗試開啟預設 X11 顯示器 ($DISPLAY)。
- qsv
device 在 'MFX_IMPL_*' 中選擇一個值。允許的值為
- auto
- sw
- hw
- auto_any
- hw_any
- hw2
- hw3
- hw4
如果未指定,則使用 'auto_any'。(請注意,對於 QSV,可能更容易透過建立平台適當的子裝置('dxva2' 或 'd3d11va' 或 'vaapi'),然後從該子裝置衍生 QSV 裝置來達到所需的結果。)
以下選項被識別
- child_device
在 Linux 上指定 DRM 渲染節點,或在 Windows 上指定 DirectX 配接器。
- child_device_type
選擇平台適當的子裝置類型。在 Windows 上,當在配置時指定
--enable-libvpl
時,'d3d11va' 用作預設子裝置類型,當在配置時指定--enable-libmfx
時,'dxva2' 用作預設子裝置類型。在 Linux 上,使用者只能使用 'vaapi' 作為子裝置類型。
範例
- -init_hw_device qsv:hw,child_device=/dev/dri/renderD129
在 DRM 渲染節點 /dev/dri/renderD129 上建立具有 'MFX_IMPL_HARDWARE' 的 QSV 裝置。
- -init_hw_device qsv:hw,child_device=1
在 DirectX 配接器 1 上建立具有 'MFX_IMPL_HARDWARE' 的 QSV 裝置。
- -init_hw_device qsv:hw,child_device_type=d3d11va
選擇類型為 'd3d11va' 的 GPU 子裝置,並建立具有 'MFX_IMPL_HARDWARE' 的 QSV 裝置。
- -init_hw_device qsv:hw,child_device_type=dxva2
選擇類型為 'dxva2' 的 GPU 子裝置,並建立具有 'MFX_IMPL_HARDWARE' 的 QSV 裝置。
- -init_hw_device qsv:hw,child_device=1,child_device_type=d3d11va
在 DirectX 配接器 1 上建立具有 'MFX_IMPL_HARDWARE' 和子裝置類型 'd3d11va' 的 QSV 裝置。
- -init_hw_device vaapi=va:/dev/dri/renderD129 -init_hw_device qsv=hw1@va
在 /dev/dri/renderD129 上建立名為 'va' 的 VAAPI 裝置,然後從裝置 'va' 衍生名為 'hw1' 的 QSV 裝置。
- opencl
device 以 platform_index.device_index 形式選擇平台和裝置。
也可以使用鍵值對過濾裝置集,以僅尋找與特定平台或裝置字串匹配的裝置。
可用作濾鏡的字串為
- platform_profile
- platform_version
- platform_name
- platform_vendor
- platform_extensions
- device_name
- device_vendor
- driver_version
- device_version
- device_profile
- device_extensions
- device_type
索引和濾鏡必須一起唯一地選擇裝置。
範例
- -init_hw_device opencl:0.1
選擇第一個平台上的第二個裝置。
- -init_hw_device opencl:,device_name=Foo9000
選擇名稱包含字串 Foo9000 的裝置。
- -init_hw_device opencl:1,device_type=gpu,device_extensions=cl_khr_fp16
選擇第二個平台上支援 cl_khr_fp16 擴充功能的 GPU 裝置。
- vulkan
如果 device 是整數,則它會依系統相關的裝置列表中的索引選擇裝置。如果 device 是任何其他字串,它會選擇名稱包含該字串作為子字串的第一個裝置。
以下選項被識別
- debug
如果設定為 1,則啟用驗證層(如果已安裝)。
- linear_images
如果設定為 1,則 hwcontext 配置的影像將是線性且本機可對應的。
- instance_extensions
要啟用的其他執行個體擴充功能的加號分隔列表。
- device_extensions
device_extensions
範例
- 要啟用的其他裝置擴充功能的加號分隔列表。
選擇系統上的第二個裝置。
- -init_hw_device vulkan:1
-init_hw_device vulkan:RADV
- 選擇名稱包含字串 RADV 的第一個裝置。
-init_hw_device vulkan:0,instance_extensions=VK_KHR_wayland_surface+VK_KHR_xcb_surface
- 選擇第一個裝置並啟用 Wayland 和 XCB 執行個體擴充功能。
-init_hw_device type[=name]@source
- 初始化名為 name 的 type 類型的新硬體裝置,並從名稱為 source 的現有裝置衍生它。
-init_hw_device list
- 列出此 ffmpeg 建置中支援的所有硬體裝置類型。
-filter_hw_device name
將名為 name 的硬體裝置傳遞給任何濾鏡圖中的所有濾鏡。這可用於設定要使用
hwupload
濾鏡上傳到的裝置,或使用hwmap
濾鏡對應到的裝置。當其他濾鏡需要硬體裝置時,它們也可以使用此參數。請注意,這通常僅在輸入尚未處於硬體影格中時才需要 - 當輸入已在硬體影格中時,濾鏡將從它們接收作為輸入的影格的上下文中衍生它們所需的裝置。- 這是一個全域設定,因此所有濾鏡都將接收相同的裝置。
-hwaccel[:stream_specifier] hwaccel (輸入,每個串流)
- 使用硬體加速來解碼匹配的串流。允許的 hwaccel 值為
none
- auto
不使用任何硬體加速(預設值)。
- vdpau
auto
- dxva2
自動選擇硬體加速方法。
- d3d11va
vdpau
- vaapi
使用 VDPAU(適用於 Unix 的視訊解碼和呈現 API)硬體加速。
- qsv
dxva2
使用 DXVA2(DirectX 視訊加速)硬體加速。
d3d11va
使用 D3D11VA(DirectX 視訊加速)硬體加速。
vaapi
- 使用 VAAPI(視訊加速 API)硬體加速。
qsv
使用 Intel QuickSync 視訊加速進行視訊轉碼。
- 與大多數其他值不同,此選項不啟用加速解碼(在選擇 qsv 解碼器時會自動使用),而是加速轉碼,而無需將影格複製到系統記憶體中。
為了使其工作,解碼器和編碼器都必須支援 QSV 加速,並且不得使用濾鏡。
- 如果選定的 hwaccel 不可用或不受選擇的解碼器支援,則此選項無效。
請注意,大多數加速方法都用於播放,並且在現代 CPU 上不會比軟體解碼更快。此外,
ffmpeg
通常需要將解碼後的影格從 GPU 記憶體複製到系統記憶體中,從而導致進一步的效能損失。因此,此選項主要用於測試。-hwaccel_device[:stream_specifier] hwaccel_device (輸入,每個串流)
選擇用於硬體加速的裝置。
5.7 音訊選項
- 僅當也指定了 -hwaccel 選項時,此選項才有意義。它可以按名稱引用使用 -init_hw_device 建立的現有裝置,也可以建立新裝置,就像在之前立即呼叫 '-init_hw_device' type:hwaccel_device 一樣。
-hwaccels
- 列出此 ffmpeg 建置中啟用的所有硬體加速組件。實際執行時間可用性取決於硬體及其安裝的適用驅動程式。
-fix_sub_duration_heartbeat[:stream_specifier]
- 設定特定的輸出視訊串流作為心跳串流,根據該串流分割和推送當前正在進行中的字幕,在收到隨機存取封包時。
這降低了字幕的延遲,對於這些字幕,尚未收到結束封包或後續字幕。作為缺點,這很可能會導致字幕事件重複,以便涵蓋整個持續時間,因此在處理字幕事件傳遞到輸出時延遲不相關的用例時,不應使用此選項。
- 需要為相關的輸入字幕串流設定 -fix_sub_duration,以便使其生效,並且輸入字幕串流必須直接對應到心跳串流所在的同一個輸出中。
-aframes number (輸出)
- 設定要輸出的音訊影格數。這是
-frames:a
的過時別名,您應該改用它。 -ar[:stream_specifier] freq (輸入/輸出,每個串流)
設定音訊取樣頻率。對於輸出串流,預設情況下設定為對應輸入串流的頻率。對於輸入串流,此選項僅對音訊擷取裝置和原始解多工器有意義,並且對應到對應的解多工器選項。
- -aq q (輸出)
設定音訊品質(編解碼器特定,VBR)。這是 -q:a 的別名。
- -ac[:stream_specifier] channels (輸入/輸出,每個串流)
設定音訊通道數。對於輸出串流,預設情況下設定為輸入音訊通道數。對於輸入串流,此選項僅對音訊擷取裝置和原始解多工器有意義,並且對應到對應的解多工器選項。
- -an (輸入/輸出)
建立由 filtergraph 指定的濾鏡圖,並使用它來濾鏡處理串流。
作為輸入選項,阻止檔案的所有音訊串流被濾鏡處理或自動選擇或對應到任何輸出。請參閱
-discard
選項以單獨停用串流。
5.8 進階音訊選項
- 作為輸出選項,停用音訊錄製,即自動選擇或對應任何音訊串流。如需完全手動控制,請參閱
-map
選項。 -acodec codec (輸入/輸出)
- 設定音訊編解碼器。這是
-codec:a
的別名。 -sample_fmt[:stream_specifier] sample_fmt (輸出,每個串流)
- 設定音訊取樣格式。使用
-sample_fmts
取得支援的取樣格式列表。 -af filtergraph (輸出)
- 這是
-filter:a
的別名,請參閱 -filter 選項。 -atag fourcc/tag (輸出)
5.9 字幕選項
- 強制音訊標籤/fourcc。這是
-tag:a
的別名。 -ch_layout[:stream_specifier] layout (輸入/輸出,每個串流)
-channel_layout
的別名。-channel_layout[:stream_specifier] layout (輸入/輸出,每個串流)
設定音訊通道佈局。對於輸出串流,預設情況下設定為輸入通道佈局。對於輸入串流,它會覆寫輸入的通道佈局。並非所有解碼器都遵循覆寫的通道佈局。此選項還為音訊擷取裝置和原始解多工器設定通道佈局,並對應到對應的解多工器選項。
5.10 進階字幕選項
- -guess_layout_max channels (輸入,每個串流)
如果某些輸入通道佈局未知,則僅在它對應於最多指定數量的通道時才嘗試猜測。例如,2 告訴
ffmpeg
將 1 個通道識別為單聲道,將 2 個通道識別為立體聲,但不將 6 個通道識別為 5.1。預設值是始終嘗試猜測。使用 0 停用所有猜測。使用-channel_layout
選項明確指定輸入佈局也會停用猜測。-scodec codec (輸入/輸出)
- 設定字幕編解碼器。這是
-codec:s
的別名。 -sn (輸入/輸出)
5.11 進階選項
- 作為輸入選項,阻止檔案的所有字幕串流被濾鏡處理或自動選擇或對應到任何輸出。請參閱
-discard
選項以單獨停用串流。 -
作為輸出選項,停用字幕錄製,即自動選擇或對應任何字幕串流。如需完全手動控制,請參閱
-map
選項。-fix_sub_duration
修正字幕持續時間。對於每個字幕,等待同一個串流中的下一個封包,並調整第一個字幕的持續時間以避免重疊。對於某些字幕編解碼器(尤其是 DVB 字幕)來說,這是必要的,因為原始封包中的持續時間僅是一個粗略的估計,而結尾實際上由一個空的字幕影格標記。如果必要時未能使用此選項,可能會導致持續時間過長或由於非單調時間戳記而導致多工處理失敗。
請注意,此選項將延遲所有資料的輸出,直到下一個字幕封包被解碼:它可能會大大增加記憶體消耗和延遲。
- -canvas_size size
設定用於呈現字幕的畫布大小。
- -map [-]input_file_id[:stream_specifier][:view_specifier][:?] | [linklabel] (輸出)
在輸出檔案中建立一個或多個串流。此選項有兩種形式用於指定資料來源:第一種形式從某些輸入檔案(使用
-i
指定)中選擇一個或多個串流,第二種形式從某些複雜濾鏡圖(使用-filter_complex
指定)中取得輸出。- 在第一種形式中,為來自索引為 input_file_id 的輸入檔案的每個串流建立一個輸出串流。如果給定 stream_specifier,則僅使用那些與指定器匹配的串流(有關 stream_specifier 語法,請參閱「串流指定器」章節)。
串流識別碼之前的
-
字元會建立「負」對應。它會停用來自已建立對應的匹配串流。
可以在串流指定器之後給出可選的 view_specifier,對於多視圖視訊,它指定要使用的視圖。視圖指定器可以具有以下格式之一
view:view_id
依 ID 選擇視圖;view_id 可以設定為 'all' 以使用交錯到一個串流中的所有視圖;
vidx:view_idx
依索引選擇視圖;即 0 是基礎視圖,1 是第一個非基礎視圖,依此類推。
範例
- vpos:position
依顯示位置選擇視圖;position 可以是
left
或right
ffmpeg -i INPUT -map 0 output
- 轉碼的預設值是僅使用基礎視圖,即相當於
vidx:0
。對於串流複製,不支援視圖指定器,並且始終複製所有視圖。 串流索引後的尾隨
?
將允許 map 是可選的:如果 map 不匹配任何串流,則將忽略 map 而不是失敗。請注意,如果使用無效的輸入檔案索引,map 仍然會失敗;例如,如果 map 引用了不存在的輸入。ffmpeg -i INPUT -map 0:1 out.wav
替代的 [linklabel] 形式會將來自複雜濾鏡圖(請參閱 -filter_complex 選項)的輸出對應到輸出檔案。linklabel 必須對應於圖中定義的輸出連結標籤。
- 可以多次指定此選項,每次都會向輸出檔案新增更多串流。任何給定的輸入串流也可以對應任意次數,作為不同輸出串流的來源,例如,為了使用不同的編碼選項和/或濾鏡。串流在輸出中建立的順序與
-map
選項在命令列上給出的順序相同。 使用此選項會停用此輸出檔案的預設對應。
ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
- 對應所有內容
要將第一個輸入檔案中的所有串流對應到輸出
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
- 選擇特定串流
如果第一個輸入檔案中有兩個音訊串流,則這些串流由 0:0 和 0:1 識別。您可以使用
-map
來選擇要放置在輸出檔案中的串流。例如ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
- 將 INPUT 中的第二個輸入串流對應到 out.wav 中的(單個)輸出串流。
建立多個串流
ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT
- 要從輸入檔案 a.mov(由識別碼 0:2 指定)中選擇索引為 2 的串流,並從輸入 b.mov(由識別碼 1:6 指定)中選擇索引為 6 的串流,並將它們複製到輸出檔案 out.mov
建立多個串流 2
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
- 要從輸入檔案中選擇所有視訊和第三個音訊串流
負對應
- 要對應除第二個音訊之外的所有串流,請使用負對應
可選對應
- 要對應來自第一個輸入的視訊和音訊串流,並使用尾隨
?
,如果第一個輸入中不存在音訊串流,則忽略音訊對應 依語言對應
- 要選取英文音訊串流
-ignore_unknown
- 如果嘗試複製類型未知的輸入串流,則忽略這些串流,而不是失敗。
-copy_unknown
- 允許複製類型未知的輸入串流,而不是在嘗試複製這些串流時失敗。
-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (輸出,每個中繼資料)
- 從 infile 設定下一個輸出檔案的中繼資料資訊。請注意,這些是檔案索引(從零開始),而不是檔案名稱。可選的 metadata_spec_in/out 參數指定要複製的中繼資料。中繼資料指定器可以具有以下形式
g
全域中繼資料,即適用於整個檔案的中繼資料
s[:stream_spec]
每個串流的中繼資料。stream_spec 是「串流指定器」章節中描述的串流指定器。在輸入中繼資料指定器中,從第一個匹配的串流複製。在輸出中繼資料指定器中,複製到所有匹配的串流。
ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3
c:chapter_index
ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv
每個章節的中繼資料。chapter_index 是從零開始的章節索引。
- p:program_index
每個程式的中繼資料。program_index 是從零開始的程式索引。
- 如果省略中繼資料指定器,則預設為全域。
預設情況下,全域中繼資料從第一個輸入檔案複製,每個串流和每個章節的中繼資料隨串流/章節一起複製。透過建立任何相關類型的對應來停用這些預設對應。可以使用負檔案索引來建立僅停用自動複製的虛擬對應。
- 例如,要將輸入檔案的第一個串流的中繼資料複製到輸出檔案的全域中繼資料
要執行相反的操作,即將全域中繼資料複製到所有音訊串流
- 請注意,在此範例中,簡單的
0
也會起作用,因為預設情況下會假定全域中繼資料。 -map_chapters input_file_index (輸出)
- 將章節從索引為 input_file_index 的輸入檔案複製到下一個輸出檔案。如果未指定章節對應,則從至少有一個章節的第一個輸入檔案複製章節。使用負檔案索引停用任何章節複製。
-benchmark (全域)
- 在編碼結束時顯示基準測試資訊。顯示已使用的實際時間、系統時間和使用者時間以及最大記憶體消耗量。並非所有系統都支援最大記憶體消耗量,如果不支持,通常會顯示為 0。
-benchmark_all (全域)
- 在編碼期間顯示基準測試資訊。顯示在各個步驟(音訊/視訊編碼/解碼)中使用的實際時間、系統時間和使用者時間。
-timelimit duration (全域)
在 ffmpeg 在 CPU 使用者時間中執行 duration 秒後退出。
-dump (全域)
將每個輸入封包轉儲到 stderr。
- -hex (全域)
轉儲封包時,也轉儲有效負載。
- -readrate speed (輸入)
限制輸入讀取速度。
- 其值是一個浮點正數,表示在一個掛鐘時間秒內應擷取的最大媒體持續時間(以秒為單位)。預設值為零,表示對擷取速度沒有強制限制。值
1
表示即時速度,相當於-re
。 - 主要用於模擬擷取裝置或即時輸入串流(例如,從檔案讀取時)。當輸入是實際的擷取裝置或即時串流時,不應使用低值,因為這可能會導致封包遺失。
當輸出封包的流速很重要時(例如即時串流),它很有用。
-re (輸入)
- 以原生影格率讀取輸入。這相當於設定
-readrate 1
。 -readrate_initial_burst seconds
- 設定初始讀取爆發時間(以秒為單位),之後將強制執行 -re/-readrate。
-vsync parameter (全域)
- -fps_mode[:stream_specifier] parameter (輸出,每個串流)
設定視訊同步方法/影格率模式。vsync 應用於所有輸出視訊串流,但可以透過設定 fps_mode 來覆寫串流的 vsync。vsync 已被取代,將在未來版本中移除。
- 出於相容性原因,vsync 的某些值可以指定為數字(在下表中顯示)。
passthrough (0)
每個影格都以其時間戳記從解多工器傳遞到多工器。
cfr (1)
- 以原生影格率讀取輸入。這相當於設定
- 將複製和丟棄影格以精確實現請求的恆定影格率。
vfr (2)
- 影格以其時間戳記傳遞或丟棄,以防止 2 個影格具有相同時間戳記。
auto (-1)
- 根據多工器功能在 cfr 和 vfr 之間選擇。這是預設方法。
請注意,時間戳記可能會在此之後由多工器進一步修改。例如,在格式選項 avoid_negative_ts 啟用的情況下。
使用 -map,您可以選擇從哪個串流取得時間戳記。您可以將視訊或音訊保持不變,並將其餘串流與不變的串流同步。
- -frame_drop_threshold parameter
影格丟棄閾值,指定視訊影格在被丟棄之前可以落後多少。以影格率單位表示,因此 1.0 為一個影格。預設值為 -1.1。一個可能的用例是在時間戳記嘈雜的情況下避免影格丟棄,或在時間戳記精確的情況下提高影格丟棄精度。
-apad parameters (輸出,每個串流)
- 填充輸出音訊串流。這與應用
-af apad
相同。參數是濾鏡參數的字串,其組成方式與apad
濾鏡相同。必須為此輸出設定-shortest
,選項才能生效。 -copyts
- 1
不要處理輸入時間戳記,而是保留它們的值而不嘗試清理它們。特別是,不要移除初始開始時間偏移值。
請注意,根據 vsync 選項或特定的多工器處理(例如,在格式選項 avoid_negative_ts 啟用的情況下),即使選擇了此選項,輸出時間戳記也可能與輸入時間戳記不符。
- 0
-start_at_zero
與 copyts 一起使用時,平移輸入時間戳記,使其從零開始。
- -1
這表示使用例如
-ss 50
將使輸出時間戳記從 50 秒開始,而與輸入檔案的開始時間戳記無關。
-copytb mode
- 指定在串流複製時如何設定編碼器時間基底。mode 是一個整數數值,可以採用以下值之一
Use the demuxer timebase.
- 0
使用解多工器時間基底。
時間基底從對應的輸入解多工器複製到輸出編碼器。有時需要這樣做,以避免在複製影格率可變的視訊串流時,時間戳記非單調遞增。
- Use the decoder timebase.
使用解碼器時間基底。
- 時間基底從對應的輸入解碼器複製到輸出編碼器。
Try to make the choice automatically, in order to generate a sane output.
- 嘗試自動進行選擇,以便產生合理的輸出。
預設值為 -1。
-enc_time_base[:stream_specifier] timebase (輸出,每個串流)
設定編碼器時間基底。timebase 可以採用以下值之一
- Assign a default value according to the media type.
根據媒體類型分配預設值。
- For video - use 1/framerate, for audio - use 1/samplerate.
對於視訊 - 使用 1/影格率,對於音訊 - 使用 1/取樣率。
demux
- 使用來自解多工器的時間基底。
filter
使用來自濾鏡圖的時間基底。
a positive number
- 正數
使用提供的數字作為時間基底。
此欄位可以作為兩個整數的比率(例如 1:24、1:48000)或作為小數(例如 0.04166、2.0833e-5)提供
預設值為 0。
-bitexact (輸入/輸出)
- 為(解)多工器和(解/編)碼器啟用位元精確模式
-shortest (輸出)
當最短的輸出串流結束時完成編碼。
請注意,此選項可能需要緩衝影格,這會引入額外的延遲。可以使用
-shortest_buf_duration
選項控制此延遲的最大量。-shortest_buf_duration duration (輸出)
- 當至少一個串流是「稀疏的」(即在影格之間有很大的間隙 - 字幕通常是這種情況)時,
-shortest
選項可能需要緩衝可能大量的資料。 此選項控制緩衝影格的最大持續時間(以秒為單位)。較大的值可能允許
-shortest
選項產生更準確的結果,但會增加記憶體使用量和延遲。- 預設值為 10 秒。
-dts_delta_threshold threshold
- 時間戳記不連續增量閾值,以秒為單位的小數表示。
由此選項啟用的時間戳記不連續性校正僅適用於接受時間戳記不連續性的輸入格式(為其啟用
AVFMT_TS_DISCONT
旗標),例如 MPEG-TS 和 HLS,並且在使用-copyts
選項時會自動停用(除非偵測到包裝)。如果偵測到時間戳記不連續性,其絕對值大於 threshold,ffmpeg 將透過按對應的增量值減小/增加目前的 DTS 和 PTS 來移除不連續性。
ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
- 預設值為 10。
-dts_error_threshold threshold
時間戳記錯誤增量閾值,以秒為單位的小數表示。
filter[=optname0=optval0:optname1=optval1:...]
由此選項啟用的時間戳記校正僅適用於不接受時間戳記不連續性的輸入格式(為其未啟用
AVFMT_TS_DISCONT
旗標)。如果偵測到時間戳記不連續性,其絕對值大於 threshold,ffmpeg 將丟棄 PTS/DTS 時間戳記值。
預設值為
3600*30
(30 小時),這是任意選擇的,相當保守。ffmpeg -bsf:v h264_mp4toannexb -i h264.mp4 -c:v copy -an out.h264
-muxdelay seconds (輸出)
設定最大解多工-解碼延遲。
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
-muxpreload seconds (輸出)
- 設定初始解多工-解碼延遲。
-streamid output-stream-index:new-value (輸出)
- 為輸出串流分配新的串流 ID 值。應在應用於它的輸出檔案名稱之前指定此選項。對於存在多個輸出檔案的情況,可以將串流 ID 重新分配給不同的值。
例如,要為輸出 mpegts 檔案將串流 0 PID 設定為 33,將串流 1 PID 設定為 36
ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
- -bsf[:stream_specifier] bitstream_filters (輸入/輸出,每個串流)
將位元串流濾鏡應用於匹配的串流。濾鏡在從解多工器接收到每個封包時應用(當用作輸入選項時),或在將其發送到多工器之前應用(當用作輸出選項時)。
bitstream_filters 是以逗號分隔的位元串流濾鏡規格列表,每個規格的形式為
- 任何要成為選項值一部分的 ',=: ' 字元都需要使用反斜線逸出。
- 使用
-bsfs
選項取得位元串流濾鏡的列表。 - 例如
ffmpeg -i input.mkv \ -filter_complex '[0:v]scale=size=hd1080,split=outputs=2[for_enc][orig_scaled]' \ -c:v libx264 -map '[for_enc]' output.mkv \ -dec 0:0 \ -filter_complex '[dec:0][orig_scaled]hstack[stacked]' \ -map '[stacked]' -c:v ffv1 comparison.mkv
讀取輸入視訊,並
- 將
h264_mp4toannexb
位元串流濾鏡(將 MP4 封裝的 H.264 串流轉換為 Annex B)應用於輸入視訊串流。 - 另一方面,
- 將
mov2textsub
位元串流濾鏡(從 MOV 字幕中擷取文字)應用於輸出字幕串流。但是,請注意,由於兩個範例都使用-c copy
,因此濾鏡是在輸入還是輸出上應用都無關緊要 - 如果發生轉碼,情況會有所不同。 - -tag[:stream_specifier] codec_tag (輸入/輸出,每個串流)
- 為匹配的串流強制執行標籤/fourcc。
-timecode hh:mm:ssSEPff
- 將
指定要寫入的時間碼。SEP 對於非丟幀時間碼為 ':',對於丟幀時間碼為 ';'(或 '.')。
-filter_complex filtergraph (全域)
定義複雜濾鏡圖,即具有任意數量的輸入和/或輸出的濾鏡圖。對於簡單圖 - 那些具有相同類型的一個輸入和一個輸出的圖 - 請參閱 -filter 選項。filtergraph 是濾鏡圖的描述,如 ffmpeg-filters 手冊的「濾鏡圖語法」章節中所述。可以多次指定此選項 - 每次使用都會建立新的複雜濾鏡圖。
複雜濾鏡圖的輸入可能來自不同的來源類型,並透過對應連結標籤的格式來區分
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' out.mkv
要連接輸入串流,請使用
[file_index:stream_specifier]
(即與 -map 相同的語法)。如果 stream_specifier 匹配多個串流,則將使用第一個串流。對於多視圖視訊,串流指定器後面可以跟視圖指定器,有關其語法,請參閱 -map 選項的文件。要連接回環解碼器,請使用 [dec:dec_idx],其中 dec_idx 是要連接到給定輸入的回環解碼器的索引。對於多視圖視訊,解碼器索引後面可以跟視圖指定器,有關其語法,請參閱 -map 選項的文件。
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map '[out]' out.mkv
要連接來自另一個複雜濾鏡圖的輸出,請使用其連結標籤。例如,以下範例
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv
(第 2 行)使用具有一個輸入和兩個輸出的複雜濾鏡圖,將視訊縮放為 1920x1080,並將結果複製到兩個輸出;
(第 3 行)使用
libx264
編碼一個縮放後的輸出,並將結果寫入 output.mkv;ffmpeg -i input.ts -filter_complex \ '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \ -sn -map '#0x2dc' output.mkv
(第 4 行)使用回環解碼器解碼此編碼串流;
(第 5 行)將回環解碼器的輸出(即
libx264
編碼的視訊)與縮放後的原始輸入並排放置;ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
- (第 6 行)然後將組合後的視訊以無損方式編碼並寫入 comparison.mkv。
請注意,兩個濾鏡圖不能組合為一個,因為這樣轉碼管道中就會有一個循環(濾鏡圖輸出轉到編碼,從那裡轉到解碼,然後返回到同一個圖),並且不允許這種循環。
- 未標記的輸入將連接到第一個未使用的匹配類型輸入串流。
輸出連結標籤使用 -map 引用。未標記的輸出會新增到第一個輸出檔案。
- 請注意,使用此選項,可以僅使用 lavfi 來源,而無需常規輸入檔案。
例如,要將影像覆蓋在視訊上
- 此處
[0:v]
指的是第一個輸入檔案中的第一個視訊串流,該串流連結到覆蓋濾鏡的第一個(主要)輸入。類似地,第二個輸入中的第一個視訊串流連結到覆蓋的第二個(覆蓋)輸入。 假設每個輸入檔案中只有一個視訊串流,我們可以省略輸入標籤,因此上面的內容等效於
- 此外,我們可以省略輸出標籤,濾鏡圖的單個輸出將自動新增到輸出檔案,因此我們可以簡單地寫入
作為一個特殊的例外,您可以使用點陣圖字幕串流作為輸入:它將轉換為與檔案中最大的視訊大小相同的視訊,如果沒有視訊,則轉換為 720x576。請注意,這是一個實驗性和臨時解決方案。一旦 libavfilter 正確支援字幕,它將被移除。
例如,要在 MPEG-TS 格式儲存的 DVB-T 錄製內容之上硬編碼字幕,將字幕延遲 1 秒
- (0x2d0、0x2dc 和 0x2ef 分別是視訊、音訊和字幕串流的 MPEG-TS PID;0:0、0:3 和 0:7 也會起作用)
要使用 lavfi
color
來源產生 5 秒的純紅色視訊- -filter_complex_threads nb_threads (全域)
定義用於處理 filter_complex 圖的執行緒數。與 filter_threads 類似,但僅用於
-filter_complex
圖。預設值是可用的 CPU 數量。- 使用硬體加速來解碼匹配的串流。允許的 hwaccel 值為
-lavfi filtergraph (全域)
- 定義複雜濾鏡圖,即具有任意數量的輸入和/或輸出的濾鏡圖。等效於 -filter_complex。
-accurate_seek (輸入)
- 此選項使用 -ss 選項啟用或停用輸入檔案中的精確搜尋。預設情況下啟用,因此在轉碼時搜尋是精確的。使用 -noaccurate_seek 停用它,這可能很有用,例如,在複製某些串流並轉碼其他串流時。
-seek_timestamp (輸入)
- 此選項使用 -ss 選項啟用或停用依時間戳記在輸入檔案中搜尋。預設情況下停用。如果啟用,則 -ss 選項的參數被視為實際時間戳記,並且不會被檔案的開始時間偏移。這僅對不從時間戳記 0 開始的檔案(例如傳輸串流)很重要。
-thread_queue_size size (輸入/輸出)
- 對於輸入,此選項設定從檔案或裝置讀取時排隊的封包的最大數量。對於低延遲/高速率即時串流,如果未及時讀取封包,則可能會丟棄封包;設定此值可以強制 ffmpeg 使用單獨的輸入執行緒並在封包到達時立即讀取封包。預設情況下,ffmpeg 僅在指定多個輸入時執行此操作。
對於輸出,此選項指定可以排隊到每個多工處理執行緒的最大封包數。
- -sdp_file file (全域)
將輸出串流的 sdp 資訊列印到 file。這允許在至少一個輸出不是 rtp 串流時轉儲 sdp 資訊。(至少需要一個輸出格式為 rtp)。
- -discard (輸入)
允許丟棄特定串流或來自串流的影格。可以使用值
all
完全丟棄任何輸入串流,而選擇性丟棄串流中的影格發生在解多工器處,並非所有解多工器都支援。- noframes
不丟棄任何影格。
- default
預設值,不丟棄任何影格。
- noref
丟棄所有非參考影格。
- bidir
丟棄所有雙向影格。
- nokey
丟棄除關鍵影格之外的所有影格。
all
- 丟棄所有影格。
-abort_on flags (全域)
- 在各種條件下停止並中止。以下旗標可用
empty_output
- 沒有封包傳遞到多工器,輸出為空。
empty_output_stream
- 在某些輸出串流中,沒有封包傳遞到多工器。
- -max_error_rate (全域)
- 設定跨所有輸入的解碼影格失敗的分數,當跨越該分數時,ffmpeg 將傳回退出代碼 69。跨越此閾值不會終止處理。範圍是介於 0 到 1 之間的浮點數。預設值為 2/3。
-xerror (全域)
在錯誤時停止並退出
-max_muxing_queue_size packets (輸出,每個串流)
- 當轉碼音訊和/或視訊串流時,ffmpeg 在每個串流都有一個封包之前不會開始寫入輸出。在等待這種情況發生時,會緩衝其他串流的封包。此選項設定此緩衝區的大小(以封包為單位),以用於匹配的輸出串流。
- 此選項的預設值應足以應付大多數用途,因此僅在您確定需要它時才觸摸此選項。
- -muxing_queue_data_threshold bytes (輸出,每個串流)
這是一個最小閾值,在此閾值之前,不考慮多工處理佇列大小。預設值為每個串流 50 MB,並且基於傳遞到多工器的封包的總大小。
-auto_conversion_filters (全域)
在所有濾鏡圖中啟用自動插入格式轉換濾鏡,包括由 -vf、-af、-filter_complex 和 -lavfi 定義的濾鏡圖。如果濾鏡格式協商需要轉換,則濾鏡的初始化將失敗。仍然可以透過在圖中插入相關的轉換濾鏡(scale、aresample)來執行轉換。預設為開啟,要明確停用它,您需要指定
-noauto_conversion_filters
。- -bits_per_raw_sample[:stream_specifier] value (輸出,每個串流)
宣告給定輸出串流中每個原始取樣的位元數為 value。請注意,此選項設定提供給編碼器/多工器的資訊,它不會更改串流以符合此值。設定與串流屬性不符的值可能會導致編碼失敗或輸出檔案無效。
- -stats_enc_pre[:stream_specifier] path (輸出,每個串流)
-stats_enc_post[:stream_specifier] path (輸出,每個串流)
- n
-stats_mux_pre[:stream_specifier] path (輸出,每個串流)
- 將有關匹配串流的每個影格編碼資訊寫入 path 給定的檔案中。
-stats_enc_pre 在原始視訊或音訊影格即將發送以進行編碼之前寫入有關這些影格的資訊,而 -stats_enc_post 寫入有關從編碼器接收的編碼封包的資訊。-stats_mux_pre 寫入有關即將發送到多工器的封包的資訊。每個影格或封包在指定檔案中產生一行。此行的格式由 -stats_enc_pre_fmt / -stats_enc_post_fmt / -stats_mux_pre_fmt 控制。
- 當多個串流的統計資訊寫入到單個檔案中時,與不同串流對應的行將交錯。此交錯的精確順序未指定,也不保證在程式的不同調用之間保持穩定,即使使用相同的選項也是如此。
-stats_enc_pre_fmt[:stream_specifier] format_spec (輸出,每個串流)
- -stats_enc_post_fmt[:stream_specifier] format_spec (輸出,每個串流)
-stats_mux_pre_fmt[:stream_specifier] format_spec (輸出,每個串流)
- 指定使用 -stats_enc_pre / -stats_enc_post / -stats_mux_pre 寫入的行的格式。
format_spec 是一個字串,可以包含 {fmt} 形式的指令。format_spec 是反斜線逸出的 - 使用 \{、\} 和 \\ 分別將文字 {、} 或 \ 寫入輸出。
- 與 fmt 一起給出的指令可以是以下之一
fidx
- t
輸出檔案的索引。
- sidx
檔案中輸出串流的索引。
- frame
影格編號。預編碼:到目前為止發送到編碼器的影格數。後編碼:到目前為止從編碼器接收的封包數。多工處理:到目前為止為此串流提交給多工器的封包數。
- ni
輸入影格編號。與此輸出影格或封包對應的輸入影格(即由解碼器輸出)的索引。如果不可用,則為 -1。
- tb
此影格/封包的時間戳記表示的時間基底,以有理數 num/den 表示。請注意,編碼器和多工器可能使用不同的時間基底。
- tbi
ptsi 的時間基底,以有理數 num/den 表示。當 ptsi 可用時可用,否則為 0/1。
- pts
影格或封包的呈現時間戳記,以整數表示。應乘以時間基底以計算呈現時間。
- ptsi
輸入影格(請參閱 ni)的呈現時間戳記,以整數表示。應乘以 tbi 以計算呈現時間。當不可用時,列印為 (2^63 - 1 = 9223372036854775807)。
- pt
影格或封包的呈現時間,以小數表示。等於 pts 乘以 tb。
- ti
輸入影格(請參閱 ni)的呈現時間,以小數表示。等於 ptsi 乘以 tbi。當不可用時,列印為 inf。
dts (封包)
標記為 frame 的指令只能與 -stats_enc_pre_fmt 一起使用。
標記為 audio 的指令只能與音訊串流一起使用。
預設格式字串為
- 預編碼
{fidx} {sidx} {n} {t}
- 後編碼
{fidx} {sidx} {n} {t}
未來,新的項目可能會被添加到預設格式字串的末尾。依賴格式完全不變的使用者應手動指定格式。
請注意,寫入同一個檔案的不同串流的統計資料可能具有不同的格式。
5.12 預設檔案
預設檔案包含一系列的 option=value 配對,每行一個,指定一系列選項,這些選項若在命令列中指定會很麻煩。以井字號('#')字元開頭的行會被忽略,並用於提供註解。請查看 FFmpeg 原始碼樹中的 presets 目錄以取得範例。
預設檔案有兩種型別:ffpreset 和 avpreset 檔案。
5.12.1 ffpreset 檔案
ffpreset 檔案使用 vpre
、apre
、spre
和 fpre
選項指定。fpre
選項接受預設檔案的檔名作為輸入,而不是預設名稱,並且可以用於任何型別的編解碼器。對於 vpre
、apre
和 spre
選項,預設檔案中指定的選項會應用於目前選定的與預設選項相同型別的編解碼器。
傳遞給 vpre
、apre
和 spre
預設選項的引數會根據以下規則識別要使用的預設檔案
首先,ffmpeg 會在目錄 $FFMPEG_DATADIR(如果已設定)和 $HOME/.ffmpeg,以及在組態時定義的資料目錄(通常是 PREFIX/share/ffmpeg)或在 win32 上可執行檔旁邊的 ffpresets 資料夾中,依序搜尋名為 arg.ffpreset 的檔案。例如,如果引數是 libvpx-1080p
,它將搜尋檔案 libvpx-1080p.ffpreset。
如果找不到此類檔案,則 ffmpeg 將在上述目錄中搜尋名為 codec_name-arg.ffpreset 的檔案,其中 codec_name 是將應用預設檔案選項的編解碼器的名稱。例如,如果您使用 -vcodec libvpx
選擇視訊編解碼器並使用 -vpre 1080p
,則它將搜尋檔案 libvpx-1080p.ffpreset。
5.12.2 avpreset 檔案
avpreset 檔案使用 pre
選項指定。它們的工作方式與 ffpreset 檔案類似,但它們僅允許編碼器特定的選項。因此,不能使用指定編碼器的 option=value 配對。
當指定 pre
選項時,ffmpeg 將在目錄 $AVCONV_DATADIR(如果已設定)和 $HOME/.avconv,以及在組態時定義的資料目錄(通常是 PREFIX/share/ffmpeg)中,依序搜尋帶有字尾 .avpreset 的檔案。
首先,ffmpeg 會在上述目錄中搜尋名為 codec_name-arg.avpreset 的檔案,其中 codec_name 是將應用預設檔案選項的編解碼器的名稱。例如,如果您使用 -vcodec libvpx
選擇視訊編解碼器並使用 -pre 1080p
,則它將搜尋檔案 libvpx-1080p.avpreset。
如果找不到此類檔案,則 ffmpeg 將在相同的目錄中搜尋名為 arg.avpreset 的檔案。
5.13 vstats 檔案格式
-vstats
和 -vstats_file
選項啟用產生包含已產生視訊輸出的統計資料的檔案。
-vstats_version
選項控制產生檔案的格式版本。
對於版本 1
,格式為
frame= FRAME q= FRAME_QUALITY PSNR= PSNR f_size= FRAME_SIZE s_size= STREAM_SIZEkB time= TIMESTAMP br= BITRATEkbits/s avg_br= AVERAGE_BITRATEkbits/s
對於版本 2
,格式為
out= OUT_FILE_INDEX st= OUT_FILE_STREAM_INDEX frame= FRAME_NUMBER q= FRAME_QUALITYf PSNR= PSNR f_size= FRAME_SIZE s_size= STREAM_SIZEkB time= TIMESTAMP br= BITRATEkbits/s avg_br= AVERAGE_BITRATEkbits/s
每個鍵對應的值描述如下
- avg_br
以 Kbits/s 表示的平均位元率
- br
以 Kbits/s 表示的位元率
- frame
編碼影格的數量
- out
輸出檔案索引
- PSNR
峰值訊噪比
- q
影格的品質
- f_size
以位元組數表示的編碼封包大小
- s_size
以 KiB 表示的串流大小
- st
輸出檔案串流索引
- time
封包的時間
- type
圖像型別
另請參閱 -stats_enc 選項,以取得顯示編碼統計資料的另一種方式。
6 範例
6.1 視訊和音訊擷取
如果您指定輸入格式和裝置,則 ffmpeg 可以直接抓取視訊和音訊。
ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
或者使用 ALSA 音訊來源(單聲道輸入,卡片 ID 為 1)而不是 OSS
ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg
請注意,在使用任何電視檢視器(例如 Gerd Knorr 的 xawtv)啟動 ffmpeg 之前,您必須先啟動正確的視訊來源和頻道。您還必須使用標準混音器正確設定音訊錄音音量。
6.2 X11 擷取
透過以下方式使用 ffmpeg 抓取 X11 顯示器
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg
0.0 是您的 X11 伺服器的 display.screen 號碼,與 DISPLAY 環境變數相同。
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
0.0 是您的 X11 伺服器的 display.screen 號碼,與 DISPLAY 環境變數相同。10 是抓取的 x 軸偏移量,20 是 y 軸偏移量。
6.3 視訊和音訊檔案格式轉換
任何支援的檔案格式和協定都可以作為 ffmpeg 的輸入
範例
- 您可以使用 YUV 檔案作為輸入
ffmpeg -i /tmp/test%d.Y /tmp/out.mpg
它將使用檔案
/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V, /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
Y 檔案使用的解析度是 U 和 V 檔案的兩倍。它們是原始檔案,沒有標頭。它們可以由所有像樣的視訊解碼器產生。如果 ffmpeg 無法猜測影像大小,您必須使用 -s 選項指定影像大小。
- 您可以從原始 YUV420P 檔案輸入
ffmpeg -i /tmp/test.yuv /tmp/out.avi
test.yuv 是一個包含原始 YUV 平面資料的檔案。每個影格都由 Y 平面組成,後跟垂直和水平解析度減半的 U 和 V 平面。
- 您可以輸出到原始 YUV420P 檔案
ffmpeg -i mydivx.avi hugefile.yuv
- 您可以設定多個輸入檔案和輸出檔案
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
將音訊檔案 a.wav 和原始 YUV 視訊檔案 a.yuv 轉換為 MPEG 檔案 a.mpg。
- 您也可以同時進行音訊和視訊轉換
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
以 22050 Hz 取樣率將 a.wav 轉換為 MPEG 音訊。
- 您可以同時編碼為多種格式,並定義從輸入串流到輸出串流的映射
ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2
以 64 kbits 將 a.wav 轉換為 a.mp2,並以 128 kbits 轉換為 b.mp2。'-map file:index' 指定每個輸出串流使用哪個輸入串流,依照輸出串流的定義順序。
- 您可以轉碼解密的 VOB
ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi
這是一個典型的 DVD 翻錄範例;輸入是 VOB 檔案,輸出是 AVI 檔案,具有 MPEG-4 視訊和 MP3 音訊。請注意,在此命令中,我們使用 B 影格,因此 MPEG-4 串流與 DivX5 相容,並且 GOP 大小為 300,這表示對於 29.97fps 輸入視訊,每 10 秒有一個畫面內影格。此外,音訊串流是 MP3 編碼的,因此您需要透過傳遞
--enable-libmp3lame
來設定啟用 LAME 支援。映射對於 DVD 轉碼以取得所需的音訊語言特別有用。注意:若要查看支援的輸入格式,請使用
ffmpeg -demuxers
。 - 您可以從視訊中擷取影像,或從許多影像建立視訊
用於從視訊擷取影像
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
這將從視訊中每秒擷取一個視訊影格,並將它們輸出到名為 foo-001.jpeg、foo-002.jpeg 等的檔案中。影像將被重新縮放以符合新的 WxH 值。
如果您只想擷取有限數量的影格,您可以將上述命令與
-frames:v
或-t
選項結合使用,或與 -ss 結合使用以從時間上的特定點開始擷取。用於從許多影像建立視訊
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
語法
foo-%03d.jpeg
指定使用由三個數字組成的十進制數字,並以零填充以表示序號。它是 C printf 函數支援的相同語法,但只有接受普通整數的格式才適用。當匯入影像序列時,-i 也支援在內部展開 shell 樣式的萬用字元模式(globbing),方法是選擇影像 2 特定的
-pattern_type glob
選項。例如,對於從符合 glob 模式
foo-*.jpeg
的檔名建立視訊ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
- 您可以將許多相同型別的串流放入輸出中
ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut
產生的輸出檔案 test12.nut 將包含來自輸入檔案的前四個串流,順序相反。
- 強制 CBR 視訊輸出
ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
- lmin、lmax、mblmin 和 mblmax 這四個選項使用「lambda」單位,但您可以使用 QP2LAMBDA 常數輕鬆地從「q」單位轉換
ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
7 參見
ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters
8 作者
FFmpeg 開發人員。
有關作者的詳細資訊,請參閱專案的 Git 歷史記錄 (https://git.ffmpeg.org/ffmpeg),例如,在 FFmpeg 原始碼目錄中輸入命令 git log
,或瀏覽線上儲存庫 https://git.ffmpeg.org/ffmpeg。
特定組件的維護者列在原始碼樹中的 MAINTAINERS 檔案中。
本文件於 2025 年 1 月 21 日 使用 makeinfo 產生。
託管由 telepoint.bg 提供