FFmpeg 格式文件說明文件

目錄

1 描述

本文件描述了 libavformat 函式庫提供的支援格式 (復用器與解復用器)。

2 格式選項

libavformat 函式庫提供了一些通用的全域選項,這些選項可以設定在所有的復用器和解復用器上。此外,每個復用器或解復用器可能支援所謂的私有選項,這些選項是特定於該組件的。

選項可以透過在 FFmpeg 工具中指定 -option value 來設定,或者透過在 AVFormatContext 選項中明確設定值,或使用 libavutil/opt.h API 以程式化方式使用。

以下是支援選項的列表

avioflags flags (輸入/輸出)

可能的值

direct

減少緩衝。

probesize integer (輸入)

設定探測大小,以位元組為單位,即用於分析以獲取串流資訊的資料大小。較高的值將能偵測到更多分散在串流中的資訊,但會增加延遲。必須是不小於 32 的整數。預設值為 5000000。

max_probe_packets integer (輸入)

設定探測編碼器時緩衝封包的最大數量。預設值為 2500 個封包。

packetsize integer (輸出)

設定封包大小。

fflags flags

設定格式標誌。有些是為有限數量的格式實作的。

輸入檔案的可能值

discardcorrupt

丟棄損壞的封包。

fastseek

為某些格式啟用快速但不精確的搜尋。

genpts

如果存在 DTS,則產生遺失的 PTS。

igndts

如果也設定了 PTS,則忽略 DTS。在設定 PTS 的情況下,DTS 值會設定為 NOPTS。當設定了 nofillin 標誌時,這會被忽略。

ignidx

忽略索引。

nobuffer

減少在初始輸入串流分析期間因緩衝而引入的延遲。

nofillin

不要填入可以精確計算的封包欄位中的遺失值。

noparse

停用 AVParsers,這也需要 +nofillin

sortdts

嘗試依 DTS 交錯輸出封包。目前,僅適用於帶有索引的 AVI。

輸出檔案的可能值

autobsf

根據輸出格式的需求自動應用位元流過濾器。預設為啟用。

bitexact

僅寫入平台、建置和時間獨立的資料。這確保了檔案和資料校驗和在不同平台之間是可重現且匹配的。其主要用途是用於回歸測試。

flush_packets

立即寫出封包。

shortest

在最短串流結束時停止復用。可能需要增加 max_interleave_delta 以避免在 EOF 之前刷新較長的串流。

seek2any integer (輸入)

如果設定為 1,則允許在解復用器層級搜尋非關鍵幀(如果支援)。預設值為 0。

analyzeduration integer (輸入)

指定分析多少微秒來探測輸入。較高的值將能偵測到更精確的資訊,但會增加延遲。預設值為 5,000,000 微秒 = 5 秒。

cryptokey hexadecimal string (輸入)

設定解密金鑰。

indexmem integer (輸入)

設定用於時間戳索引的最大記憶體(每個串流)。

rtbufsize integer (輸入)

設定用於緩衝即時幀的最大記憶體。

fdebug flags (輸入/輸出)

印出特定的偵錯資訊。

可能的值

ts
max_delay integer (輸入/輸出)

設定復用或解復用的最大延遲,以微秒為單位。

fpsprobesize integer (輸入)

設定用於探測 fps 的幀數。

audio_preload integer (輸出)

設定音訊封包應提前交錯的微秒數。

chunk_duration integer (輸出)

設定每個區塊的微秒數。

chunk_size integer (輸出)

設定每個區塊的大小,以位元組為單位。

err_detect, f_err_detect flags (輸入)

設定錯誤偵測標誌。f_err_detect 已棄用,應僅透過 ffmpeg 工具使用。

可能的值

crccheck

驗證嵌入的 CRC。

bitstream

偵測位元流規格偏差。

buffer

偵測不正確的位元流長度。

explode

在偵測到輕微錯誤時中止解碼。

careful

將違反規格且未在實際應用中出現的事物視為錯誤。

compliant

將所有不符合規格的事物視為錯誤。

aggressive

將健全編碼器不應做的事物視為錯誤。

max_interleave_delta integer (輸出)

設定交錯的最大緩衝持續時間。持續時間以微秒表示,預設值為 10000000(10 秒)。

為了確保所有串流都正確交錯,libavformat 會等到每個串流都至少有一個封包後,才會實際將任何封包寫入輸出檔案。當某些串流是「稀疏的」(即連續封包之間存在很大的間隙)時,這可能會導致過度緩衝。

此欄位指定了復用佇列中第一個和最後一個封包的時間戳之間的最大差異,超過此差異,libavformat 將輸出一個封包,無論它是否已為所有串流排隊封包。

如果設定為 0,libavformat 將繼續緩衝封包,直到每個串流都有一個封包,而不管緩衝封包之間的最大時間戳差異。

use_wallclock_as_timestamps integer (輸入)

如果設定為 1,則使用系統時間作為時間戳。預設值為 0。

avoid_negative_ts integer (輸出)

可能的值

make_non_negative

位移時間戳以使其變為非負數。另請注意,這僅影響前導負時間戳,而不影響非單調負時間戳。

make_zero

位移時間戳,使第一個時間戳為 0。

auto (default)

當目標格式需要時,啟用位移。

disabled

停用時間戳位移。

當啟用位移時,所有輸出時間戳都會位移相同的量。與未位移的情況相比,音訊、視訊和字幕的失步以及相對時間戳差異都會被保留。

skip_initial_bytes integer (輸入)

如果設定為 1,則設定在讀取標頭和幀之前要跳過的位元組數。預設值為 0。

correct_ts_overflow integer (輸入)

如果設定為 1,則修正單一時間戳溢位。預設值為 1。

flush_packets integer (輸出)

在每個封包後刷新底層 I/O 串流。預設值為 -1(自動),這表示底層協定將決定,1 啟用它,並具有減少延遲的效果,0 停用它,在某些情況下可能會增加 IO 吞吐量。

output_ts_offset offset (輸出)

設定輸出時間偏移量。

offset 必須是時間長度規範,請參閱 (ffmpeg-utils)ffmpeg-utils(1) 手冊中的「時間長度」章節

偏移量由復用器添加到輸出時間戳。

指定正偏移量表示相應的串流會延遲 offset 中指定的時間長度。預設值為 0(表示不應用偏移量)。

format_whitelist list (輸入)

以逗號分隔的允許解復用器列表。預設情況下,允許所有解復用器。

dump_separator string (輸入)

用於分隔在命令列上印出的串流參數欄位的分隔符號。例如,要使用換行符號和縮排分隔欄位

ffprobe -dump_separator "
                          "  -i ~/videos/matrixbench_mpeg2.mpg
max_streams integer (輸入)

指定串流的最大數量。這可以用於拒絕因大量串流而需要過多資源的檔案。

skip_estimate_duration_from_pts bool (輸入)

如果需要額外探測檔案末尾的 PTS,則跳過輸入持續時間的估計。目前,適用於 MPEG-PS 和 MPEG-TS。

duration_probesize integer (輸入)

設定探測大小,以位元組為單位,用於輸入持續時間估計,當它實際上需要在檔案末尾額外探測 PTS 時(目前:MPEG-PS 和 MPEG-TS)。它旨在為對自身更好的持續時間探測感興趣的使用者,或者間接地因為使用 concat 解復用器等。典型的用例是 MPEG-TS CBR,具有高位元率、高視訊緩衝,並以類似於視訊和音訊的 PTS 結束清理:在這種情況下,最後一個視訊封包和最後一個音訊封包之間的大物理間隙使得需要讀取許多位元組才能獲得視訊串流持續時間。另一個用例是,由於幀重新排序,預設探測行為僅達到單個視訊幀,而不是串流的最後一個幀,因此持續時間不準確。即使對於小檔案,設定此選項也會對效能產生影響,因為探測大小是固定的。預設行為是一般用途的權衡,在很大程度上是自適應的,但探測大小不會無限擴展以獲取串流持續時間。必須是不小於 1 的整數,或 0 表示預設行為。

strict, f_strict integer (輸入/輸出)

指定多嚴格地遵循標準。f_strict 已棄用,應僅透過 ffmpeg 工具使用。

可能的值

very

嚴格遵守舊版更嚴格的規格或參考軟體

strict

嚴格遵守規格中的所有內容,無論後果如何

normal
unofficial

允許非官方擴充功能

experimental

允許非標準化的實驗性事物、實驗性(未完成/工作中/未充分測試)解碼器和編碼器。注意:實驗性解碼器可能構成安全風險,請勿將其用於解碼不受信任的輸入。

2.1 格式串流指定器

格式串流指定器允許選擇一個或多個符合特定屬性的串流。

串流指定器的確切語義由 libavformat/avformat.h 標頭中宣告的 avformat_match_stream_specifier() 函數定義,並記錄在 (ffmpeg)ffmpeg(1) 手冊中的「串流指定器」章節 中。

3 解復用器

解復用器是 FFmpeg 中配置的元件,可以從特定類型的檔案中讀取多媒體串流。

當您配置 FFmpeg 建置時,預設會啟用所有支援的解復用器。您可以使用配置選項 --list-demuxers 列出所有可用的解復用器。

您可以使用配置選項 --disable-demuxers 停用所有解復用器,並使用選項 --enable-demuxer=DEMUXER 選擇性地啟用單個解復用器,或使用選項 --disable-demuxer=DEMUXER 停用它。

ff* 工具的選項 -demuxers 將顯示已啟用解復用器的列表。使用 -formats 查看已啟用解復用器和復用器的組合列表。

以下是一些目前可用解復用器的描述。

3.1 aa

Audible Format 2、3 和 4 解復用器。

此解復用器用於解復用 Audible Format 2、3 和 4 (.aa) 檔案。

3.2 aac

原始音訊資料傳輸串流 AAC 解復用器。

此解復用器用於解復用 ADTS 輸入,其中包含單個 AAC 串流以及其中的任何 ID3v1/2 或 APE 標籤。

3.3 apng

動態可攜式網路圖形解復用器。

此解復用器用於解復用 APNG 檔案。除了 PNG 簽名之外,所有標頭,直到(但不包括)第一個 fcTL 區塊,都作為額外資料傳輸。然後將幀分割為兩個 fcTL 區塊之間或最後一個 fcTL 和 IEND 區塊之間的所有區塊。

-ignore_loop bool

如果設定,則忽略檔案中的迴圈變數。預設為啟用。

-max_fps int

每秒幀數的最大幀率。預設值 0 表示沒有限制。

-default_fps int

當檔案中未指定幀率時,每秒幀數的預設幀率(0 表示盡可能快)。預設值為 15。

3.4 asf

進階系統格式解復用器。

此解復用器用於解復用 ASF 檔案和 MMS 網路串流。

-no_resync_search bool

不要嘗試透過尋找特定的可選起始碼來重新同步。

3.5 concat

虛擬串聯腳本解復用器。

此解復用器從文字檔案中讀取檔案列表和其他指令,並將它們依序解復用,就好像它們的所有封包都已被復用在一起一樣。

檔案中的時間戳會被調整,使第一個檔案從 0 開始,而每個後續檔案都從前一個檔案結束的位置開始。請注意,這是全域完成的,如果所有串流的長度不完全相同,則可能會導致間隙。

所有檔案都必須具有相同的串流(相同的編碼器、相同的時基等)。

每個檔案的持續時間用於調整下一個檔案的時間戳:如果持續時間不正確(例如,因為它是使用位元率計算的,或者因為檔案被截斷),則可能會導致瑕疵。duration 指令可用於覆寫儲存在每個檔案中的持續時間。

3.5.1 語法

腳本是一個擴充 ASCII 的文字檔案,每行一個指令。空白行、前導空格和以 '#' 開頭的行會被忽略。以下指令被識別

file path

要讀取的檔案路徑;特殊字元和空格必須使用反斜線或單引號跳脫。

所有後續的檔案相關指令都適用於該檔案。

ffconcat version 1.0

識別腳本類型和版本。

為了使 FFmpeg 自動識別格式,此指令必須完全按原樣出現在腳本的第一行(沒有額外空格或位元組順序標記)。

duration dur

檔案的持續時間。此資訊可以從檔案中指定;如果檔案中的資訊不可用或不準確,則在此處指定可能更有效率或有幫助。

如果為所有檔案設定了持續時間,則可以在整個串聯視訊中搜尋。

inpoint timestamp

檔案的入點。當解復用器打開檔案時,它會立即搜尋到指定的時間戳。搜尋的目的是為了使所有串流都可以在入點成功呈現。

此指令最適用於幀內編碼器,因為對於非幀內編碼器,您通常會在實際入點之前獲得額外的封包,並且解碼的內容很可能也包含入點之前的幀。

對於每個檔案,檔案入點之前的封包的時間戳將小於檔案的計算開始時間戳(在第一個檔案的情況下為負數),並且檔案的持續時間(如果未由 duration 指令指定)將根據其指定的入點減少。

由於在指定的入點之前可能存在封包,因此兩個串聯檔案之間的封包時間戳可能會重疊。

outpoint timestamp

檔案的出點。當解復用器在任何串流中達到指定的解碼時間戳時,它會將其視為檔案結束條件,並跳過目前和所有串流中的所有剩餘封包。

出點是互斥的,這表示解復用器不會輸出解碼時間戳大於或等於出點的封包。

此指令最適用於幀內編碼器和所有串流緊密交錯的格式。對於非幀內編碼器,您通常會在出點之後獲得帶有呈現時間戳的額外封包,因此解碼的內容很可能也包含出點之後的幀。如果您的串流沒有緊密交錯,您可能無法在出點之前從所有串流中獲得所有封包,並且您可能只能解碼最早的串流直到出點。

檔案的持續時間(如果未由 duration 指令指定)將根據其指定的出點減少。

file_packet_metadata key=value

檔案封包的元數據。指定的元數據將為每個檔案封包設定。您可以多次指定此指令以新增多個元數據條目。此指令已棄用,請改用 file_packet_meta

file_packet_meta key value

檔案封包的元數據。指定的元數據將為每個檔案封包設定。您可以多次指定此指令以新增多個元數據條目。

option key value

用於存取、打開和探測檔案的選項。可以多次出現。

stream

在虛擬檔案中引入串流。所有後續的串流相關指令都適用於最後引入的串流。必須設定某些串流屬性,以便允許識別子檔案中的匹配串流。如果腳本中未定義串流,則會複製第一個檔案中的串流。

exact_stream_id id

設定串流的 id。如果給定此指令,將使用子檔案中具有對應 id 的字串。這對於 MPEG-PS (VOB) 檔案特別有用,其中串流的順序不可靠。

stream_meta key value

串流的元數據。可以多次出現。

stream_codec value

串流的編碼器。

stream_extradata hex_string

字串的額外資料,以十六進位編碼。

chapter id start end

新增章節。id 是一個唯一的識別符,可能是小且連續的。

3.5.2 選項

此解復用器接受以下選項

safe

如果設定為 1,則拒絕不安全的檔案路徑和指令。如果檔案路徑不包含協定規範,並且是相對路徑,並且所有組件僅包含可攜式字元集中的字元(字母、數字、句點、底線和連字號),並且組件開頭沒有句點,則該檔案路徑被視為安全。

如果設定為 0,則接受任何檔案名稱。

預設值為 1。

auto_convert

如果設定為 1,則嘗試對封包資料執行自動轉換,以使串流可串聯。預設值為 1。

目前,唯一的轉換是將 h264_mp4toannexb 位元流過濾器添加到 MP4 格式的 H.264 串流。如果解析度發生變化,則尤其需要這樣做。

segment_time_metadata

如果設定為 1,則每個封包將包含 lavf.concat.start_timelavf.concat.duration 封包元數據值,這些值是以微秒表示的串聯輸出中相應檔案片段的 start_time 和 duration。持續時間元數據僅在基於 concat 檔案已知時設定。預設值為 0。

3.5.3 範例

  • 使用絕對檔案名稱並包含一些註解
    # my first filename
    file /mnt/share/file-1.wav
    # my second filename including whitespace
    file '/mnt/share/file 2.wav'
    # my third filename including whitespace plus single quote
    file '/mnt/share/file 3'\''.wav'
    
  • 允許輸入格式自動探測,使用安全檔案名稱並設定第一個檔案的持續時間
    ffconcat version 1.0
    
    file file-1.wav
    duration 20.0
    
    file subdir/file-2.wav
    

3.6 dash

HTTP 動態自適應串流解復用器。

此解復用器呈現資訊清單中找到的所有 AVStream。透過在 AVStream 上設定丟棄標誌,呼叫者可以決定實際接收哪些串流。每個串流分別以名為 "id" 和 "variant_bitrate" 的元數據鍵鏡射 <Representation> 中的 idbandwidth 屬性。

3.6.1 選項

此解復用器接受以下選項

cenc_decryption_key

16 位元組金鑰,以十六進位表示,用於解密使用 ISO 通用加密 (CENC/AES-128 CTR; ISO/IEC 23001-7) 加密的檔案。

3.7 dvdvideo

DVD-Video 解復用器,由 libdvdnav 和 libdvdread 提供技術支援。

可以直接將 DVD 標題,特別是連續 PGC,攝取到轉換管道中。選單資產,例如背景視訊或音訊,也可以在給定選單座標的情況下解復用(盡力而為)。

接受區塊裝置(DVD 光碟機)、ISO 檔案和目錄結構。在其中一個輸入前面使用 -f dvdvideo 啟動。

此解復用器沒有任何種類的解密程式碼。您需要自行處理加密 DVD,並且不應期望在此問題上獲得支援。

底層播放由 libdvdnav 處理,結構解析由 libdvdread 處理。FFmpeg 必須在 GPL 函式庫支援可用的情況下建置,以及配置開關 --enable-libdvdnav--enable-libdvdread

您需要提供所需的「標題編號」或確切的 PGC/PG 坐標。許多開源 DVD 播放器和工具可以幫助提供此資訊。如果未指定,解復用器將預設為標題 1,這適用於許多光碟。但是,由於格式的靈活性,建議手動檢查。許多光碟的製作方式很奇怪或標頭無效。

如果輸入是真正的 DVD 光碟機,請注意,有些光碟機在從光碟讀取壞扇區時可能會靜默失敗,而是傳回隨機位元,這實際上是損壞的資料。這在老化的或腐爛的光碟上尤其突出。需要進行第二次掃描和完整性檢查才能偵測到損壞。這不是 FFmpeg 的問題。

3.7.1 背景

DVD-Video 不是傳統意義上可直接存取的線性容器格式。相反,它允許對儲存在無標頭 VOB 檔案中的仔細復用的 MPEG-PS 串流進行複雜且程式化的播放。對於終端使用者而言,這些串流簡稱為「標題」,但實際的邏輯播放順序是由標題內的一個或多個「PGC」或程式群組鏈定義的。PGC 又由多個「PG」或「程式」組成,這些程式是實際的視訊片段(對於典型的視訊功能,按順序排列)。PGC 結構以及串流佈局和元數據儲存在需要解析的 IFO 檔案中。PGC 可以更簡單地被認為是播放列表。

實際的 DVD 播放器依賴使用者透過選單和內部 VM 進行 GUI 互動來驅動解復用的方向。通常,使用者可以導航(透過選單)或自動重新導向到他們選擇的 PGC。在此過程和後續播放期間,DVD 播放器的內部 VM 也會維護狀態並執行指令,這些指令可以在播放期間建立跳轉到不同扇區的操作。這就是 libdvdnav 參與的原因,因為在許多情況下,線性讀取光碟 (VOB) 上的 MPEG-PS blob 不足以產生正確的順序。

還有許多其他 DVD 結構(一個很長的主題)在此不討論。特別是 NAV 封包,由這個解復用器處理以建立準確的計時,但不作為串流發出。為了獲得良好的高階理解,請參閱:https://code.videolan.org/videolan/libdvdnav/-/blob/master/doc/dvd_structures

3.7.2 選項

此解復用器接受以下選項

title int

要播放的標題編號。如果未設定 pgcpg,則必須設定。不適用於選單。預設值為 0(自動),目前僅選擇第一個可用的標題(標題 1)並通知使用者相關含義。

chapter_start int

要開始的章節或 PTT(標題部分)編號。不適用於選單。預設值為 1。

chapter_end int

要結束的章節或 PTT(標題部分)編號。不適用於選單。預設值為 0,這是一個特殊值,表示在最後一個可能的章節結束。

angle int

視訊角度編號,指的是本質上是從 VOB 中交錯的備用幀組成的額外視訊串流。不適用於選單。預設值為 1。

region int

用於播放的區域代碼。某些光碟可能會使用此代碼來預設在不同區域以特定角度播放。如果用作輸入,此選項不會影響真實 DVD 光碟機的區域代碼。不適用於選單。預設值為 0,「世界」。

menu bool

解復用選單資產,而不是導航標題。需要選單的確切坐標(menu_lumenu_vtspgcpg)。預設值為 false。

menu_lu int

要解復用的選單語言。在 DVD 中,選單按語言分組。預設值為 1,第一個語言單元。

menu_vts int

選單所在的 VTS,如果是 VMG 選單(根層級),則為 0。預設值為 1,第一個 VTS 的選單。

pgc int

要開始播放的條目 PGC,與 pg 結合使用。替代設定 title 的方法。目前不支援章節標記。必須為選單明確設定。預設值為 0,自動從 title 的值解析。

pg int

要開始播放的條目 PG,與 pgc 結合使用。替代設定 title 的方法。目前不支援章節標記。預設值為 1,PGC 的第一個 PG。

preindex bool

啟用此選項可獲得準確的章節 (PTT) 標記和持續時間測量,這需要緩慢的第二次掃描讀取,以便從 NAV 封包中索引章節標記時間戳。對於真正的光碟機來說,這是不理想的額外工作。建議且更快的方法是對儲存在硬碟上的 DVD 結構備份使用此選項。與 pgcpg 不相容。預設值為 0,false。

trim bool

從開頭跳過填充單元格(即短於 1 秒的單元格)。許多光碟在 PGC 的開頭都有填充片段,通常帶有垃圾資料,旨在控制真實 DVD 播放器的緩衝速度,而沒有其他實質資料值。不適用於選單。預設值為 1,true。

3.7.3 範例

  • 從給定的 DVD 結構開啟標題 3
    ffmpeg -f dvdvideo -title 3 -i <path to DVD> ...
    
  • 從給定的 DVD 結構從標題 1 開啟章節 3-6
    ffmpeg -f dvdvideo -chapter_start 3 -chapter_end 6 -title 1 -i <path to DVD> ...
    
  • 從給定的 DVD 結構從標題 1 僅開啟章節 5
    ffmpeg -f dvdvideo -chapter_start 5 -chapter_end 5 -title 1 -i <path to DVD> ...
    
  • 從 VTS 1、PGC 1 中解復用語言 1 的選單,從 PG 1 開始
    ffmpeg -f dvdvideo -menu 1 -menu_lu 1 -menu_vts 1 -pgc 1 -pg 1 -i <path to DVD> ...
    

3.8 ea

Electronic Arts 多媒體格式解復用器。

此格式由各種 Electronic Arts 遊戲使用。

3.8.1 選項

merge_alpha bool

通常 VP6 alpha 通道(如果存在)會作為輔助視訊串流傳回,透過設定此選項,您可以使解復用器傳回單個視訊串流,其中除了普通視訊外,還包含 alpha 通道。

3.9 imf

可互通主格式解復用器。

此解復用器呈現 IMF Composition 中找到的音訊和視訊串流,如 SMPTE ST 2067-2 中所指定。

ffmpeg [-assetmaps <path of ASSETMAP1>,<path of ASSETMAP2>,...] -i <path of CPL> ...

如果未指定 -assetmaps,解復用器會在與 CPL 相同的目錄中尋找名為 ASSETMAP.xml 的檔案。

3.10 flv, live_flv, kux

Adobe Flash 視訊格式解復用器。

此解復用器用於解復用 FLV 檔案和 RTMP 網路串流。在即時網路串流的情況下,如果您強制格式,則可以使用 live_flv 選項而不是 flv 來在時間戳不連續的情況下生存。KUX 是 Youku 平台上使用的 flv 變體。

ffmpeg -f flv -i myfile.flv ...
ffmpeg -f live_flv -i rtmp://<any.server>/anything/key ....
-flv_metadata bool

根據 onMetaData 陣列內容分配串流。

-flv_ignore_prevtag bool

忽略先前標籤值的大小。

-flv_full_metadata bool

輸出 onMetadata 的所有內容。

3.11 gif

動態 GIF 解復用器。

它接受以下選項

min_delay

設定幀之間最小的有效延遲,以百分之一秒為單位。範圍為 0 到 6000。預設值為 2。

max_gif_delay

設定幀之間最大的有效延遲,以百分之一秒為單位。範圍為 0 到 65535。預設值為 65535(接近 11 分鐘),規格允許的最大值。

default_delay

設定幀之間的預設延遲,以百分之一秒為單位。範圍為 0 到 6000。預設值為 10。

ignore_loop

GIF 檔案可以包含迴圈特定次數(或無限次)的資訊。如果 ignore_loop 設定為 1,則會忽略輸入中的迴圈設定,並且不會發生迴圈。如果設定為 0,則會發生迴圈,並根據 GIF 迴圈指定的次數。預設值為 1。

例如,使用 overlay 過濾器,將無限迴圈的 GIF 放置在另一個視訊之上

ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv

請注意,在上述範例中,overlay 濾鏡使用了 shortest 選項,以便在最短輸入檔案的長度結束輸出影片。在此範例中,最短輸入檔案為 input.mp4,因為 GIF 會無限循環播放。

3.12 hls

HLS 解多工器

Apple HTTP Live Streaming 解多工器。

此解多工器呈現來自所有變體串流的所有 AVStreams。id 欄位設定為位元率變體索引編號。透過設定 AVStreams 上的捨棄旗標(在 ffplay 中按下 'a' 或 'v'),呼叫者可以決定實際接收哪些變體串流。串流所屬變體的總位元率可在名為 "variant_bitrate" 的 metadata 鍵中取得。

它接受以下選項

live_start_index

直播串流開始播放的片段索引(負值表示從結尾算起)。

prefer_x_start

如果播放列表中有 #EXT-X-START,則優先使用它,而非 live_start_index。

allowed_extensions

hls 允許存取的檔案副檔名列表,以 ‘,’ 分隔。

max_reload

嘗試重新載入不完整列表的最大次數。預設值為 1000。

m3u8_hold_counters

當 m3u8 在沒有新片段的情況下重新整理時,載入 m3u8 的最大次數。預設值為 1000。

http_persistent

使用持久性 HTTP 連線。僅適用於 HTTP 串流。預設為啟用。

http_multiple

使用多個 HTTP 連線下載 HTTP 片段。對於 HTTP/1.1 伺服器,預設為啟用。

http_seekable

使用 HTTP 部分請求下載 HTTP 片段。0 = 停用,1 = 啟用,-1 = 自動,預設為自動。

seg_format_options

設定媒體片段解多工器的選項,使用以 : 分隔的 key=value 配對列表。

seg_max_retry

發生錯誤時重新載入片段的最大次數,當不希望在網路錯誤時跳過片段時很有用。預設值為 0。

3.13 image2

影像檔案解多工器。

此解多工器從模式指定的影像檔案列表讀取。模式的語法和含義由選項 pattern_type 指定。

模式可能包含後綴,用於自動判斷檔案中包含的影像格式。

序列中所有檔案的每個影像大小、像素格式和格式必須相同。

此解復用器接受以下選項

framerate

設定視訊串流的幀率。預設值為 25。

loop

若設定為 1,則循環播放輸入。預設值為 0。

pattern_type

選擇用於解釋所提供檔案名稱的模式類型。

pattern_type 接受下列其中一個值。

none

停用模式比對,因此視訊將僅包含指定的影像。如果您不想從多個影像建立序列,且您的檔案名稱可能包含特殊的模式字元,則應使用此選項。

sequence

選擇序列模式類型,用於指定由循序編號索引的檔案序列。

序列模式可能包含字串 "%d" 或 "%0Nd",用於指定模式比對的每個檔案名稱中代表循序編號的字元位置。如果使用 "%d0Nd" 格式,則每個檔案名稱中代表編號的字串會以 0 填充,而 N 是代表編號的 0 填充位數總數。字面字元 ‘%’ 可以在模式中使用字串 "%%" 指定。

如果序列模式包含 "%d" 或 "%0Nd",則模式指定的檔案列表中的第一個檔案名稱必須包含一個介於 start_numberstart_number+start_number_range-1 之間的數字(包含邊界值),並且所有後續數字都必須是循序的。

例如,模式 "img-%03d.bmp" 將比對 img-001.bmpimg-002.bmp、...、img-010.bmp 等形式的檔案名稱序列;模式 "i%%m%%g-%d.jpg" 將比對 i%m%g-1.jpgi%m%g-2.jpg、...、i%m%g-10.jpg 等形式的檔案名稱序列。

請注意,模式不一定需要包含 "%d" 或 "%0Nd",例如,若要轉換單個影像檔案 img.jpeg,您可以使用以下命令

ffmpeg -i img.jpeg img.png
glob

選擇 glob 萬用字元模式類型。

此模式的解譯方式類似於 glob() 模式。只有在編譯 libavformat 時包含 globbing 支援,才能選擇此項。

glob_sequence (已棄用,將移除)

選擇混合的 glob 萬用字元/序列模式。

如果您的 libavformat 版本在編譯時包含 globbing 支援,並且提供的模式包含至少一個 glob 元字元(%*?[]{} 之一),且該字元前面有一個未逸出的 "%",則該模式會解譯為 glob() 模式,否則會解譯為序列模式。

所有 glob 特殊字元 %*?[]{} 都必須以 "%" 作為前綴。若要逸出字面 "%",您應使用 "%%"。

例如,模式 foo-%*.jpeg 將比對所有以 "foo-" 為前綴並以 ".jpeg" 結尾的檔案名稱,而 foo-%?%?%?.jpeg 將比對所有以 "foo-" 為前綴、後接三個字元序列並以 ".jpeg" 結尾的檔案名稱。

此模式類型已被棄用,建議改用 globsequence

預設值為 glob_sequence

pixel_format

設定要讀取影像的像素格式。如果未指定,則會從序列中的第一個影像檔案推測像素格式。

start_number

設定要開始讀取的影像檔案模式所比對的檔案索引。預設值為 0。

start_number_range

設定從 start_number 開始,在序列中尋找第一個影像檔案時要檢查的索引間隔範圍。預設值為 5。

ts_from_file

若設定為 1,則會將幀時間戳記設定為影像檔案的修改時間。請注意,不保證時間戳記的單調性:影像順序與不使用此選項時相同。預設值為 0。若設定為 2,則會將幀時間戳記設定為奈秒精度的影像檔案修改時間。

video_size

設定要讀取影像的視訊大小。如果未指定,則會從序列中的第一個影像檔案推測視訊大小。

export_path_metadata

若設定為 1,則會在輸入中找到的 metadata 中新增兩個額外欄位,使其也可供其他濾鏡使用(範例請參閱 drawtext 濾鏡)。預設值為 0。額外欄位描述如下

lavf.image2dec.source_path

對應於正在讀取的輸入檔案完整路徑。

lavf.image2dec.source_basename

對應於正在讀取的檔案名稱。

3.13.1 範例

  • 使用 ffmpeg 從檔案序列 img-001.jpegimg-002.jpeg、... 中的影像建立視訊,假設輸入幀率為每秒 10 幀
    ffmpeg -framerate 10 -i 'img-%03d.jpeg' out.mkv
    
  • 與上述相同,但從序列中索引為 100 的檔案開始讀取
    ffmpeg -framerate 10 -start_number 100 -i 'img-%03d.jpeg' out.mkv
    
  • 讀取符合 "*.png" glob 模式的影像,即所有以 ".png" 後綴結尾的檔案
    ffmpeg -framerate 10 -pattern_type glob -i "*.png" out.mkv
    

3.14 libgme

Game Music Emu 程式庫是一系列電玩遊戲音樂檔案模擬器。

如需更多資訊,請參閱 https://bitbucket.org/mpyne/game-music-emu/overview

它接受以下選項

track_index

設定要解多工處理的音軌索引。解多工器只能匯出一個音軌。音軌索引從 0 開始。預設為選擇第一個音軌。音軌數量會匯出為 tracks metadata 條目。

sample_rate

設定匯出音軌的取樣率。範圍為 1000 到 999999。預設值為 44100。

max_size (bytes)

解多工器將整個檔案緩衝到記憶體中。調整此值以設定最大緩衝區大小,這反過來會成為可讀取檔案大小的上限。預設值為 50 MiB。

3.15 libmodplug

基於 ModPlug 的模組解多工器

請參閱 https://github.com/Konstanty/libmodplug

它將匯出一個 2 聲道 16 位元 44.1 kHz 音訊串流。或者,可以匯出帶或不帶列印 metadata 的 pal8 16 色視訊串流。

它接受以下選項

noise_reduction

套用簡單的低通濾波器。可以是 1(開啟)或 0(關閉)。預設值為 0。

reverb_depth

設定殘響量。範圍 0-100。預設值為 0。

reverb_delay

設定延遲時間,單位為毫秒,限制在 40-250 毫秒之間。預設值為 0。

bass_amount

套用低音擴展,又稱 XBass 或 megabass。範圍為 0(安靜)到 100(響亮)。預設值為 0。

bass_range

設定截止頻率,即低音頻率的上限。範圍為 10-100 Hz。預設值為 0。

surround_depth

套用 Dolby Pro-Logic 環繞音效。範圍為 0(安靜)到 100(強烈)。預設值為 0。

surround_delay

設定環繞延遲時間,單位為毫秒,限制在 5-40 毫秒之間。預設值為 0。

max_size

解多工器將整個檔案緩衝到記憶體中。調整此值以設定最大緩衝區大小,這反過來會成為可讀取檔案大小的上限。範圍為 0 到 100 MiB。0 移除緩衝區大小限制(不建議)。預設值為 5 MiB。

video_stream_expr

字串,使用 eval API 評估以將顏色指派給產生的視訊串流。可用的變數為 xywhtspeedtempoorderpatternrow

video_stream

產生視訊串流。可以是 1(開啟)或 0(關閉)。預設值為 0。

video_stream_w

設定視訊幀寬度,單位為 'chars',其中一個 char 表示 8 像素。範圍為 20-512。預設值為 30。

video_stream_h

設定視訊幀高度,單位為 'chars',其中一個 char 表示 8 像素。範圍為 20-512。預設值為 30。

video_stream_ptxt

在視訊串流上列印 metadata。包含 speedtempoorderpatternrowts(時間,單位為毫秒)。可以是 1(開啟)或 0(關閉)。預設值為 1。

3.16 libopenmpt

基於 libopenmpt 的模組解多工器

如需更多資訊,請參閱 https://lib.openmpt.org/libopenmpt/

有些檔案有多個子歌曲(音軌),可以使用 subsong 選項設定。

它接受以下選項

subsong

設定子歌曲索引。可以是 'all'、'auto' 或子歌曲的索引。子歌曲索引從 0 開始。預設值為 'auto'。

預設值是讓 libopenmpt 選擇。

layout

設定聲道佈局。有效值為 1、2 和 4 聲道佈局。預設值為 STEREO。

sample_rate

設定 libopenmpt 輸出的取樣率。範圍從 1000 到 INT_MAX。預設值為 48000。

3.17 mov/mp4/3gp

Quicktime 檔案格式和 ISO/IEC 基礎媒體檔案格式(ISO/IEC 14496-12 或 MPEG-4 Part 12、ISO/IEC 15444-12 或 JPEG 2000 Part 12)的解多工器。

已註冊的副檔名:mov, mp4, m4a, 3gp, 3g2, mj2, psp, m4b, ism, ismv, isma, f4v

3.17.1 選項

此解復用器接受以下選項

enable_drefs

啟用載入外部音軌,預設為停用。在某些使用情況下,啟用此功能可能會洩漏資訊。

use_absolute_path

允許透過絕對路徑載入外部音軌,預設為停用。啟用此功能會帶來安全風險。僅當來源已知為非惡意時才應啟用。

seek_streams_individually

搜尋時,個別識別每個串流中的最近點,並從識別點解多工處理該串流中的封包。與從頭線性解多工處理相比,這可能會導致不同的封包序列。預設值為 true。

ignore_editlist

忽略任何編輯列表原子。解多工器預設會修改串流索引,以反映編輯列表描述的時間軸。預設值為 false。

advanced_editlist

修改串流索引以反映編輯列表描述的時間軸。ignore_editlist 必須設定為 false,此選項才能生效。如果 ignore_editlist 和此選項都設定為 false,則僅修改串流索引的開頭,以反映編輯列表描述的初始停留時間或開始時間戳記。預設值為 true。

ignore_chapters

不要解析章節。這包括 GoPro 'HiLight' 標籤/時刻。請注意,僅當輸入可搜尋時才會解析章節。預設值為 false。

use_mfra_for

對於可搜尋的片段化輸入,如果存在媒體片段隨機存取盒,則從該盒設定片段的起始時間戳記。

提供以下選項

auto

自動偵測是否將 mfra 時間戳記設定為 PTS 或 DTS (預設)

dts

將 mfra 時間戳記設定為 DTS

pts

將 mfra 時間戳記設定為 PTS

0

不要使用 mfra 盒來設定時間戳記

use_tfdt

對於片段化輸入,將片段的起始時間戳記設定為來自 tfdt 盒的 baseMediaDecodeTime。預設為啟用,這將優先使用 tfdt 盒來設定 DTS。停用以使用來自 sidx 盒的 earliest_presentation_time。在任一種情況下,如果 mfra 盒可用且 use_mfra_for 設定為 pts 或 dts,則會使用來自 mfra 盒的時間戳記。

export_all

udta 盒中無法識別的盒匯出為 metadata 條目。盒類型的頭四個字元會設定為鍵。預設值為 false。

export_xmp

XMP_ 盒和 uuid 盒的完整內容匯出為字串,鍵為 xmp。請注意,如果設定了 export_all 但未設定此選項,XMP_ 盒的內容仍會匯出,但鍵為 XMP_。預設值為 false。

activation_bytes

解密 Audible AAX 和 AAX+ 檔案所需的 4 位元組金鑰。請參閱下方的 Audible AAX 小節。

audible_fixed_key

用於處理 Audible AAX/AAX+ 檔案的固定金鑰。它已預先設定,因此應無需指定。

decryption_key

16 位元組金鑰,以十六進位表示,用於解密使用 ISO 通用加密 (CENC/AES-128 CTR; ISO/IEC 23001-7) 加密的檔案。

max_stts_delta

在 trak 的 stts 盒中寫入的極高取樣增量偶爾可能是故意的,但通常是錯誤寫入,或在視為帶符號 32 位元整數時,用於儲存 dts 校正的負值。此選項讓使用者設定上限,超過此上限時,增量會限制為 1。如果值大於限制,當轉換為 int32 時為負數,則會用於調整後續的 dts。

單位為音軌時間刻度。範圍為 0 到 UINT_MAX。預設值為 UINT_MAX - 48000*10,這允許 48 kHz 音訊串流最多 10 秒的 dts 校正,同時容納 99.9% 的 uint32 範圍。

interleaved_read

在解多工器層級交錯來自多個音軌的封包。對於交錯不佳的檔案,這可以防止由於不同音軌中封包之間存在較大間隙而導致的播放問題,因為 MOV/MP4 沒有封包放置要求。但是,這可能會導致在交錯非常差的檔案上進行過多的搜尋,因為需要在音軌之間搜尋,因此停用它可能會防止 I/O 問題,但會犧牲播放效能。

3.17.2 Audible AAX

Audible AAX 檔案是加密的 M4B 檔案,可以透過指定 4 位元組的啟動密碼來解密。

ffmpeg -activation_bytes 1CEB00DA -i test.aax -vn -c:a copy output.mp4

3.18 mpegts

MPEG-2 傳輸串流解多工器。

此解復用器接受以下選項

resync_size

設定查找新同步訊號的大小限制。預設值為 65536。

skip_unknown_pmt

跳過 PAT 中未定義的程式之 PMT。預設值為 0。

fix_teletext_pts

使用從第一個程式的 PCR 計算的時間戳記覆寫圖文電視封包 PTS 和 DTS 值,該程式是圖文電視串流的一部分且未被捨棄。預設值為 1,如果您希望圖文電視封包 PTS 和 DTS 值保持不變,請將此選項設定為 0。

ts_packetsize

輸出選項,攜帶原始封包大小(以位元組為單位)。顯示偵測到的原始封包大小,使用者無法設定。

scan_all_pmts

掃描並合併所有 PMT。該值是一個整數,值從 -1 到 1(-1 表示自動設定,1 表示啟用,0 表示停用)。預設值為 -1。

merge_pmt_versions

當 PMT 的版本更新且基本串流移動到不同的 PID 時,重複使用現有串流。預設值為 0。

max_packet_size

設定解多工器發出的封包最大大小,單位為位元組。超出此大小的有效負載會分割到多個封包中。範圍為 1 到 INT_MAX/2。預設值為 204800 位元組。

3.19 mpjpeg

封裝在多部分 MIME 中的 MJPEG 解多工器。

此解多工器允許讀取 MJPEG,其中每個幀都表示為 multipart/x-mixed-replace 串流的一部分。

strict_mime_boundary

預設實作對多部分 MIME 邊界偵測應用較寬鬆的標準,以防止許多現有端點未產生正確的 MIME MJPEG 串流而導致回歸。透過將此選項設定為 1 來開啟它,將導致對邊界值進行更嚴格的檢查。

3.20 rawvideo

原始視訊解多工器。

此解多工器允許讀取原始視訊資料。由於沒有標頭指定假設的視訊參數,使用者必須指定它們才能正確解碼資料。

此解復用器接受以下選項

framerate

設定輸入視訊幀率。預設值為 25。

pixel_format

設定輸入視訊像素格式。預設值為 yuv420p

video_size

設定輸入視訊大小。此值必須明確指定。

例如,若要使用 ffplay 讀取原始視訊檔案 input.raw,假設像素格式為 rgb24、視訊大小為 320x240,且幀率為每秒 10 個影像,請使用以下命令

ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -framerate 10 input.raw

3.21 rcwt

RCWT(Raw Captions With Time,帶時間戳記的原始字幕)是 ccextractor 的原生格式,ccextractor 是一個常用的開放原始碼工具,用於處理 608/708 隱藏式字幕 (CC) 來源。如需更多關於此格式的資訊,請參閱 (ffmpeg-formats)rcwtenc

此解多工器實作截至 2024 年 3 月的規格,該規格自 2014 年 4 月以來一直保持穩定且未變更。

3.21.1 範例

  • 使用內建解碼器將 CC 渲染為 ASS
    ffmpeg -i CC.rcwt.bin CC.ass
    

    請注意,如果您的輸出顯示為空白,您可能必須手動設定解碼器的 data_field 選項,以選擇所需的 CC 子串流。

  • 將 RCWT 備份轉換為 Scenarist (SCC) 格式
    ffmpeg -i CC.rcwt.bin -c:s copy CC.scc
    

    請注意,SCC 格式不支援所有可能儲存在 RCWT 中的 CC 擴展(例如 EIA-708)。

3.22 sbg

SBaGen 腳本解多工器。

此解多工器讀取 SBaGen http://uazu.net/sbagen/ 使用的腳本語言,以產生雙耳節拍會話。SBG 腳本如下所示

-SE
a: 300-2.5/3 440+4.5/0
b: 300-2.5/0 440+4.5/3
off: -
NOW      == a
+0:07:00 == b
+0:14:00 == a
+0:21:00 == b
+0:30:00    off

SBG 腳本可以混合絕對和相對時間戳記。如果腳本僅使用絕對時間戳記(包括腳本開始時間)或僅使用相對時間戳記,則其佈局是固定的,並且轉換很簡單。另一方面,如果腳本混合使用這兩種時間戳記,則相對時間戳記的 NOW 參考將取自讀取腳本時的當前時間,並且腳本佈局將根據該參考凍結。這表示如果直接播放腳本,則實際時間將與絕對時間戳記匹配,直到聲音控制器的時鐘精度,但如果使用者以某種方式暫停播放或搜尋,則所有時間都會相應地偏移。

3.23 tedcaptions

用於 TED Talks 的 JSON 字幕。

TED 未提供字幕連結,但可以從頁面推測出來。FFmpeg 原始碼樹中的檔案 tools/bookmarklets.html 包含一個 bookmarklet 以顯示它們。

此解復用器接受以下選項

start_time

設定 TED 演講的開始時間,單位為毫秒。預設值為 15000(15 秒)。它用於將字幕與可下載的視訊同步,因為它們包含 15 秒的簡介。

範例:將字幕轉換為大多數播放器都能理解的格式

ffmpeg -i http://www.ted.com/talks/subtitles/id/1/lang/en talk1-en.srt

3.24 vapoursynth

Vapoursynth 包裝器。

由於安全考量,Vapoursynth 腳本將不會自動偵測,因此必須強制輸入格式。對於 ff* CLI 工具,請在輸入 -i yourscript.vpy 之前新增 -f vapoursynth

此解復用器接受以下選項

max_script_size

解多工器將整個腳本緩衝到記憶體中。調整此值以設定最大緩衝區大小,這反過來會成為可讀取腳本大小的上限。預設值為 1 MiB。

3.25 w64

Sony Wave64 音訊解多工器。

此解復用器接受以下選項

max_size

請參閱 wav 解多工器的相同選項。

3.26 wav

RIFF Wave 音訊解多工器。

此解復用器接受以下選項

max_size

指定解多工處理的封包之最大封包大小(以位元組為單位)。預設情況下,此值設定為 0,這表示會根據輸入格式選擇一個合理的數值。

4 復用器

多工器是 FFmpeg 中已設定的元素,可讓您將多媒體串流寫入特定類型的檔案。

當您設定 FFmpeg 建置時,所有支援的多工器預設為啟用。您可以使用組態選項 --list-muxers 列出所有可用的多工器。

您可以使用組態選項 --disable-muxers 停用所有多工器,並使用選項 --enable-muxer=MUXER / --disable-muxer=MUXER 選擇性地啟用/停用單個多工器。

ff* 工具的選項 -muxers 將顯示已啟用的多工器列表。使用 -formats 來檢視已啟用的解多工器和多工器的合併列表。

以下是一些目前可用的多工器說明。

4.1 原始復用器

本節涵蓋原始多工器。它們接受與指定編解碼器匹配的單個串流。它們不儲存時間戳記或 metadata。除非另有說明,否則已識別的副檔名與多工器名稱相同。

它包含以下多工器。媒體類型和最終用於從輸出副檔名自動選擇多工器的副檔名也會顯示。

ac3 audio

Dolby Digital,也稱為 AC-3。

adx audio

CRI Middleware ADX 音訊。

當輸出可搜尋且計數可以儲存在 32 位元中時,此多工器將在第一個封包的開頭附近寫出總取樣計數。

aptx audio

aptX(藍牙音訊處理技術)

aptx_hd audio (aptxdh)

aptX HD(藍牙音訊處理技術)音訊

avs2 video (avs, avs2)

AVS2-P2(音視訊標準 - 第二代 - 第 2 部分)/ IEEE 1857.4 視訊

avs3 video (avs3)

AVS3-P2(音視訊標準 - 第三代 - 第 2 部分)/ IEEE 1857.10 視訊

cavsvideo video (cavs)

中國 AVS(音視訊標準 - 第一代)

codec2raw audio

Codec 2 音訊。

未註冊副檔名,因此必須提供格式名稱,例如使用 ffmpeg CLI 工具 -f codec2raw

data any

通用資料多工器。

此多工器接受具有任何類型編解碼器的單個串流。必須使用 ffmpeg CLI 工具的 -map 選項選擇輸入串流。

未註冊副檔名,因此必須提供格式名稱,例如使用 ffmpeg CLI 工具 -f data

dfpwm audio (dfpwm)

原始 DFPWM1a(動態濾波脈衝寬度調變)音訊多工器。

dirac video (drc, vc2)

BBC Dirac 視訊。

Dirac Pro 編解碼器是子集,並標準化為 SMPTE VC-2。

dnxhd video (dnxhd, dnxhr)

Avid DNxHD 視訊。

它已標準化為 SMPTE VC-3。接受 DNxHR 串流。

dts audio

DTS Coherent Acoustics (DCA) 音訊

eac3 audio

Dolby Digital Plus,也稱為 Enhanced AC-3

evc video (evc)

MPEG-5 Essential Video Coding (EVC) / EVC / MPEG-5 Part 1 EVC 視訊

g722 audio

ITU-T G.722 音訊

g723_1 audio (tco, rco)

ITU-T G.723.1 音訊

g726 audio

ITU-T G.726 big-endian(「靠左對齊」)音訊。

未註冊副檔名,因此必須提供格式名稱,例如使用 ffmpeg CLI 工具 -f g726

g726le audio

ITU-T G.726 little-endian(「靠右對齊」)音訊。

未註冊副檔名,因此必須提供格式名稱,例如使用 ffmpeg CLI 工具 -f g726le

gsm audio

行動通訊全球系統音訊

h261 video

ITU-T H.261 視訊

h263 video

ITU-T H.263 / H.263-1996、H.263+ / H.263-1998 / H.263 第 2 版視訊

h264 video (h264, 264)

ITU-T H.264 / MPEG-4 Part 10 AVC 視訊。如果位元串流處於長度前綴模式,則應轉換為 Annex B 語法。

hevc video (hevc, h265, 265)

ITU-T H.265 / MPEG-H Part 2 HEVC 視訊。如果位元串流處於長度前綴模式,則應轉換為 Annex B 語法。

m4v video

MPEG-4 Part 2 視訊

mjpeg video (mjpg, mjpeg)

Motion JPEG 視訊

mlp audio

Meridian Lossless Packing,也稱為 Packed PCM

mp2 audio (mp2, m2a, mpa)

MPEG-1 Audio Layer II 音訊

mpeg1video video (mpg, mpeg, m1v)

MPEG-1 Part 2 視訊。

mpeg2video video (m2v)

ITU-T H.262 / MPEG-2 Part 2 視訊

obu video

AV1 低負荷 Open Bitstream Units 多工器。

時間分隔符號 OBU 將插入串流的所有時間單位中。

rawvideo video (yuv, rgb)

原始未壓縮視訊。

sbc audio (sbc, msbc)

藍牙 SIG 低複雜度子頻帶編解碼器音訊

truehd audio (thd)

Dolby TrueHD 音訊

vc1 video

SMPTE 421M / VC-1 視訊

4.1.1 範例

  • 使用 ffmpeg 以 ‘rawvideo’ 多工器儲存原始視訊幀
    ffmpeg -f lavfi -i testsrc -t 10 -s hd1080p testsrc.yuv
    

    由於 rawvideo 多工器不儲存與大小和格式相關的資訊,因此在解多工處理檔案時必須提供此資訊

    ffplay -video_size 1920x1080 -pixel_format rgb24 -f rawvideo testsrc.rgb
    

4.2 原始 PCM 復用器

本節涵蓋原始 PCM(脈衝碼調變)音訊多工器。

它們接受與指定編解碼器匹配的單個串流。它們不儲存時間戳記或 metadata。已識別的副檔名與多工器名稱相同。

它包含以下多工器。用於從輸出副檔名自動選擇多工器的選用附加副檔名也顯示在括號中。

alaw (al)

PCM A-law

f32be

PCM 32 位元浮點 big-endian

f32le

PCM 32 位元浮點 little-endian

f64be

PCM 64 位元浮點 big-endian

f64le

PCM 64 位元浮點 little-endian

mulaw (ul)

PCM mu-law

s16be

PCM 帶符號 16 位元 big-endian

s16le

PCM 帶符號 16 位元 little-endian

s24be

PCM 帶符號 24 位元 big-endian

s24le

PCM 帶符號 24 位元 little-endian

s32be

PCM 帶符號 32 位元 big-endian

s32le

PCM 帶符號 32 位元 little-endian

s8 (sb)

PCM 簽名 8 位元

u16be

PCM 無符號 16 位元 big-endian

u16le

PCM 無符號 16 位元 little-endian

u24be

PCM 無符號 24 位元 big-endian

u24le

PCM 無符號 24 位元 little-endian

u32be

PCM 無符號 32 位元 big-endian

u32le

PCM 無符號 32 位元 little-endian

u8 (ub)

PCM 無符號 8 位元

vidc

PCM Archimedes VIDC

4.3 MPEG-1/MPEG-2 程式流復用器

本節涵蓋屬於 MPEG-1 和 MPEG-2 系統系列的格式。

MPEG-1 系統格式(也稱為 ISO/IEEC 11172-1 或 MPEG-1 程式流)已被採用為儲存在 VCD(影音光碟)中的媒體軌格式。

MPEG-2 系統標準(也稱為 ISO/IEEC 13818-1)涵蓋兩種容器格式,一種稱為傳輸流,另一種稱為程式流;此處僅涵蓋後者。

MPEG-2 程式流格式(也稱為 VOB,因為其對應的檔案副檔名)是 MPEG-1 程式流的擴展:除了支援音訊和視訊流的不同編解碼器外,它還儲存字幕和導航元數據。MPEG-2 程式流已被採用於在 SVCD 和 DVD 儲存裝置中儲存媒體流。

本節包含以下多工器。

mpeg (mpg,mpeg)

MPEG-1 系統 / MPEG-1 程式流多工器。

vcd

MPEG-1 系統 / MPEG-1 程式流 (VCD) 多工器。

此多工器可用於產生 VCD(影音光碟)儲存裝置接受的格式的軌跡。

它與 ‘mpeg’ 多工器相同,但有一些差異。

vob

MPEG-2 程式流 (VOB) 多工器。

dvd

MPEG-2 程式流 (DVD VOB) 多工器。

此多工器可用於產生 DVD(數位多功能光碟)儲存裝置接受的格式的軌跡。

它與 ‘vob’ 多工器相同,但有一些差異。

svcd (vob)

MPEG-2 程式流 (SVCD VOB) 多工器。

此多工器可用於產生 SVCD(超級影音光碟)儲存裝置接受的格式的軌跡。

它與 ‘vob’ 多工器相同,但有一些差異。

4.3.1 選項

muxrate rate

設定使用者定義的多工率,以位元/秒為單位表示。如果未指定,則採用自動計算的多工率。預設值為 0

preload delay

設定初始解多工-解碼延遲,以微秒為單位。預設值為 500000

4.4 MOV/MPEG-4/ISOMBFF 復用器

本節涵蓋屬於 QuickTime / MOV 系列的格式,包括 MPEG-4 Part 14 格式和 ISO 基礎媒體檔案格式 (ISOBMFF)。這些格式共享一個基於 ISO 基礎媒體檔案格式 (ISOBMFF) 的通用結構。

MOV 格式最初是為與 Apple QuickTime 一起使用而開發的。它後來被用作 MPEG-4 Part 1(後來的 Part 14)格式的基礎,也稱為 ISO/IEC 14496-1。然後,該格式被概括為 ISOBMFF,也稱為 MPEG-4 Part 12 格式、ISO/IEC 14496-12 或 ISO/IEC 15444-12。

它包含以下多工器。

3gp

第三代合作夥伴計畫 (3GPP) 格式,適用於 3G UMTS 多媒體服務

3g2

第三代合作夥伴計畫 2 (3GP2 或 3GPP2) 格式,適用於 3G CDMA2000 多媒體服務,類似於 ‘3gp’,但具有擴展和限制

f4v

Adobe Flash 視訊格式

ipod

MPEG-4 音訊檔案格式,與 MOV/MP4 類似,但僅限於包含音訊流,通常與 Apple ipod 裝置一起播放

ismv

Microsoft IIS(網際網路資訊服務)Smooth Streaming 音訊/視訊(ISMV 或 ISMA)格式。這基於 MPEG-4 Part 14 格式,但有一些不相容的變體,用於串流 Microsoft IIS 伺服器的媒體檔案。

mov

QuickTime 播放器格式,由 .mov 副檔名識別

mp4

MP4 或 MPEG-4 Part 14 格式

psp

PlayStation Portable MP4/MPEG-4 Part 14 格式變體。這基於 MPEG-4 Part 14 格式,但有一些不相容的變體,用於在 PlayStation 裝置上播放檔案。

4.4.1 分段

mov’、‘mp4’ 和 ‘ismv’ 多工器支援片段化。通常,MOV/MP4 檔案將所有封包的元數據儲存在一個位置。

此資料通常寫在檔案末尾,但可以移動到開頭以獲得更好的播放效果,方法是在 -movflags 中加入 +faststart,或使用 qt-faststart 工具)。

片段化檔案由許多片段組成,其中封包和有關這些封包的元數據儲存在一起。寫入片段化檔案的優點是,即使寫入中斷,檔案也是可解碼的(而普通的 MOV/MP4 如果未正確完成則無法解碼),並且在寫入非常長的檔案時需要的記憶體更少(因為寫入普通的 MOV/MP4 檔案會將有關每個封包的資訊儲存在記憶體中,直到檔案關閉)。缺點是與其他應用程式的相容性較差。

片段化透過設定定義如何將檔案切割成片段的選項之一來啟用

frag_duration
frag_size
min_frag_duration
movflags +frag_keyframe
movflags +frag_custom

如果指定了多個條件,則當滿足其中一個指定條件時,片段將被切割。此規則的例外是 min_frag_duration 選項,必須先滿足此選項,其他任何條件才能適用。

4.4.2 選項

brand brand_string

覆寫主要品牌。

empty_hdlr_name bool

啟用以跳過在 hdlr 盒中寫入名稱。預設值為 false

encryption_key key

以十六進位格式設定媒體加密金鑰

encryption_kid kid

以十六進位格式設定媒體加密金鑰識別碼

encryption_scheme scheme

設定加密方案,允許的值為 ‘none’ 和 ‘cenc-aes-ctr

frag_duration duration

建立長度為 duration 微秒的片段。

frag_interleave number

在片段內交錯樣本(最大連續樣本數,數值越低表示交錯越緊密,但開銷越大。預設設定為 0

frag_size size

建立最多包含 size 位元組有效負載資料的片段

iods_audio_profile profile

指定音訊設定檔原子 (atom) 的 iods 數字(從 -1 到 255),預設值為 -1

iods_video_profile profile

指定視訊設定檔原子 (atom) 的 iods 數字(從 -1 到 255),預設值為 -1

ism_lookahead num_entries

指定 ISM 檔案的預讀項目數(從 0 到 255),預設值為 0

min_frag_duration duration

不要建立短於 duration 微秒的片段

moov_size bytes

在檔案開頭為 moov 原子保留空間,而不是將 moov 原子放在結尾。如果保留的空間不足,多工處理將會失敗。

mov_gamma gamma

指定 gama 原子的伽瑪值(十進制數字,從 0 到 10),預設值為 0.0,必須與 + movflags 一起設定

movflags flags

設定各種多工開關。可以使用以下標誌

cmaf

寫入 CMAF(通用媒體應用程式格式)相容的片段化 MP4 輸出

dash

寫入 DASH(透過 HTTP 的動態自適應串流)相容的片段化 MP4 輸出

default_base_moof

與 ‘omit_tfhd_offset’ 標誌類似,此標誌避免在 tfhd 原子中寫入絕對 base_data_offset 欄位,而是使用新的 default-base-is-moof 標誌。此標誌是 14496-12:2012 的新增功能。這可能會在某些情況下使片段更容易解析(避免將軌跡片段位置計算基於前一個軌跡片段的隱式結尾)。

delay_moov

延遲寫入初始 moov,直到第一個片段被切割,或直到第一次片段刷新

disable_chpl

停用 Nero 章節標記(chpl 原子)。通常,Nero 章節和 QuickTime 章節軌跡都會寫入檔案。設定此選項後,只會寫入 QuickTime 章節軌跡。當使用某些標記程式(例如 mp3Tag 2.61a 和 iTunes 11.3,很可能其他版本也會受到影響)重新處理檔案時,Nero 章節可能會導致失敗。

faststart

執行第二次傳輸,將索引(moov 原子)移動到檔案的開頭。此操作可能需要一段時間,並且在各種情況下(例如片段化輸出)無法運作,因此預設情況下未啟用。

frag_custom

允許呼叫者透過呼叫 av_write_frame(ctx, NULL) 來手動選擇何時切割片段,以寫入到目前為止寫入的封包的片段。(這僅在使用整合 libavformat 的其他應用程式時才有用,而非從 ffmpeg。)

frag_discont

發出訊號,表示下一個片段與先前的片段不連續

frag_every_frame

在每個影格處片段化

frag_keyframe

在每個視訊關鍵影格處開始一個新片段

global_sidx

在檔案開頭寫入全域 sidx 索引

isml

建立即時 Smooth Streaming 饋送(用於推送到發佈點)

negative_cts_offsets

啟用 CTTS 盒的版本 1 的使用,其中 CTS 偏移可以是負數。這使初始樣本的 DTS/CTS 可以為零,並減少了在某些情況下(例如具有 B 影格的視訊軌跡)對編輯列表的需求。此外,簡化了與 DASH-IF 互通性指南的一致性。

在寫入 ‘ismv’ (Smooth Streaming) 檔案時,此選項會隱式設定。

omit_tfhd_offset

不要在 tfhd 原子中寫入任何絕對 base_data_offset。這避免了將片段繫結到檔案/串流中的絕對位元組位置。

prefer_icc

如果寫入 colr 原子,則優先使用 ICC 設定檔(如果它存在於串流封包側資料中)。

rtphint

將 RTP 提示軌跡新增至輸出檔案

separate_moof

為每個軌跡寫入單獨的 moof(電影片段)原子。通常,所有軌跡的封包都寫入一個 moof 原子(這稍微有效率),但設定此選項後,多工器會為每個軌跡寫入一個 moof/mdat 對,使其更容易分離軌跡。

skip_sidx

跳過寫入 sidx 原子。當 sidx 原子導致的位元率開銷很高時,此選項可用於 sidx 原子不是強制性的情況。當啟用 ‘global_sidx’ 標誌時,將忽略此選項。

skip_trailer

跳過為片段化檔案寫入 mfra/tfra/mfro 尾部

use_metadata_tags

使用 mdta 原子作為元數據

write_colr

即使未指定色彩資訊,也寫入 colr 原子。此標誌是實驗性的,可能會重新命名或變更,請勿從腳本中使用。

write_gama

寫入已棄用的 gama 原子

hybrid_fragmented

為了可恢復性 - 將輸出檔案寫入為片段化檔案。這允許在寫入時讀取中間檔案(特別是,如果寫入過程不乾淨地中止)。寫入完成後,檔案會轉換為常規的非片段化檔案,它更相容,並允許更輕鬆和更快速地搜尋。

如果寫入中止,則可以手動重新多工處理中間檔案,以取得已寫入未完成檔案的常規非片段化檔案。

movie_timescale scale

設定寫入電影標頭盒 (mvhd) 中的時間刻度。範圍為 1 到 INT_MAX。預設值為 1000

rtpflags flags

將 RTP 提示軌跡新增至輸出檔案。

可以使用以下標誌

h264_mode0

將模式 0 用於 RTP 中的 H.264

latm

將 MP4A-LATM 封包化用於 AAC,而不是 MPEG4-GENERIC

rfc2190

將 RFC 2190 封包化用於 H.263,而不是 RFC 4629

send_bye

完成時傳送 RTCP BYE 封包

skip_rtcp

不傳送 RTCP 傳送者報告

skip_iods bool

跳過寫入 iods 原子(預設值為 true

use_editlist bool

使用編輯列表(預設值為 auto

use_stream_ids_as_track_ids bool

使用串流 ID 作為軌跡 ID(預設值為 false

video_track_timescale scale

設定用於視訊軌跡的時間刻度。範圍為 0 到 INT_MAX。如果設定為 0,則時間刻度會根據原生串流時基自動設定。預設值為 0

write_btrt bool

強制或停用在軌跡的 stsd 盒內寫入位元率盒。該盒包含解碼緩衝區大小(以位元組為單位)、最大位元率和軌跡的平均位元率。如果無法計算這些值,則將跳過該盒。預設值為 -1auto,僅在 MP4 模式下寫入該盒。

write_prft option

寫入生產者時間參考盒 (PRFT),並為 PRFT 盒中的 NTP 欄位指定時間來源。將值設定為 ‘wallclock’ 以指定時間來源為掛鐘時間,將值設定為 ‘pts’ 以指定時間來源為輸入封包的 PTS 值。

write_tmcd bool

指定 on 以強制寫入時間碼軌跡,指定 off 以停用它,指定 auto 以僅為 mov 和 mp4 輸出寫入時間碼軌跡(預設)。

將值設定為 ‘pts’ 僅適用於即時編碼用例,其中 PTS 值設定為來源的掛鐘時間。例如,使用 decklink 擷取來源的編碼用例,其中 video_ptsaudio_pts 設定為 ‘abs_wallclock’。

4.4.3 範例

  • 使用 ‘ismv’ 多工器和 ffmpeg 將 Smooth Streaming 內容即時推送到 IIS 上的發佈點
    ffmpeg -re <normal input/transcoding options> -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
    

4.5 a64

A64 Commodore 64 視訊多工器。

此多工器接受單個 a64_multia64_multi5 編解碼器視訊流。

4.6 ac4

原始 AC-4 音訊多工器。

此多工器接受單個 ac4 音訊流。

4.6.1 選項

write_crc bool

啟用後,將每個封包的 CRC 檢查碼寫入輸出,預設值為 false

4.7 adts

音訊資料傳輸串流多工器。

它接受單個 AAC 串流。

4.7.1 選項

write_id3v2 bool

啟用以在串流開始時寫入 ID3v2.4 標籤。預設為停用。

write_apetag bool

啟用以在串流結尾寫入 APE 標籤。預設為停用。

write_mpeg2 bool

啟用以在 ADTS 影格標頭中將 MPEG 版本位元設定為 1,這表示 MPEG-2。預設值為 0,表示 MPEG-4。

4.8 aea

MD STUDIO 音訊多工器。

此多工器接受具有一個或兩個聲道且取樣率為 44100Hz 的單個 ATRAC1 音訊流。

由於 AEA 支援儲存軌跡標題,因此此多工器也會將串流元數據中的標題寫入容器。

4.9 aiff

音訊交換檔案格式多工器。

4.9.1 選項

write_id3v2 bool

設定為 1 時,啟用 ID3v2 標籤寫入。預設值為 0(停用)。

id3v2_version bool

選擇要寫入的 ID3v2 版本。目前僅支援版本 3 和 4(又名 ID3v2.3 和 ID3v2.4)。預設版本為 4。

4.10 alp

High Voltage Software 的 Lego Racers 遊戲音訊多工器。

它接受單個 ADPCM_IMA_ALP 串流,聲道不超過 2 個,取樣率不超過 44100 Hz。

副檔名:tunpcm

4.10.1 選項

type type

設定檔案類型。

type 接受以下值

tun

將檔案類型設定為音樂。必須具有 22050 Hz 的取樣率。

pcm

將檔案類型設定為 sfx。

auto

依輸出檔案副檔名設定檔案類型。.pcm 會產生類型 pcm,否則設定類型 tun(預設)

4.11 amr

3GPP AMR(自適應多速率)音訊多工器。

它接受包含 AMR NB 串流的單個音訊串流。

4.12 amv

AMV (Actions Media Video) 格式多工器。

4.13 apm

Ubisoft Rayman 2 APM 音訊多工器。

它接受單個 ADPCM IMA APM 音訊串流。

4.14 apng

動畫可攜式網路圖形多工器。

它接受單個 APNG 視訊串流。

4.14.1 選項

final_delay delay

強制在每次重複的最後一個影格後延遲指定秒數。預設值為 0.0

plays repetitions

指定播放內容的次數,0 會導致無限循環,而 1 則不循環

4.14.2 範例

  • 使用 ffmpeg 生成具有 2 次重複的 APNG 輸出,並在第一次重複後延遲半秒
    ffmpeg -i INPUT -final_delay 0.5 -plays 2 out.apng
    

4.15 argo_asf

Argonaut Games ASF 音訊多工器。

它接受單個 ADPCM 音訊串流。

4.15.1 選項

version_major version

覆寫檔案主要版本,指定為整數,預設值為 2

version_minor version

覆寫檔案次要版本,指定為整數,預設值為 1

name name

將檔案名稱嵌入檔案中,如果未指定,則使用輸出檔案名稱。名稱會被截斷為 8 個字元。

4.16 argo_cvg

Argonaut Games CVG 音訊多工器。

它接受單個單聲道 ADPCM 22050Hz 音訊串流。

loopreverb 選項設定標頭中的對應標誌,稍後可以檢索這些標誌以相應地處理音訊串流。

4.16.1 選項

skip_rate_check bool

跳過取樣率檢查(預設值為 false

loop bool

設定循環標誌(預設值為 false

reverb boolean

設定迴響標誌(預設值為 true

4.17 asf, asf_stream

進階/主動系統(或串流)格式音訊多工器。

串流應選擇 ‘asf_stream’ 變體。

請注意,Windows Media Audio (wma) 和 Windows Media Video (wmv) 也使用此多工器。

4.17.1 選項

packet_size size

將多工器封包大小設定為位元組數。透過調整此設定,您可以減少資料片段化或多工器開銷,具體取決於您的來源。預設值為 3200,最小值為 100,最大值為 64Ki

4.18 ass

ASS/SSA (SubStation Alpha) 字幕多工器。

它接受單個 ASS 字幕串流。

4.18.1 選項

ignore_readorder bool

立即寫入對話事件,即使它們是亂序的,預設值為 false,否則它們會被快取,直到找到預期的時間事件。

4.19 ast

AST (音訊串流) 多工器。

此格式用於在某些 Nintendo Wii 遊戲上播放音訊。

它接受單個音訊串流。

loopstartloopend 選項可用於定義檔案的循環區段,以供支援此類選項的播放器使用。

4.19.1 選項

loopstart start

指定循環開始位置,以毫秒為單位表示,範圍從 -1INT_MAX,如果設定為 -1,則不指定循環(預設值 -1),並且忽略 loopend 值。

loopend end

指定循環結束位置,以毫秒為單位表示,範圍從 0INT_MAX,預設值為 0,如果設定為 0,則假設為串流總持續時間。

4.20 au

SUN AU 音訊多工器。

它接受單個音訊串流。

4.21 avi

音訊視訊交錯多工器。

AVI 是 Microsoft 開發的專有格式,後來透過 Open DML 規範正式指定。

由於播放器實作的差異,可能需要設定一些選項,以確保產生的輸出可以被目標播放器正確播放。

4.21.1 選項

flipped_raw_rgb bool

如果設定為 true,則為原始 RGB 位圖儲存正高度,這表示位圖是以由下而上的方式儲存的。請注意,此選項不會翻轉位圖,必須事先手動完成翻轉,例如使用 ‘vflip’ 濾鏡。預設值為 false,表示位圖是以由上而下的方式儲存的。

reserve_index_space size

在檔案標頭中為每個串流的 OpenDML 主索引保留指定的位元組數。預設情況下,如果第一個主索引中沒有剩餘空間,則額外的主索引會嵌入在資料封包中,並連結為索引鏈。此索引結構可能會對某些用例造成問題,例如,第三方軟體嚴格依賴 OpenDML 索引規範,或檔案搜尋速度緩慢時。在檔案標頭中保留足夠的索引空間可以避免這些問題。

所需的索引空間取決於輸出檔案大小,應約為每 GB 16 位元組。當省略此選項或設定為零時,將猜測必要的索引空間。

預設值為 0

write_channel_mask bool

將聲道佈局遮罩寫入音訊串流標頭。

預設情況下啟用此選項。停用聲道遮罩在特定情況下可能很有用,例如,為了與僅支援 AVI 中單個音訊串流的軟體相容而將多個音訊串流合併為一個時(請參閱 (ffmpeg-filters)ffmpeg-filters 手冊中的 "amerge" 章節)。

4.22 avif

AV1 (開放媒體視訊編解碼器 1) 影像格式多工器。

此多工器儲存使用 AV1 編解碼器編碼的影像。

它接受一個或兩個視訊串流。如果提供兩個視訊串流,則第二個串流應包含儲存 Alpha 遮罩的單個平面。

如果提供多個影像,則產生的輸出被視為動畫 AVIF,並且可以使用 loop 選項指定循環次數。

這基於開放媒體聯盟在 URL https://aomediacodec.github.io/av1-avif 的規範。

4.22.1 選項

loop count

動畫 AVIF 的循環次數,0 指定無限循環,預設值為 0

movie_timescale timescale

設定寫入電影標頭盒 (mvhd) 中的時間刻度。範圍為 1 到 INT_MAX。預設值為 1000

4.23 avm2

ShockWave Flash (SWF) / ActionScript Virtual Machine 2 (AVM2) 格式多工器。

它接受一個音訊串流、一個視訊串流或兩者。

4.24 bit

G.729 (.bit) 檔案格式多工器。

它接受單個 G.729 音訊串流。

4.25 caf

Apple CAF (Core Audio Format) 多工器。

它接受單個音訊串流。

4.26 codec2

Codec2 音訊多工器。

它接受單個 codec2 音訊串流。

4.27 chromaprint

Chromaprint 指紋識別器多工器。

若要啟用此濾鏡的編譯,您需要使用 --enable-chromaprint 配置 FFmpeg。

此多工器將音訊資料饋送到 Chromaprint 程式庫,該程式庫會為提供的音訊資料產生指紋。請參閱:https://acoustid.org/chromaprint

它採用最多 2 個聲道的單個簽名原生位元組序 16 位元原始音訊串流。

4.27.1 選項

algorithm version

選取要用於指紋識別的演算法版本。範圍為 04。版本 3 啟用靜音偵測。預設值為 1

fp_format format

將指紋輸出的格式。接受以下選項

base64

Base64 壓縮指紋(預設)

compressed

二進位壓縮指紋

raw

二進位原始指紋

silence_threshold threshold

偵測靜音的閾值。範圍從 -132767,其中 -1 停用靜音偵測。靜音偵測只能與演算法的版本 3 一起使用。

靜音偵測必須停用才能與 AcoustID 服務一起使用。預設值為 -1

4.28 crc

CRC(循環冗餘檢查)多工器。

此多工器計算並列印所有輸入音訊和視訊影格的 Adler-32 CRC。預設情況下,音訊影格在計算 CRC 之前會轉換為簽名 16 位元原始音訊,視訊影格會轉換為原始視訊。

多工器的輸出由單行組成,格式為:CRC=0xCRC,其中 CRC 是十六進位數字,以 0 填充到 8 位數,包含所有解碼輸入影格的 CRC。

另請參閱 framecrc 多工器。

4.28.1 範例

  • 使用 ffmpeg 計算輸入的 CRC,並將其儲存在檔案 out.crc
    ffmpeg -i INPUT -f crc out.crc
    
  • 使用 ffmpeg 使用以下命令將 CRC 列印到 stdout
    ffmpeg -i INPUT -f crc -
    
  • 您可以透過指定音訊和視訊編解碼器和格式,使用 ffmpeg 選取每個影格的輸出格式。例如,若要計算轉換為 PCM 無符號 8 位元的輸入音訊和轉換為 MPEG-2 視訊的輸入視訊的 CRC,請使用以下命令
    ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc -
    

4.29 dash

透過 HTTP 的動態自適應串流 (DASH) 多工器。

此多工器根據 MPEG-DASH 標準 ISO/IEC 23009-1:2014 和後續標準更新建立片段和資訊清單檔案。

如需更多資訊,請參閱

此多工器為每個串流建立 MPD(媒體呈現描述)資訊清單檔案和片段檔案。片段檔案放置在 MPD 資訊清單檔案的同一目錄中。

片段檔案名稱可能包含在資訊清單 SegmentTemplate 區段中使用的預定義識別碼,如標準的 5.3.9.4.4 節中定義。

可用的識別碼為 $RepresentationID$$Number$$Bandwidth$$Time$。除了標準識別碼之外,還支援 ffmpeg 特有的 $ext$ 識別碼。指定後,ffmpeg 將使用多工格式的副檔名(例如 mp4webm 等)取代檔案名稱中的 $ext$

4.29.1 選項

adaptation_sets adaptation_sets

將串流指派給適應集,在 MPD 資訊清單 AdaptationSets 區段中指定。

適應集包含一組或多個作為單個子集存取的串流,例如,以不同大小編碼的對應串流,使用者可以根據可用頻寬選擇,或具有不同語言的不同音訊串流。

每個適應集都使用以下語法指定

id=index,streams=streams

其中 index 必須是數字索引,streams 是以 , 分隔的串流索引序列。可以指定多個適應集,以空格分隔。

若要將所有視訊(或音訊)串流對應到適應集,可以使用 v(或 a)作為串流識別碼,而不是 ID。

如果未定義指派,則預設為每個串流的適應集。

也可以指定以下可選欄位

descriptor

定義 ISO/IEC 23009-1:2014/Amd.2:2015 定義的描述符。

例如

<SupplementalProperty schemeIdUri=\"urn:mpeg:dash:srd:2014\" value=\"0,0,0,1,1,2,2\"/>

描述符字串應為自封閉 XML 標籤。

frag_duration

覆寫使用 frag_duration 選項指定的全域片段持續時間。

frag_type

覆寫使用 frag_type 選項指定的全域片段類型。

seg_duration

覆寫使用 seg_duration 選項指定的全域區段持續時間。

trick_id

將適應集標記為包含用於參考適應集的技巧模式的串流。

以下是 adaptation_sets 選項的可能值的一些範例

id=0,seg_duration=2,frag_duration=1,frag_type=duration,streams=v id=1,seg_duration=2,frag_type=none,streams=a
id=0,seg_duration=2,frag_type=none,streams=0 id=1,seg_duration=10,frag_type=none,trick_id=0,streams=1
dash_segment_type type

設定 DASH 片段檔案類型。

可能的值

auto

將根據串流編解碼器選取 dash 片段檔案格式。這是預設模式。

mp4

dash 片段檔案將採用 ISOBMFF/MP4 格式

webm

dash 片段檔案將採用 WebM 格式

extra_window_size size

設定在從磁碟移除之前,保留在資訊清單外的最大片段數。

format_options options_list

使用以 : 分隔的 key=value 參數列表設定容器格式 (mp4/webm) 選項。包含 : 特殊字元的值必須逸出。

frag_duration duration

設定片段在區段中的長度,單位為秒。亦可設定小數值。

frag_type type

設定用於分段的間隔類型。

可能的值

auto

每個區段設定一個片段

every_frame

在每個影格處片段化

duration

在特定時間間隔分割片段

pframes

在關鍵影格和後續 P 影格重排序處分割片段(僅限影片,實驗性質)

global_sidx bool

寫入全域 SIDX atom。僅適用於單一檔案、mp4 輸出、非串流模式。

hls_master_name file_name

HLS 主播放清單名稱。預設值為 master.m3u8

hls_playlist bool

產生 HLS 播放清單檔案。主播放清單的檔名由 hls_master_name 選項指定。每個串流會產生一個媒體播放清單檔案,檔名為 media_0.m3u8media_1.m3u8 等。

http_opts http_opts

指定以 : 分隔的 key=value 選項列表,以傳遞至底層 HTTP 協定。僅適用於 HTTP 輸出。

http_persistent bool

使用持久性 HTTP 連線。僅適用於 HTTP 輸出。

http_user_agent user_agent

覆寫 HTTP 標頭中的 User-Agent 欄位。僅適用於 HTTP 輸出。

ignore_io_errors bool

忽略開啟和寫入期間的 IO 錯誤。適用於長時間執行的網路輸出。預設為停用。

index_correction bool

啟用或停用區段索引校正邏輯。僅當啟用 use_template 且停用 use_timeline 時適用。預設為停用。

啟用後,此邏輯會監控區段索引的流程。如果串流的區段索引值未在預期的即時位置,則此邏輯會校正該索引值。

通常,此邏輯在直播串流使用案例中是必要的。在長時間串流期間,網路頻寬波動是常見的。每次波動都可能導致區段索引落後於預期的即時位置。

init_seg_name init_name

用於初始化區段的 DASH 範本名稱。預設值為 init-stream$RepresentationID$.$ext$$ext$ 會替換為區段格式特定的副檔名。

ldash bool

透過限制某些元素的存在和值來啟用低延遲 Dash。預設為停用。

lhls bool

啟用低延遲 HLS (LHLS)。新增包含目前區段 URI 的 #EXT-X-PREFETCH 標籤。hls.js 播放器社群正嘗試標準化開放的 LHLS 規範。草稿規範可在 https://github.com/video-dev/hlsjs-rfcs/blob/lhls-spec/proposals/0001-lhls.md 取得。

此選項嘗試符合上述開放規範。它會自動啟用 streaminghls_playlist 選項。這是一個實驗性功能。

注意:這不是 Apple 版本的 LHLS。請參閱 https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis

master_m3u8_publish_rate segment_intervals_count

在指定的區段間隔數之後,重複發佈主播放清單。

max_playback_rate rate

設定最大播放速率,此速率適用於用戶端在正常播放期間自動調整播放延遲和緩衝區佔用率。

media_seg_name segment_name

用於媒體區段的 DASH 範本名稱。預設值為 chunk-stream$RepresentationID$-$Number%05d$.$ext$$ext$ 會替換為區段格式特定的副檔名。

method method

使用給定的 HTTP 方法來建立輸出檔案。通常設定為 PUTPOST

min_playback_rate rate

設定最小播放速率,此速率適用於用戶端在正常播放期間自動調整播放延遲和緩衝區佔用率。

mpd_profile flags

設定一個或多個 MPD 清單設定檔。

可能的值

dash

MPEG-DASH ISO 基礎媒體檔案格式即時設定檔

dvb_dash

DVB-DASH 設定檔

預設值為 dash

remove_at_exit bool

啟用或停用在完成時移除所有區段。預設為停用。

seg_duration duration

設定區段長度,單位為秒(亦可設定小數值)。當啟用 use_template 選項且停用 use_timeline 選項時,此值會被視為平均區段長度;在所有其他使用案例中,則視為最小區段長度。

預設值為 5

single_file bool

啟用或停用將所有區段儲存在一個檔案中,並使用位元組範圍存取。預設為停用。

單一檔案的名稱可以使用 single_file_name 選項指定;若未指定,則假設為主清單檔案的基礎名稱,並加上輸出格式副檔名。

single_file_name file_name

用於主清單 baseURL 元素的 DASH 範本名稱。暗示 single_file 選項已設定為 true。在範本中,$ext$ 會替換為區段格式特定的副檔名。

streaming bool

啟用或停用輸出的區塊串流模式。在區塊串流模式中,每個影格都會是一個 moof 片段,形成一個區塊。預設為停用。

target_latency target_latency

設定伺服的目標延遲時間,單位為秒(亦可設定小數值)。僅當啟用 streamingwrite_prft 選項時適用。這是一個資訊性欄位,用戶端可用於測量服務的延遲。

timeout timeout

設定 socket I/O 操作的逾時時間,單位為秒(亦可設定小數值)。僅適用於 HTTP 輸出。

update_period period

設定 MPD 更新週期,用於動態內容。單位為秒。若設定為 0,則會自動計算週期。

預設值為 0

use_template bool

啟用或停用在主清單中使用 SegmentTemplate 而非 SegmentList。預設為啟用。

use_timeline bool

啟用或停用在 SegmentTemplate 主清單區段中使用 SegmentTimeline。預設為啟用。

utc_timing_url url

頁面的 URL,該頁面將傳回 ISO 格式的 UTC 時間戳記,例如 https://time.akamai.com/?iso

window_size size

設定主清單中保留的最大區段數量,捨棄最舊的區段。這對於直播串流很有用。

若值為 0,則主清單中會保留所有區段。預設值為 0

write_prft write_prft

在支援的串流上寫入 Producer Reference Time 元素。這也會在底層的多工器中啟用 prft boxes 的寫入。僅當啟用 utc_url 選項時適用。預設設定為 auto,在此情況下,多工器會嘗試僅在需要它的模式下啟用它。

4.29.2 範例

產生 DASH 輸出,從 ffmpeg 中的即時輸入來源讀取。

從輸入檔案產生兩個多媒體串流,皆包含透過 ‘libx264’ 編碼的視訊串流,以及透過 ‘libfdk_aac’ 編碼的音訊串流。第一個多媒體串流包含位元率為 800k 的視訊和預設速率的音訊;第二個多媒體串流包含縮放為 320x170 像素、300k 位元率的視訊,以及重新取樣為 22005 Hz 的音訊。

window_size 選項僅保留最新的 5 個區段,預設持續時間為 5 秒。

ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264 \
-b:v:0 800k -profile:v:0 main \
-b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline -ar:a:1 22050 \
-bf 1 -keyint_min 120 -g 120 -sc_threshold 0 -b_strategy 0 \
-use_timeline 1 -use_template 1 -window_size 5 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash /path/to/out.mpd

4.30 daud

D-Cinema 音訊多工器。

它接受單一 6 聲道音訊串流,重新取樣為 96000 Hz,並使用 ‘pcm_24daud’ 編碼解碼器編碼。

4.30.1 範例

使用 ffmpeg 將輸入音訊多工處理為 ‘5.1’ 聲道配置,並重新取樣為 96000Hz

ffmpeg -i INPUT -af aresample=96000,pan=5.1 slow.302

對於 7.0 之前的 ffmpeg 版本,您可能必須使用 ‘asetnsamples’ 濾鏡來限制多工封包大小,因為此格式不支援多工處理大於 65535 位元組(3640 個樣本)的封包。對於較新的 ffmpeg 版本,音訊會自動封包化為 36000 位元組(2000 個樣本)的封包。

4.31 dv

DV (數位視訊) 多工器。

它正好接受一個 ‘dvvideo’ 視訊串流,以及最多兩個 ‘pcm_s16’ 音訊串流。更多限制由視訊的屬性定義,視訊必須對應於支援的 DV 視訊設定檔,以及影格率。

4.31.1 範例

使用 ffmpeg 轉換輸入

ffmpeg -i INPUT -s:v 720x480 -pix_fmt yuv411p -r 29.97 -ac 2 -ar 48000 -y out.dv

4.32 ffmetadata

FFmpeg metadata 多工器。

此多工器以 ‘ffmetadata’ 格式寫入串流 metadata。

請參閱 (ffmpeg-formats)Metadata 章節 以取得格式相關資訊。

4.32.1 範例

使用 ffmpeg 從輸入檔案擷取 metadata 到 ‘ffmetadata’ 格式的 metadata.ffmeta 檔案

ffmpeg -i INPUT -f ffmetadata metadata.ffmeta

4.33 fifo

FIFO (先進先出) 多工器。

fifo’ 虛擬多工器允許透過使用先進先出佇列,並在不同的執行緒中執行實際的多工器,來分離編碼和多工處理。

這在與 tee 多工器結合使用時特別有用,可用於以不同的可靠性/寫入速度/延遲將資料傳送到多個目的地。

目標多工器可以從輸出名稱選取,或透過 fifo_format 選項指定。

如果佇列已滿,或輸出失敗(例如,如果封包無法寫入輸出),則 ‘fifo’ 多工器的行為是可選的

  • 可以透明地重新啟動輸出,並根據即時或處理串流的時間,設定可配置的重試延遲。
  • 在暫時性故障期間,可以封鎖編碼;或者在 FIFO 佇列已滿的情況下,可以繼續透明地捨棄封包。

API 使用者應注意,在其 AVFormatContext 中使用的回呼函式(interrupt_callbackio_openio_close)必須是執行緒安全的。

4.33.1 選項

attempt_recovery bool

如果發生故障,請嘗試復原輸出。這在與網路輸出搭配使用時特別有用,因為它可以透明地重新啟動串流。預設情況下,此選項設定為 false

drop_pkts_on_overflow bool

若設定為 true,則在 fifo 佇列已滿的情況下,將會捨棄封包,而不是封鎖編碼器。這使得可以在不延遲輸入的情況下繼續串流,但代價是省略部分串流。預設情況下,此選項設定為 false,因此在這種情況下,編碼器將被封鎖,直到多工器處理部分封包,並且不會遺失任何封包。

fifo_format format_name

指定格式名稱。如果無法從輸出名稱後綴猜測,則此選項很有用。

format_opts options

為底層多工器指定格式選項。多工器選項可以指定為以 ’:’ 分隔的 key=value 配對列表。

max_recovery_attempts count

設定連續復原嘗試失敗的最大次數,超過此次數後,輸出將永久失敗。預設情況下,此選項設定為 0(無限制)。

queue_size size

以封包數量指定佇列大小。預設值為 60

recover_any_error bool

若設定為 true,則無論導致故障的錯誤類型為何,都將嘗試復原。預設情況下,此選項設定為 false;在某些(通常是永久性)錯誤的情況下,即使 attempt_recovery 選項設定為 true,也不會嘗試復原。

recovery_wait_streamtime bool

若設定為 false,則在等待復原嘗試時,會使用即時時間(即,將在 recovery_wait_time 選項指定的時間後嘗試復原)。

若設定為 true,則會改為考慮處理串流的時間(即,將在捨棄對應於 recovery_wait_time 選項的封包後嘗試復原)。

預設情況下,此選項設定為 false

recovery_wait_time duration

指定在上一次復原嘗試失敗後,下一次復原嘗試之前的等待時間,單位為秒。預設值為 5

restart_with_keyframe bool

指定是否在從佇列溢位或故障復原後等待關鍵影格。預設情況下,此選項設定為 false

timeshift duration

緩衝指定的封包量,並延遲寫入輸出。請注意,queue_size 選項的值必須夠大,才能儲存用於 timeshift 的封包。在輸入結束時,fifo 緩衝區會以即時速度刷新。

4.33.2 範例

使用 ffmpeg 串流到 RTMP 伺服器,即使在發生暫時性故障(網路中斷)的情況下,仍以即時速率繼續處理串流,並嘗試每秒無限期地復原串流

ffmpeg -re -i ... -c:v libx264 -c:a aac -f fifo -fifo_format flv \
  -drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 \
  -map 0:v -map 0:a rtmp://example.com/live/stream_name

4.34 film_cpk

Sega film (.cpk) 多工器。

此格式曾用作數款 Sega 遊戲的內部格式。

如需 Sega film 檔案格式的更多資訊,請造訪 http://wiki.multimedia.cx/index.php?title=Sega_FILM

它最多接受一個 ‘cinepak’ 或原始視訊串流,以及最多一個音訊串流。

4.35 filmstrip

Adobe Filmstrip 多工器。

此格式由數款 Adobe 工具用於儲存產生的 filmstrip 匯出。它接受單一原始視訊串流。

4.36 fits

Flexible Image Transport System (FITS) 多工器。

此影像格式用於儲存天文資料。

如需格式的更多資訊,請造訪 https://fits.gsfc.nasa.gov

4.37 flac

Raw FLAC 音訊多工器。

此多工器正好接受一個 FLAC 音訊串流。此外,可以新增處置方式為 ‘attached_pic’ 的影像。

4.37.1 選項

write_header bool

若設定為 true,則寫入檔案標頭;預設值為 true

4.37.2 範例

使用 ffmpeg 儲存輸入檔案中的音訊串流,以及數張搭配 ‘attached_pic’ 處置方式使用的圖片

ffmpeg -i INPUT -i pic1.png -i pic2.jpg -map 0:a -map 1 -map 2 -disposition:v attached_pic OUTPUT

4.38 flv

Adobe Flash Video Format 多工器。

4.38.1 選項

flvflags flags

可能的值

aac_seq_header_detect

根據音訊串流資料放置 AAC 序列標頭。

no_sequence_end

停用序列結束標籤。

no_metadata

停用 metadata 標籤。

no_duration_filesize

當串流結束時,若持續時間和檔案大小等於零,則停用 metadata 中的持續時間和檔案大小。(用於不可搜尋的即時串流)。

add_keyframe_index

用於方便搜尋;特別是用於 HTTP 虛擬串流。

4.39 framecrc

Per-packet CRC (循環冗餘檢查) 測試格式。

此多工器會計算並列印每個音訊和視訊封包的 Adler-32 CRC。預設情況下,音訊影格會轉換為帶正負號的 16 位元原始音訊,而視訊影格則轉換為原始視訊,然後再計算 CRC。

多工器的輸出包含每個音訊和視訊封包的一行,格式如下

stream_index, packet_dts, packet_pts, packet_duration, packet_size, 0xCRC

CRC 是一個十六進位數字,以 0 填補至 8 位數,包含封包的 CRC。

4.39.1 範例

例如,若要計算 INPUT 中音訊和視訊影格的 CRC,並將其轉換為原始音訊和視訊封包,然後將其儲存在檔案 out.crc

ffmpeg -i INPUT -f framecrc out.crc

若要將資訊列印到 stdout,請使用命令

ffmpeg -i INPUT -f framecrc -

使用 ffmpeg,您可以選取音訊和視訊影格編碼成的輸出格式,然後再計算每個封包的 CRC,方法是指定音訊和視訊編碼解碼器。例如,若要計算每個解碼輸入音訊影格轉換為 PCM 無正負號 8 位元,以及每個解碼輸入視訊影格轉換為 MPEG-2 視訊的 CRC,請使用命令

ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc -

另請參閱 crc 多工器。

4.40 framehash

Per-packet hash 測試格式。

此多工器會計算並列印每個音訊和視訊封包的密碼編譯雜湊值。這可用於封包對封包的相等性檢查,而無需個別對每個封包執行二進位比較。

預設情況下,音訊影格會轉換為帶正負號的 16 位元原始音訊,而視訊影格則轉換為原始視訊,然後再計算雜湊值,但也可以使用明確轉換為其他編碼解碼器的輸出。預設情況下,它使用 SHA-256 密碼編譯雜湊函式,但支援數種其他演算法。

多工器的輸出包含每個音訊和視訊封包的一行,格式如下

stream_index, packet_dts, packet_pts, packet_duration, packet_size, hash

hash 是一個十六進位數字,代表封包的計算雜湊值。

hash algorithm

使用字串 algorithm 指定的密碼編譯雜湊函式。支援的值包括 MD5murmur3RIPEMD128RIPEMD160RIPEMD256RIPEMD320SHA160SHA224SHA256(預設值)、SHA512/224SHA512/256SHA384SHA512CRC32adler32

4.40.1 範例

若要計算 INPUT 中音訊和視訊影格的 SHA-256 雜湊值,並將其轉換為原始音訊和視訊封包,然後將其儲存在檔案 out.sha256

ffmpeg -i INPUT -f framehash out.sha256

若要使用 MD5 雜湊函式將資訊列印到 stdout,請使用命令

ffmpeg -i INPUT -f framehash -hash md5 -

另請參閱 hash 多工器。

4.41 framemd5

Per-packet MD5 測試格式。

這是 framehash 多工器的變體。與該多工器不同,它預設為使用 MD5 雜湊函式。

4.41.1 範例

若要計算 INPUT 中音訊和視訊影格的 MD5 雜湊值,並將其轉換為原始音訊和視訊封包,然後將其儲存在檔案 out.md5

ffmpeg -i INPUT -f framemd5 out.md5

若要將資訊列印到 stdout,請使用命令

ffmpeg -i INPUT -f framemd5 -

另請參閱 framehashmd5 多工器。

4.42 gif

Animated GIF 多工器。

請注意,GIF 格式具有非常大的時基:因此,兩個影格之間的延遲時間不能小於百分之一秒。

4.42.1 選項

loop bool

設定輸出迴圈的次數。使用 -1 表示不迴圈,0 表示無限期迴圈(預設值)。

final_delay delay

強制設定最後一個影格之後的延遲時間(以百分之一秒為單位表示)。每個影格都以延遲時間結束,直到下一個影格。預設值為 -1,這是一個特殊值,用於告知多工器重複使用先前的延遲時間。在迴圈的情況下,您可能想要自訂此值以標記暫停時間,例如。

4.42.2 範例

編碼一個迴圈 10 次的 gif,迴圈之間有 5 秒的延遲

ffmpeg -i INPUT -loop 10 -final_delay 500 out.gif

注意 1:如果您希望將影格擷取到個別的 GIF 檔案中,您需要強制使用 image2 多工器

ffmpeg -i INPUT -c:v gif -f image2 "out%d.gif"

4.43 gxf

General eXchange Format (GXF) 多工器。

GXF 由 Grass Valley Group 開發,然後由 SMPTE 標準化為 SMPTE 360M,並在 SMPTE RDD 14-2007 中擴充,以包含高畫質視訊解析度。

它最多接受一個編碼解碼器為 ‘mjpeg’、‘mpeg1video’、‘mpeg2video’ 或 ‘dvvideo’,解析度為 ‘512x480’ 或 ‘608x576’ 的視訊串流,以及數個速率為 48000Hz 且編碼解碼器為 ‘pcm16_le’ 的音訊串流。

4.44 hash

Hash 測試格式。

此多工器會計算並列印所有輸入音訊和視訊影格的密碼編譯雜湊值。這可用於相等性檢查,而無需執行完整的二進位比較。

預設情況下,音訊影格會轉換為帶正負號的 16 位元原始音訊,而視訊影格則轉換為原始視訊,然後再計算雜湊值,但也可以使用明確轉換為其他編碼解碼器的輸出。時間戳記會被忽略。預設情況下,它使用 SHA-256 密碼編譯雜湊函式,但支援數種其他演算法。

多工器的輸出包含單行格式:algo=hash,其中 algo 是代表所用雜湊函式的簡短字串,而 hash 是代表計算雜湊值的十六進位數字。

hash algorithm

使用字串 algorithm 指定的密碼編譯雜湊函式。支援的值包括 MD5murmur3RIPEMD128RIPEMD160RIPEMD256RIPEMD320SHA160SHA224SHA256(預設值)、SHA512/224SHA512/256SHA384SHA512CRC32adler32

4.44.1 範例

若要計算輸入轉換為原始音訊和視訊的 SHA-256 雜湊值,並將其儲存在檔案 out.sha256

ffmpeg -i INPUT -f hash out.sha256

若要將 MD5 雜湊值列印到 stdout,請使用命令

ffmpeg -i INPUT -f hash -hash md5 -

另請參閱 framehash 多工器。

4.45 hds

HTTP Dynamic Streaming (HDS) 多工器。

HTTP dynamic streaming 或 HDS 是 Adobe 開發的自適應位元率串流方法。HDS 透過 HTTP 連線傳遞 MP4 視訊內容。HDS 可用於隨選串流或即時串流。

此多工器會在輸出中指定的目錄中建立 .f4m (Adobe Flash Media Manifest File) 主清單、每個串流的 .abst (Adobe Bootstrap File) 和區段檔案。

這些需要透過 HTTPS 由 HDS 播放器存取,才能夠在產生的串流上執行播放。

4.45.1 選項

extra_window_size int

在從磁碟移除之前,保留在主清單之外的片段數量

min_frag_duration microseconds

最小片段持續時間(以微秒為單位),預設值為 1 秒 (10000000)

remove_at_exit bool

若設定為 true,則在完成時移除所有片段

window_size int

保留在主清單中的片段數量,若設定為非 0 的值。預設情況下,所有區段都會保留在輸出目錄中。

4.45.2 範例

使用 ffmpeg 以即時速率將 HDS 檔案產生到 output.hds 目錄

ffmpeg -re -i INPUT -f hds -b:v 200k output.hds

4.46 hls

Apple HTTP Live Streaming 多工器,根據 HTTP Live Streaming (HLS) 規範分段 MPEG-TS。

它會建立一個播放清單檔案和一個或多個區段檔案。輸出檔名指定播放清單檔名。

預設情況下,多工器會為產生的每個區段建立一個檔案。這些檔案的名稱與播放清單相同,後接循序編號和 .ts 副檔名。

請務必在編碼時要求封閉式 GOP,並設定 GOP 大小以符合您的區段時間限制。

例如,若要使用 ffmpeg 轉換輸入檔案

ffmpeg -i in.mkv -c:v h264 -flags +cgop -g 30 -hls_time 1 out.m3u8

此範例將產生播放清單 out.m3u8 和區段檔案:out0.tsout1.tsout2.ts 等。

另請參閱 segment 多工器,它提供更通用且彈性的分段器實作,可用於執行 HLS 分段。

4.46.1 選項

hls_init_time duration

設定初始目標區段長度。預設值為 0

duration 必須是時間持續時間規格,請參閱 (ffmpeg-utils)ffmpeg-utils(1) 手冊中的時間持續時間章節

區段將在第一個 m3u8 列表中經過此時間後的下一個關鍵影格處切割。在填滿初始播放清單後,ffmpeg 將以等於 hls_time 的持續時間切割區段。

hls_time duration

設定目標區段長度。預設值為 2。

duration 必須是時間持續時間規格,請參閱 (ffmpeg-utils)ffmpeg-utils(1) 手冊中的時間持續時間章節。區段將在此時間經過後的下一個關鍵影格處切割。

hls_list_size size

設定播放清單條目的最大數量。若設定為 0,則列表檔案將包含所有區段。預設值為 5。

hls_delete_threshold size

設定在 hls_flags delete_segments 刪除未參照的區段之前,要保留在磁碟上的未參照區段數量。增加此值可讓繼續的用戶端下載最近在播放清單中參照的區段。預設值為 1,表示將刪除比 hls_list_size+1 更舊的區段。

hls_start_number_source source

根據指定的來源啟動播放清單序列號碼 (#EXT-X-MEDIA-SEQUENCE)。除非設定 hls_flags single_file,否則它也會指定區段和字幕檔名的起始序列號碼來源。在任何情況下,如果設定 hls_flags append_list 且讀取的播放清單序列號碼大於指定的起始序列號碼,則該值將用作起始值。

它接受下列值

generic (預設)

根據 start_number 選項值設定起始號碼。

epoch

將起始號碼設定為自 epoch (1970-01-01 00:00:00) 以來的秒數。

epoch_us

將起始號碼設定為自 epoch (1970-01-01 00:00:00) 以來的微秒數。

datetime

根據目前的日期/時間設定起始號碼,格式為 YYYYmmddHHMMSS。例如 20161231235759。

start_number number

hls_start_number_source 值為 generic 時,從指定的 number 啟動播放清單序列號碼 (#EXT-X-MEDIA-SEQUENCE)。(這是預設情況。)除非設定 hls_flags single_file,否則它也會指定區段和字幕檔名的起始序列號碼。預設值為 0。

hls_allow_cache bool

明確設定用戶端「可以」(1) 或「不得」(0) 快取媒體區段。

hls_base_url baseurl

baseurl 附加到播放清單中的每個條目。適用於產生具有絕對路徑的播放清單。

請注意,播放清單序列號碼對於每個區段都必須是唯一的,並且不得與區段檔名序列號碼混淆,區段檔名序列號碼可以是循環的,例如,如果指定了 wrap 選項。

hls_segment_filename filename

設定區段檔名。除非 hls_flags 選項設定為 ‘single_file’,否則 filename 會用作字串格式,並附加區段編號。

例如

ffmpeg -i in.nut -hls_segment_filename 'file%03d.ts' out.m3u8

將產生播放清單 out.m3u8 和區段檔案:file000.tsfile001.tsfile002.ts 等。

filename 可能包含完整路徑或相對路徑規格,但只有不包含任何路徑的檔案名稱部分會包含在 m3u8 區段列表中。如果指定相對路徑,則建立的區段檔案的路徑將相對於目前的工作目錄。當設定 strftime_mkdir 時,filename 的整個展開值將寫入 m3u8 區段列表。

var_stream_map 設定為兩個或多個變體串流時,filename 模式必須包含字串 "%v",此字串將展開為產生的區段檔名中變體串流索引的位置。

例如

ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
  -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \
  -hls_segment_filename 'file_%v_%03d.ts' out_%v.m3u8

將產生播放清單區段檔案集:file_0_000.tsfile_0_001.tsfile_0_002.ts 等,以及 file_1_000.tsfile_1_001.tsfile_1_002.ts 等。

字串 "%v" 可能存在於檔名或包含檔案的最後一個目錄名稱中,但只能存在於其中一個中。(此外,%v 可能在最後一個子目錄或檔名中出現多次。)如果字串 %v 存在於目錄名稱中,則在展開目錄名稱模式後會建立子目錄。這使得可以在子目錄中建立對應於不同變體串流的區段。

例如

ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
  -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \
  -hls_segment_filename 'vs%v/file_%03d.ts' vs%v/out.m3u8

將產生播放清單區段檔案集:vs0/file_000.tsvs0/file_001.tsvs0/file_002.ts 等,以及 vs1/file_000.tsvs1/file_001.tsvs1/file_002.ts 等。

strftime bool

filename 上使用 strftime(),以使用本地時間展開區段檔名。區段編號在此模式下也可用,但若要使用它,您需要在 hls_flag 中設定 ‘second_level_segment_index’,而 %%d 將是指定符。

例如

ffmpeg -i in.nut -strftime 1 -hls_segment_filename 'file-%Y%m%d-%s.ts' out.m3u8

將產生播放清單 out.m3u8 和區段檔案:file-20160215-1455569023.tsfile-20160215-1455569024.ts 等。注意:在某些系統/環境中,%s 指定符不可用。請參閱 strftime() 文件。

例如

ffmpeg -i in.nut -strftime 1 -hls_flags second_level_segment_index -hls_segment_filename 'file-%Y%m%d-%%04d.ts' out.m3u8

將產生播放清單 out.m3u8 和區段檔案:file-20160215-0001.tsfile-20160215-0002.ts 等。

strftime_mkdir bool

strftime 一起使用,它將建立選項 hls_segment_filename 的展開值中存在的所有子目錄。

例如

ffmpeg -i in.nut -strftime 1 -strftime_mkdir 1 -hls_segment_filename '%Y%m%d/file-%Y%m%d-%s.ts' out.m3u8

將建立目錄 201560215(如果它不存在),然後產生播放清單 out.m3u8 和區段檔案:20160215/file-20160215-1455569023.ts20160215/file-20160215-1455569024.ts 等。

例如

ffmpeg -i in.nut -strftime 1 -strftime_mkdir 1 -hls_segment_filename '%Y/%m/%d/file-%Y%m%d-%s.ts' out.m3u8

將建立目錄階層 2016/02/15(如果其中任何一個不存在),然後產生播放清單 out.m3u8 和區段檔案:2016/02/15/file-20160215-1455569023.ts2016/02/15/file-20160215-1455569024.ts 等。

hls_segment_options options_list

使用以 : 分隔的 key=value 參數列表設定輸出格式選項。包含 : 特殊字元的數值必須逸出。

hls_key_info_file key_info_file

使用 key_info_file 中的資訊進行區段加密。key_info_file 的第一行指定寫入播放清單的金鑰 URI。金鑰 URL 用於在播放期間存取加密金鑰。第二行指定金鑰檔案的路徑,用於在加密過程中取得金鑰。金鑰檔案會讀取為二進位格式的 16 個八位元組的單一封裝陣列。選用的第三行將初始化向量 (IV) 指定為十六進位字串,以取代區段序列號碼(預設值)進行加密。若 hls_flags periodic_rekey 已啟用,則變更 key_info_file 將導致使用新的金鑰/IV 進行區段加密,並在播放清單中新增新的金鑰 URI/IV 的條目。

金鑰資訊檔案格式

key URI
key file path
IV (optional)

金鑰 URI 範例

http://server/file.key
/path/to/file.key
file.key

金鑰檔案路徑範例

file.key
/path/to/file.key

IV 範例

0123456789ABCDEF0123456789ABCDEF

金鑰資訊檔案範例

http://server/file.key
/path/to/file.key
0123456789ABCDEF0123456789ABCDEF

Shell 腳本範例

#!/bin/sh
BASE_URL=${1:-'.'}
openssl rand 16 > file.key
echo $BASE_URL/file.key > file.keyinfo
echo file.key >> file.keyinfo
echo $(openssl rand -hex 16) >> file.keyinfo
ffmpeg -f lavfi -re -i testsrc -c:v h264 -hls_flags delete_segments \
  -hls_key_info_file file.keyinfo out.m3u8
hls_enc bool

啟用 (1) 或停用 (0) AES128 加密。啟用時,產生的每個區段都會加密,且加密金鑰會儲存為 playlist name.key。

hls_enc_key key

指定 16 個八位元組的金鑰來加密區段,預設情況下為隨機產生。

hls_enc_key_url keyurl

若已設定,則 keyurl 會取代 baseurl 前置於播放清單中的金鑰檔名。

hls_enc_iv iv

為每個區段指定 16 個八位元組的初始化向量,而不是自動產生的向量。

hls_segment_type flags

可能的值

mpegts

以 MPEG-2 Transport Stream 格式輸出區段檔案。這與所有 HLS 版本相容。

fmp4

以分段 MP4 格式輸出區段檔案,類似於 MPEG-DASH。fmp4 檔案可用於 HLS 版本 7 及更高版本。

hls_fmp4_init_filename filename

設定片段檔案標頭檔案的檔名,預設檔名為 init.mp4

當啟用 strftime 時,filename 會展開為具有本地時間的區段檔名。

例如

ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 -hls_fmp4_init_filename "%s_init.mp4" out.m3u8

將產生類似 1602678741_init.mp4 的 init。

hls_fmp4_init_resend bool

每次 m3u8 檔案重新整理後,重新傳送 init 檔案,預設值為 0

var_stream_map 設定為兩個或多個變體串流時,filename 模式必須包含字串 "%v",此字串指定產生的 init 檔名中變體串流索引的位置。字串 "%v" 可能存在於檔名或包含檔案的最後一個目錄名稱中。如果字串存在於目錄名稱中,則在展開目錄名稱模式後會建立子目錄。這使得可以在子目錄中建立對應於不同變體串流的 init 檔案。

hls_flags flags

可能的值

single_file

若設定此旗標,多工器會將所有區段儲存在單一 MPEG-TS 檔案中,並在播放清單中使用位元組範圍。以此方式產生的 HLS 播放清單的版本號碼將為 4。

例如

ffmpeg -i in.nut -hls_flags single_file out.m3u8

將產生播放清單 out.m3u8 和單一區段檔案 out.ts

delete_segments

從播放清單中移除的片段檔案,會在等於片段持續時間加上播放清單持續時間的一段時間後刪除。

append_list

將新的片段附加到舊片段列表的末尾,並從舊片段列表中移除 #EXT-X-ENDLIST

round_durations

將播放清單檔案片段資訊中的持續時間資訊四捨五入為整數值,而不是使用浮點數。如果沒有其他功能需要使用更高版本的 HLS,那麼這將允許 ffmpeg 輸出 HLS 版本 2 m3u8。

discont_start

在播放清單中,於第一個片段的資訊之前加入 #EXT-X-DISCONTINUITY 標籤。

omit_endlist

不要在播放清單的末尾附加 EXT-X-ENDLIST 標籤。

periodic_rekey

將定期檢查由 hls_key_info_file 指定的檔案,並偵測加密資訊的更新。請務必以原子方式替換此檔案,包括包含 AES 加密金鑰的檔案。

independent_segments

當播放清單具有視訊片段,且該播放清單的所有片段都保證以關鍵影格開始時,將 #EXT-X-INDEPENDENT-SEGMENTS 標籤新增至播放清單。

iframes_only

#EXT-X-I-FRAMES-ONLY 標籤新增至具有視訊片段且只能在 #EXT-X-BYTERANGE 模式下播放 I 影格的播放清單。

split_by_time

允許片段在關鍵影格以外的影格上開始。當關鍵影格之間的時間不一致時,這可以改善某些播放器的行為,但可能會使其他播放器情況更糟,並可能在搜尋期間引起一些異常。此標記應與 hls_time 選項一起使用。

program_date_time

產生 EXT-X-PROGRAM-DATE-TIME 標籤。

second_level_segment_index

strftime 選項開啟時,除了日期/時間值之外,還可以使用片段索引作為 hls_segment_filename 選項表達式中的 %%d。若要取得具有後綴零的固定寬度數字,可以使用 %%0xd 格式,其中 x 是所需的寬度。

second_level_segment_size

當 strftime 開啟時,除了日期/時間值之外,還可以使用片段大小(以位元組計)作為 hls_segment_filename 選項表達式中的 %%s。若要取得具有後綴零的固定寬度數字,可以使用 %%0xs 格式,其中 x 是所需的寬度。

second_level_segment_duration

當 strftime 開啟時,除了日期/時間值之外,還可以使用片段持續時間(以微秒為單位計算)作為 hls_segment_filename 選項表達式中的 %%t。若要取得具有後綴零的固定寬度數字,可以使用 %%0xt 格式,其中 x 是所需的寬度。

例如

ffmpeg -i sample.mpeg \
   -f hls -hls_time 3 -hls_list_size 5 \
   -hls_flags second_level_segment_index+second_level_segment_size+second_level_segment_duration \
   -strftime 1 -strftime_mkdir 1 -hls_segment_filename "segment_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts" stream.m3u8

將產生如下的片段:segment_20170102194334_0003_00122200_0000003000000.tssegment_20170102194334_0004_00120072_0000003000000.ts 等。

temp_file

將片段資料寫入 filename.tmp,並在片段完成後才重新命名為 filename。

可以將提供片段的網路伺服器設定為拒絕存取 *.tmp 的請求,以防止在進行中的片段被添加到 m3u8 播放清單之前被存取。

此標記也會影響 m3u8 播放清單檔案的建立方式。如果設定此標記,則所有播放清單檔案都將寫入暫存檔,並在完成後重新命名,這與片段的處理方式類似。但是,使用 file 協定且 hls_playlist_type 類型不是 ‘vod’ 的播放清單,無論此標記為何,都會始終寫入暫存檔。

使用 file 協定指定的 Master 播放清單檔案 master_pl_name,如果有的話,如果 master_pl_publish_rate 值不是零,則無論此標記為何,都會始終寫入暫存檔。

hls_playlist_type type

如果類型為 ‘event’,則在 m3u8 標頭中發出 #EXT-X-PLAYLIST-TYPE:EVENT。這會強制 hls_list_size 為 0;播放清單只能附加。

如果類型為 ‘vod’,則在 m3u8 標頭中發出 #EXT-X-PLAYLIST-TYPE:VOD。這會強制 hls_list_size 為 0;播放清單不得變更。

method method

使用給定的 HTTP 方法來建立 hls 檔案。

例如

ffmpeg -re -i in.ts -f hls -method PUT http://example.com/live/out.m3u8

將使用 HTTP PUT 方法將所有 mpegts 片段檔案上傳到 HTTP 伺服器,並每隔 refresh 次使用相同的方法更新 m3u8 檔案。請注意,HTTP 伺服器必須支援給定的方法來上傳檔案。

http_user_agent agent

覆寫 HTTP 標頭中的 User-Agent 欄位。僅適用於 HTTP 輸出。

var_stream_map stream_map

指定一個映射字串,定義如何將音訊、視訊和字幕串流分組到不同的變體串流中。變體串流組之間以空格分隔。

預期的字串格式如下:"a:0,v:0 a:1,v:1 ...."。此處 a:、v:、s: 是分別指定音訊、視訊和字幕串流的索引鍵。允許的值為 0 到 9(僅根據實際使用情況限制)。

當有兩個或更多變體串流時,輸出檔案名稱模式必須包含字串 "%v":此字串指定變體串流索引在輸出媒體播放清單檔案名稱中的位置。字串 "%v" 可能出現在檔案名稱中,或包含該檔案的最後一個目錄名稱中。如果字串出現在目錄名稱中,則會在展開目錄名稱模式後建立子目錄。這允許在子目錄中建立變體串流。

以下是一些範例。

  • 建立兩個 hls 變體串流。第一個變體串流將包含位元速率為 1000k 的視訊串流和位元速率為 64k 的音訊串流,第二個變體串流將包含位元速率為 256k 的視訊串流和位元速率為 32k 的音訊串流。在這裡,將建立兩個檔案名稱為 out_0.m3u8out_1.m3u8 的媒體播放清單。
    ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
      -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \
      http://example.com/live/out_%v.m3u8
    
  • 如果您想要在結果名稱中使用有意義的文字而不是索引,您可以為每個或某些變體指定名稱。以下範例將建立兩個 hls 變體串流,如同前一個範例一樣。但在這裡,將建立兩個檔案名稱為 out_my_hd.m3u8out_my_sd.m3u8 的媒體播放清單。
    ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
      -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0,name:my_hd v:1,a:1,name:my_sd" \
      http://example.com/live/out_%v.m3u8
    
  • 建立三個 hls 變體串流。第一個變體串流將是僅包含視訊的串流,視訊位元速率為 1000k,第二個變體串流將是僅包含音訊的串流,位元速率為 64k,第三個變體串流將是僅包含視訊的串流,位元速率為 256k。在這裡,將建立三個檔案名稱為 out_0.m3u8out_1.m3u8out_2.m3u8 的媒體播放清單。
    ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k \
      -map 0:v -map 0:a -map 0:v -f hls -var_stream_map "v:0 a:0 v:1" \
      http://example.com/live/out_%v.m3u8
    
  • 在子目錄中建立變體串流。在這裡,第一個媒體播放清單建立於 http://example.com/live/vs_0/out.m3u8,第二個建立於 http://example.com/live/vs_1/out.m3u8
    ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
      -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \
      http://example.com/live/vs_%v/out.m3u8
    
  • 建立兩個僅包含音訊的變體串流和兩個僅包含視訊的變體串流。除了 Master 播放清單中每個變體串流的 #EXT-X-STREAM-INF 標籤之外,還為兩個僅包含音訊的變體串流新增了 #EXT-X-MEDIA 標籤,並且它們使用音訊群組名稱 'aud_low' 和 'aud_high' 映射到兩個僅包含視訊的變體串流。預設情況下,會建立包含所有編碼串流的單個 hls 變體。
    ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k -b:v:1 3000k  \
      -map 0:a -map 0:a -map 0:v -map 0:v -f hls \
      -var_stream_map "a:0,agroup:aud_low a:1,agroup:aud_high v:0,agroup:aud_low v:1,agroup:aud_high" \
      -master_pl_name master.m3u8 \
      http://example.com/live/out_%v.m3u8
    
  • 建立兩個僅包含音訊的變體串流和一個僅包含視訊的變體串流。除了 Master 播放清單中每個變體串流的 #EXT-X-STREAM-INF 標籤之外,還為兩個僅包含音訊的變體串流新增了 #EXT-X-MEDIA 標籤,並且它們使用音訊群組名稱 'aud_low' 映射到一個僅包含視訊的變體串流,並且音訊群組的預設狀態為 NO 或 YES。預設情況下,會建立包含所有編碼串流的單個 hls 變體。
    ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \
      -map 0:a -map 0:a -map 0:v -f hls \
      -var_stream_map "a:0,agroup:aud_low,default:yes a:1,agroup:aud_low v:0,agroup:aud_low" \
      -master_pl_name master.m3u8 \
      http://example.com/live/out_%v.m3u8
    
  • 建立兩個僅包含音訊的變體串流和一個僅包含視訊的變體串流。除了 Master 播放清單中每個變體串流的 #EXT-X-STREAM-INF 標籤之外,還為兩個僅包含音訊的變體串流新增了 #EXT-X-MEDIA 標籤,並且它們使用音訊群組名稱 'aud_low' 映射到一個僅包含視訊的變體串流,並且音訊群組的預設狀態為 NO 或 YES,並且一個音訊具有名為 ENG 的語言,另一個音訊語言名為 CHN。預設情況下,會建立包含所有編碼串流的單個 hls 變體。
    ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \
      -map 0:a -map 0:a -map 0:v -f hls \
      -var_stream_map "a:0,agroup:aud_low,default:yes,language:ENG a:1,agroup:aud_low,language:CHN v:0,agroup:aud_low" \
      -master_pl_name master.m3u8 \
      http://example.com/live/out_%v.m3u8
    
  • 建立單個變體串流。在 Master 播放清單中新增 #EXT-X-MEDIA 標籤,其中 TYPE=SUBTITLES 具有 webvtt 字幕群組名稱 'subtitle' 和可選字幕名稱,例如 'English'。請確保輸入檔案至少有一個文字字幕串流。
    ffmpeg -y -i input_with_subtitle.mkv \
     -b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \
     -b:a:0 256k \
     -c:s webvtt -c:a mp2 -ar 48000 -ac 2 -map 0:v -map 0:a:0 -map 0:s:0 \
     -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle,sname:English" \
     -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size \
     10 -master_pl_publish_rate 10 -hls_flags \
     delete_segments+discont_start+split_by_time ./tmp/video.m3u8
    
cc_stream_map cc_stream_map

映射字串,用於指定不同的隱藏式字幕群組及其屬性。隱藏式字幕串流群組之間以空格分隔。

預期的字串格式如下:"ccgroup:<群組名稱>,instreamid:<INSTREAM-ID>,language:<語言代碼> ...."。'ccgroup' 和 'instreamid' 是強制性屬性。'language' 是可選屬性。

使用此選項配置的隱藏式字幕群組,透過在 var_stream_map 字串中提供相同的 'ccgroup' 名稱,映射到不同的變體串流。

例如

ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
  -a53cc:0 1 -a53cc:1 1 \
  -map 0:v -map 0:a -map 0:v -map 0:a -f hls \
  -cc_stream_map "ccgroup:cc,instreamid:CC1,language:en ccgroup:cc,instreamid:CC2,language:sp" \
  -var_stream_map "v:0,a:0,ccgroup:cc v:1,a:1,ccgroup:cc" \
  -master_pl_name master.m3u8 \
  http://example.com/live/out_%v.m3u8

將在 Master 播放清單中為 INSTREAM-ID 'CC1' 和 'CC2' 新增兩個 #EXT-X-MEDIA 標籤,其中 TYPE=CLOSED-CAPTIONS。此外,它將為兩個輸出變體串流新增具有群組名稱 'cc' 的 CLOSED-CAPTIONS 屬性。

如果未設定 var_stream_map,則 cc_stream_map 中的第一個可用 ccgroup 會映射到輸出變體串流。

例如

ffmpeg -re -i in.ts -b:v 1000k -b:a 64k -a53cc 1 -f hls \
  -cc_stream_map "ccgroup:cc,instreamid:CC1,language:en" \
  -master_pl_name master.m3u8 \
  http://example.com/live/out.m3u8

這將新增 #EXT-X-MEDIA 標籤,其中 TYPE=CLOSED-CAPTIONS,在 Master 播放清單中,群組名稱為 'cc',語言為 'en' (英文),INSTREAM-ID 為 'CC1'。此外,它將為輸出變體串流新增具有群組名稱 'cc' 的 CLOSED-CAPTIONS 屬性。

master_pl_name name

使用給定的名稱建立 HLS Master 播放清單。

例如

ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 http://example.com/live/out.m3u8

建立一個名為 master.m3u8 的 HLS Master 播放清單,該播放清單發佈在 http://example.com/live/

master_pl_publish_rate count

在指定的片段間隔次數後,重複發佈 Master 播放清單。

例如

ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 \
-hls_time 2 -master_pl_publish_rate 30 http://example.com/live/out.m3u8

建立一個名為 master.m3u8 的 HLS Master 播放清單,並使其在每 30 個片段(即每 60 秒)後重複發佈。

http_persistent bool

使用持久性 HTTP 連線。僅適用於 HTTP 輸出。

timeout timeout

設定 socket I/O 操作的逾時時間。僅適用於 HTTP 輸出。

ignore_io_errors bool

忽略開啟、寫入和刪除期間的 IO 錯誤。適用於網路輸出的長時間運行。

headers headers

設定自訂 HTTP 標頭,可以覆寫內建的預設標頭。僅適用於 HTTP 輸出。

4.47 iamf

沉浸式音訊模型和格式 (IAMF) 多工器。

IAMF 用於為串流和離線應用程式中的各種裝置提供沉浸式音訊內容。這些應用程式包括網際網路音訊串流、多播/廣播服務、檔案下載、遊戲、通訊、虛擬實境和擴增實境等。在這些應用程式中,音訊可以在各種裝置上播放,例如耳機、手機、平板電腦、電視、 sound bar、家庭劇院系統和大螢幕。

此格式由開放媒體聯盟 (Alliance for Open Media) 推廣和設計。

有關此格式的更多資訊,請參閱 https://aomedia.org/iamf/

4.48 ico

ICO 檔案多工器。

Microsoft 的圖示檔案格式 (ICO) 有一些應注意的嚴格限制

  • 任何維度的大小都不能超過 256 像素
  • 只能儲存 BMP 和 PNG 影像
  • 如果使用 BMP 影像,則必須是以下像素格式之一
    BMP Bit Depth      FFmpeg Pixel Format
    1bit               pal8
    4bit               pal8
    8bit               pal8
    16bit              rgb555le
    24bit              bgr24
    32bit              bgra
    
  • 如果使用 BMP 影像,則必須使用 BITMAPINFOHEADER DIB 標頭
  • 如果使用 PNG 影像,則必須使用 rgba 像素格式

4.49 ilbc

網際網路低位元速率編碼解碼器 (iLBC) 原始多工器。

它接受單個 ‘ilbc’ 音訊串流。

4.50 image2, image2pipe

影像檔案多工器。

image2’ 多工器將視訊影格寫入影像檔案。

輸出檔案名稱由模式指定,該模式可用於產生循序編號的檔案系列。模式可以包含字串 "%d" 或 "%0Nd",此字串指定檔案名稱中代表編號的字元位置。如果使用 "%0Nd" 格式,則每個檔案名稱中代表數字的字串都會以 0 填充到 N 位數。字面字元 '%' 可以使用字串 "%%" 在模式中指定。

如果模式包含 "%d" 或 "%0Nd",則指定的檔案清單中的第一個檔案名稱將包含數字 1,所有後續數字將是循序的。

模式可以包含後綴,該後綴用於自動判斷要寫入的影像檔案格式。

例如,模式 "img-%03d.bmp" 將指定 img-001.bmpimg-002.bmp、...、img-010.bmp 等形式的檔案名稱序列。模式 "img%%-%d.jpg" 將指定 img%-1.jpgimg%-2.jpg、...、img%-10.jpg 等形式的檔案名稱序列。

影像多工器支援 .Y.U.V 影像檔案格式。此格式很特殊,因為每個影像影格都由三個檔案組成,分別用於 YUV420P 元件。若要讀取或寫入此影像檔案格式,請指定 ’.Y’ 檔案的名稱。多工器將自動開啟所需的 ’.U’ 和 ’.V’ 檔案。

image2pipe’ 多工器接受與 ‘image2’ 多工器相同的選項,但會忽略模式驗證和展開,因為它應該寫入命令輸出而不是實際儲存的檔案。

4.50.1 選項

frame_pts bool

如果設定為 1,則使用封包 PTS(簡報時間戳記)展開檔案名稱。預設值為 0。

start_number count

從指定的數字開始序列。預設值為 1。

update bool

如果設定為 1,則檔案名稱將始終被解釋為僅僅是檔案名稱,而不是模式,並且對應的檔案將持續被新影像覆寫。預設值為 0。

strftime bool

如果設定為 1,則使用來自 strftime() 的日期和時間資訊展開檔案名稱。預設值為 0。

atomic_writing bool

將輸出寫入暫存檔,寫入完成後將其重新命名為目標檔案名稱。預設為停用。

protocol_opts options_list

將協定選項設定為以 : 分隔的 key=value 參數清單。包含 : 特殊字元的值必須逸出。

4.50.2 範例

  • 使用 ffmpeg 建立 img-001.jpegimg-002.jpeg、... 檔案序列,每秒從輸入視訊中擷取一個影像
    ffmpeg -i in.avi -vsync cfr -r 1 -f image2 'img-%03d.jpeg'
    

    請注意,使用 ffmpeg,如果未透過 -f 選項指定格式,且輸出檔案名稱指定了影像檔案格式,則會自動選取 image2 多工器,因此先前的命令可以寫成

    ffmpeg -i in.avi -vsync cfr -r 1 'img-%03d.jpeg'
    

    另請注意,模式不一定必須包含 "%d" 或 "%0Nd",例如,若要從輸入視訊的開頭建立單個影像檔案 img.jpeg,您可以使用以下命令

    ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg
    
  • strftime 選項允許您使用日期和時間資訊展開檔案名稱。有關語法,請查看 strftime() 函數的文件。

    若要從 strftime() "%Y-%m-%d_%H-%M-%S" 模式產生影像檔案,可以使用以下 ffmpeg 命令

    ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1 "%Y-%m-%d_%H-%M-%S.jpg"
    
  • 使用目前影格的 PTS 設定檔案名稱
    ffmpeg -f v4l2 -r 1 -i /dev/video0 -copyts -f image2 -frame_pts true %d.jpg
    
  • 每秒將您的桌面內容直接發佈到 WebDAV 伺服器
    ffmpeg -f x11grab -framerate 1 -i :0.0 -q:v 6 -update 1 -protocol_opts method=PUT http://example.com/desktop.jpg
    

4.51 ircam

Berkeley / IRCAM / CARL Sound Filesystem (BICSF) 格式多工器。

Berkeley/IRCAM/CARL Sound Format,於 1980 年代開發,是幾種不同早期聲音檔案格式和系統合併的結果,包括由加州大學聖地牙哥分校 (UC San Diego) 電腦音訊研究實驗室 (CARL) 的 Gareth Loy 博士開發的 csound 系統、巴黎聲學/音樂研究所 (Institut de Recherche et Coordination Acoustique / Musique) 的 Rob Gross 和 Dan Timis 開發的 IRCAM 聲音檔案系統,以及 Berkeley Fast Filesystem。

它最初是作為 Berkeley/IRCAM/CARL Sound Filesystem 的一部分開發的,Berkeley/IRCAM/CARL Sound Filesystem 是一套旨在實作在 Berkeley UNIX 下運行的音訊應用程式檔案系統的程式。它在學術音樂研究中心特別受歡迎,並且在早期電腦生成作品的創作中多次使用。

此多工器接受包含 PCM 資料的單個音訊串流。

4.52 ivf

On2 IVF 多工器。

IVF 由 On2 Technologies(前身為 Duck Corporation)開發,用於儲存內部開發的編解碼器。

此多工器接受單個 ‘vp8’、‘vp9’ 或 ‘av1’ 視訊串流。

4.53 jacosub

JACOsub 字幕格式多工器。

此多工器接受單個 ‘jacosub’ 字幕串流。

有關格式的更多資訊,請參閱 http://unicorn.us.com/jacosub/jscripts.html

4.54 kvag

Simon & Schuster Interactive VAG 多工器。

此自訂 VAG 容器由一些 Simon & Schuster Interactive 遊戲使用,例如 "Real War" 和 "Real War: Rogue States"。

此多工器接受單個 ‘adpcm_ima_ssi’ 音訊串流。

4.55 lc3

藍牙 SIG 低複雜度通訊編碼解碼器音訊 (LC3),或 ETSI TS 103 634 低複雜度通訊編碼解碼器 plus (LC3plus)。

此多工器接受單個 ‘lc3’ 音訊串流。

4.56 lrc

LRC 歌詞檔案格式多工器。

LRC(LyRiCs 的縮寫)是一種電腦檔案格式,可將歌曲歌詞與音訊檔案(例如 MP3、Vorbis 或 MIDI)同步。

此多工器接受單個 ‘subrip’ 或 ‘text’ 字幕串流。

4.56.1 元數據

以下中繼資料標籤會轉換為格式對應的中繼資料

title
album
artist
author
creator
encoder
encoder_version

如果未明確設定 ‘encoder_version’,則會自動設定為 libavformat 版本。

4.57 matroska

Matroska 容器多工器。

此多工器實作 matroska 和 webm 容器規格。

4.57.1 元數據

此多工器中可辨識的中繼資料設定為

title

設定提供給單個軌道的標題名稱。這會映射到作為附件寫入的串流的 FileDescription 元素。

language

以 Matroska 語言形式指定軌道的語言。

語言可以是 3 個字母的書目 ISO-639-2 (ISO 639-2/B) 形式(例如法語的 "fre"),或語言代碼與國家/地區代碼混合,以表示語言的特殊性(例如加拿大法語的 "fre-ca")。

stereo_mode

設定單個視訊軌道中兩個視圖的立體 3D 視訊佈局。

可辨識以下值

mono

視訊不是立體的

left_right

兩個視圖並排排列,左眼視圖在左側

bottom_top

兩個視圖以頂部到底部的方向排列,左眼視圖在底部

top_bottom

兩個視圖以頂部到底部的方向排列,左眼視圖在頂部

checkerboard_rl

每個視圖都以棋盤交錯模式排列,左眼視圖優先

checkerboard_lr

每個視圖都以棋盤交錯模式排列,右眼視圖優先

row_interleaved_rl

每個視圖都由基於列的交錯構成,右眼視圖為第一列

row_interleaved_lr

每個視圖都由基於列的交錯構成,左眼視圖為第一列

col_interleaved_rl

兩個視圖都以基於行的交錯方式排列,右眼視圖為第一行

col_interleaved_lr

兩個視圖都以基於行的交錯方式排列,左眼視圖為第一行

anaglyph_cyan_red

所有影格都以可透過紅色-青色濾鏡觀看的浮雕格式

right_left

兩個視圖並排排列,右眼視圖在左側

anaglyph_green_magenta

所有影格都以可透過綠色-洋紅色濾鏡觀看的浮雕格式

block_lr

雙眼都以一個區塊交織在一起,左眼視圖優先

block_rl

雙眼都以一個區塊交織在一起,右眼視圖優先

例如,可以使用以下命令列建立 3D WebM 剪輯

ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm

4.57.2 選項

reserve_index_space size

預設情況下,此多工器會在檔案末尾寫入用於搜尋的索引(在 Matroska 術語中稱為 cues),因為它無法預先知道在檔案開頭要為索引保留多少空間。但是,對於某些使用案例(例如,搜尋是可能的但速度很慢的串流),將索引放在檔案開頭很有用。

如果此選項設定為非零值,則多工器將在檔案標頭中保留 size 位元組的空間,然後嘗試在多工處理完成時將 cues 寫入其中。如果保留的空間不足,則不會寫入任何 Cues,檔案將最終確定,並且寫入 trailer 將傳回錯誤。對於大多數使用案例來說,安全的大小應該約為每小時視訊 50kB。

請注意,只有在輸出可搜尋時才會寫入 cues,如果不是,則此選項將不起作用。

cues_to_front bool

如果設定,多工器將透過在必要時移動主要資料,將索引寫入檔案開頭。這可以與 reserve_index_space 結合使用,在這種情況下,只有在最初保留的空間不足時才會移動資料。

如果輸出不可搜尋,則會忽略此選項。

cluster_size_limit size

在一個叢集中最多儲存提供的位元組數。

如果未指定,則限制會自動設定為合理的硬式編碼固定值。

cluster_time_limit duration

在一個叢集中最多儲存提供的毫秒數。

如果未指定,則限制會自動設定為合理的硬式編碼固定值。

dash bool

建立符合 WebM DASH 規範的 WebM 檔案。預設情況下,它設定為 false

dash_track_number index

DASH 串流的軌道編號。預設情況下,它設定為 1

live bool

寫入檔案時假設它是即時串流。預設情況下,它設定為 false

allow_raw_vfw bool

允許原始 VFW 模式。預設情況下,它設定為 false

flipped_raw_rgb bool

如果設定為 true,則為原始 RGB 位圖儲存正高度,這表示位圖是以由下而上的方式儲存的。請注意,此選項不會翻轉位圖,必須事先手動完成翻轉,例如使用 ‘vflip’ 濾鏡。預設值為 false,表示位圖是以由上而下的方式儲存的。

write_crc32 bool

在每個 Level 1 元素內寫入 CRC32 元素。預設情況下,它設定為 true。WebM 會忽略此選項。

default_mode mode

控制將如何設定輸出軌道的 FlagDefault。它會影響播放器預設應播放哪些軌道。預設模式為 ‘passthrough’。

infer

每個具有 disposition default 的軌道都將設定 FlagDefault。此外,對於每種類型的軌道(音訊、視訊或字幕),如果不存在此類型的 disposition default 軌道,則此類型的第一個軌道將被標記為預設值(如果存在)。這確保即使輸入源自缺少預設軌道概念的容器,預設標記也會以合理的方式設定。

infer_no_subs

此模式與 infer 相同,不同之處在於,如果不存在 disposition default 的字幕軌道,則不會將任何字幕軌道標記為預設值。

passthrough

在此模式下,僅當對應串流的 disposition 中設定了 AV_DISPOSITION_DEFAULT 標記時,才會設定 FlagDefault。

4.58 md5

MD5 測試格式。

這是 hash 多工器的變體。與該多工器不同,它預設為使用 MD5 雜湊函數。

另請參閱 hashframemd5 多工器。

4.58.1 範例

  • 若要計算轉換為原始音訊和視訊的輸入的 MD5 雜湊,並將其儲存在檔案 out.md5
    ffmpeg -i INPUT -f md5 out.md5
    
  • 若要將 MD5 雜湊列印到 stdout
    ffmpeg -i INPUT -f md5 -
    

4.59 microdvd

MicroDVD 字幕格式多工器。

此多工器接受單個 ‘microdvd’ 字幕串流。

4.60 mmf

合成音樂行動應用程式格式 (SMAF) 格式多工器。

SMAF 是 Yamaha 為行動電話和個人數位助理等可攜式電子裝置指定的音樂資料格式。

此多工器接受單個 ‘adpcm_yamaha’ 音訊串流。

4.61 mp3

MP3 多工器寫入原始 MP3 串流,並具有以下可選功能

  • 開頭的 ID3v2 中繼資料標頭(預設啟用)。支援版本 2.3 和 2.4,id3v2_version 私人選項控制使用哪個版本(3 或 4)。將 id3v2_version 設定為 0 會完全停用 ID3v2 標頭。

    多工器支援將附加圖片 (APIC 影格) 寫入 ID3v2 標頭。圖片以具有單個封包的視訊串流形式提供給多工器。可以有任意數量的這些串流,每個串流將對應於單個 APIC 影格。串流中繼資料標籤 titlecomment 分別映射到 APIC descriptionpicture type。有關允許的圖片類型,請參閱 http://id3.org/id3v2.4.0-frames

    請注意,APIC 影格必須在開頭寫入,因此多工器將緩衝音訊影格,直到取得所有圖片。因此,建議盡快提供圖片,以避免過度緩衝。

  • ID3v2 標頭(如果存在)之後的 Xing/LAME 影格。預設情況下啟用,但僅在輸出可搜尋時才會寫入。write_xing 私人選項可用於停用它。該影格包含各種可能對解碼器有用的資訊,例如音訊持續時間或編碼器延遲。
  • 檔案末尾的舊版 ID3v1 標籤(預設停用)。可以使用 write_id3v1 私人選項啟用它,但由於其功能非常有限,因此不建議使用。

範例

寫入具有 ID3v2.3 標頭和 ID3v1 頁尾的 mp3

ffmpeg -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3

若要將圖片附加到 mp3 檔案,請使用 map 選取音訊和圖片串流

ffmpeg -i input.mp3 -i cover.png -c copy -map 0 -map 1
-metadata:s:v title="Album cover" -metadata:s:v comment="Cover (Front)" out.mp3

寫入沒有任何額外功能的「乾淨」MP3

ffmpeg -i input.wav -write_xing 0 -id3v2_version 0 out.mp3

4.62 mpegts

MPEG 傳輸串流多工器。

此多工器實作 ISO 13818-1 和 ETSI EN 300 468 的一部分。

mpegts 多工器中可辨識的中繼資料設定為 service_providerservice_name。如果未設定,則 service_provider 的預設值為 ‘FFmpeg’,service_name 的預設值為 ‘Service01’。

4.62.1 選項

多工器選項為

mpegts_transport_stream_id integer

設定 ‘transport_stream_id’。這會在 DVB 中識別轉發器。預設值為 0x0001

mpegts_original_network_id integer

設定 ‘original_network_id’。這是 DVB 中網路的唯一識別碼。其主要用途是透過路徑 ‘Original_Network_ID, Transport_Stream_ID’ 唯一識別服務。預設值為 0x0001

mpegts_service_id integer

設定 ‘service_id’,也稱為 DVB 中的節目。預設值為 0x0001

mpegts_service_type integer

設定節目 ‘service_type’。預設值為 digital_tv。接受以下選項

hex_value

ETSI 300 468 中定義的介於 0x010xff 之間的任何十六進位值。

digital_tv

數位電視服務。

digital_radio

數位廣播服務。

teletext

Teletext 服務。

advanced_codec_digital_radio

進階編碼解碼器數位廣播服務。

mpeg2_digital_hdtv

MPEG2 數位 HDTV 服務。

advanced_codec_digital_sdtv

進階編碼解碼器數位 SDTV 服務。

advanced_codec_digital_hdtv

進階編碼解碼器數位 HDTV 服務。

mpegts_pmt_start_pid integer

設定 PMT 的第一個 PID。預設值為 0x1000,最小值為 0x0020,最大值為 0x1ffa。此選項在 m2ts 模式下無效,在 m2ts 模式下,PMT PID 固定為 0x0100

mpegts_start_pid integer

設定基本串流的第一個 PID。預設值為 0x0100,最小值為 0x0020,最大值為 0x1ffa。此選項在 m2ts 模式下無效,在 m2ts 模式下,基本串流 PID 是固定的。

mpegts_m2ts_mode boolean

如果設定為 1,則啟用 m2ts 模式。預設值為 -1,這會停用 m2ts 模式。

muxrate integer

設定恆定多工速率。預設值為 VBR。

pes_payload_size integer

以位元組為單位設定最小 PES 封包酬載。預設值為 2930

mpegts_flags flags

設定 mpegts 標記。接受以下選項

resend_headers

在寫入下一個封包之前,重新發出 PAT/PMT。

latm

對 AAC 使用 LATM 封包化。

pat_pmt_at_frames

在每個視訊影格重新發出 PAT 和 PMT。

system_b

符合系統 B (DVB) 而不是系統 A (ATSC)。

initial_discontinuity

將每個串流的初始封包標記為不連續。

nit

發出 NIT 表格。

omit_rai

停用隨機存取指示器的寫入。

mpegts_copyts boolean

如果值設定為 1,則保留原始時間戳記。預設值為 -1,這會導致移動時間戳記,使其從 0 開始。

omit_video_pes_length boolean

省略視訊封包的 PES 封包長度。預設值為 1 (true)。

pcr_period integer

覆寫預設 PCR 重新傳輸時間(以毫秒為單位)。預設值為 -1,表示 PCR 間隔將自動確定:CBR 串流使用 20 毫秒,VBR 串流使用小於 100 毫秒的影格持續時間的最高倍數。

pat_period duration

PAT/PMT 表格之間的最大時間(以秒為單位)。預設值為 0.1

sdt_period duration

SDT 表格之間的最大時間(以秒為單位)。預設值為 0.5

nit_period duration

NIT 表格之間的最大時間(以秒為單位)。預設值為 0.5

tables_version integer

設定 PAT、PMT、SDT 和 NIT 版本(預設值為 0,有效值為 0 到 31,包含 0 和 31)。此選項允許更新串流結構,以便標準使用者可以偵測到變更。若要執行此操作,請重新開啟輸出 AVFormatContext(如果使用 API)或重新啟動 ffmpeg 執行個體,週期性地變更 tables_version

ffmpeg -i source1.ts -codec copy -f mpegts -tables_version 0 udp://1.1.1.1:1111
ffmpeg -i source2.ts -codec copy -f mpegts -tables_version 1 udp://1.1.1.1:1111
...
ffmpeg -i source3.ts -codec copy -f mpegts -tables_version 31 udp://1.1.1.1:1111
ffmpeg -i source1.ts -codec copy -f mpegts -tables_version 0 udp://1.1.1.1:1111
ffmpeg -i source2.ts -codec copy -f mpegts -tables_version 1 udp://1.1.1.1:1111
...

4.62.2 範例

ffmpeg -i file.mpg -c copy \
     -mpegts_original_network_id 0x1122 \
     -mpegts_transport_stream_id 0x3344 \
     -mpegts_service_id 0x5566 \
     -mpegts_pmt_start_pid 0x1500 \
     -mpegts_start_pid 0x150 \
     -metadata service_provider="Some provider" \
     -metadata service_name="Some Channel" \
     out.ts

4.63 mxf, mxf_d10, mxf_opatom

MXF 多工器。

4.63.1 選項

多工器選項為

store_user_comments bool

設定是否應儲存使用者註解(如果可用)或永不儲存。IRT D-10 不允許使用者註解。因此,預設設定為針對 mxf 和 mxf_opatom 寫入註解,但不針對 mxf_d10 寫入

4.64 null

Null 多工器。

此多工器不會產生任何輸出檔案,主要用於測試或基準測試。

例如,若要使用 ffmpeg 進行解碼基準測試,您可以使用以下命令

ffmpeg -benchmark -i INPUT -f null out.null

請注意,上述命令不會讀取或寫入 out.null 檔案,但 ffmpeg 語法要求指定輸出檔案。

或者,您可以將命令寫成

ffmpeg -benchmark -i INPUT -f null -

4.65 nut

-syncpoints flags

變更 nut 中的同步點使用方式

default 使用正常的低耗用尋找輔助。
none 完全不使用同步點,降低耗用但使串流無法尋找;

不建議使用此選項,因為產生的檔案非常容易損壞,且無法尋找。此外,一般來說,同步點的耗用可忽略不計。請注意,-write_index 0 可用於停用所有成長中的資料表,從而允許以有限的記憶體多工處理無盡的串流,且沒有這些缺點。

timestamped 使用時鐘牆欄位擴充同步點。

nonetimestamped 旗標為實驗性質。

-write_index bool

在結尾寫入索引,預設為寫入索引。

ffmpeg -i INPUT -f_strict experimental -syncpoints none - | processor

4.66 ogg

Ogg 容器多工器。

-page_duration duration

偏好的頁面持續時間,以微秒為單位。多工器將嘗試建立約 duration 微秒長的頁面。這允許使用者在尋找粒度和容器耗用之間取得平衡。預設值為 1 秒。值為 0 將填滿所有區段,使頁面盡可能大。值為 1 在大多數情況下將有效地使用每個頁面 1 個封包,從而在增加容器耗用的情況下提供較小的尋找粒度。

-serial_offset value

用於設定串流序號的序號值。將其設定為不同且足夠大的值可確保產生的 ogg 檔案可以安全地鏈結。

4.67 rcwt

RCWT(Raw Captions With Time,含時間原始字幕)是 ccextractor 的原生格式,ccextractor 是一種常用的開放原始碼工具,用於處理 608/708 隱藏式字幕 (CC) 來源。它可用於封存原始擷取的 CC 位元串流,並產生來源檔案以供日後處理或轉換。此格式允許 ccextractor 和 FFmpeg 之間的互通性,易於剖析,並且可用於建立 CC 簡報的備份。

此多工器實作截至 2024 年 3 月的規格,該規格自 2014 年 4 月以來一直穩定且未變更。

此多工器在多工處理 RCWT 的方式上會與 ccextractor 有些許差異。到目前為止,尚未觀察到使用 ccextractor 處理輸出時出現相容性問題,但結果可能因情況而異,且輸出將不會完全相同。

RCWT 的免費規格可在此處找到:https://github.com/CCExtractor/ccextractor/blob/master/docs/BINARY_FILE_FORMAT.TXT

4.67.1 範例

  • 使用 lavfi 將隱藏式字幕擷取至 RCWT
    ffmpeg -f lavfi -i "movie=INPUT.mkv[out+subcc]" -map 0:s:0 -c:s copy -f rcwt CC.rcwt.bin
    

4.68 segment, stream_segment, ssegment

基本串流分段器。

此多工器將串流輸出到許多持續時間幾乎固定的個別檔案。輸出檔案名稱模式可以類似於 image2 的方式設定,或者如果啟用 strftime 選項,則可以使用 strftime 範本。

stream_segment 是用於寫入串流輸出格式的多工器的變體,即不需要全域標頭的格式,建議用於輸出至 MPEG 傳輸串流區段等。ssegmentstream_segment 的較短別名。

每個區段都以所選參考串流的關鍵影格開始,該參考串流透過 reference_stream 選項設定。

請注意,如果您想要精確分割視訊檔案,則需要使輸入關鍵影格對應於分段器預期的確切分割時間,否則區段多工器將以在指定開始時間之後找到的下一個關鍵影格開始新的區段。

區段多工器最適合單一恆定影格速率視訊。

您可以選擇設定選項 segment_list 來產生已建立區段的清單。segment_list_type 選項指定清單類型。預設情況下,區段清單中的項目檔案名稱設定為對應區段檔案的基本名稱。

另請參閱 hls 多工器,它為 HLS 分割提供更具體的實作。

4.68.1 選項

區段多工器支援以下選項

increment_tc 1|0

如果設定為 1,則在每個區段之間遞增時間碼。如果選擇此選項,則輸入需要在第一個視訊串流中具有時間碼。預設值為 0

reference_stream specifier

設定參考串流,由字串 specifier 指定。如果 specifier 設定為 auto,則會自動選擇參考。否則,它必須是串流規範(請參閱 ffmpeg 手冊中的「串流規範」章節),指定參考串流。預設值為 auto

segment_format format

覆寫內部容器格式,預設情況下會由檔案名稱副檔名猜測。

segment_format_options options_list

使用以冒號分隔的 key=value 參數清單設定輸出格式選項。包含 : 特殊字元的值必須逸出。

segment_list name

也產生名為 name 的清單檔案。如果未指定,則不會產生清單檔案。

segment_list_flags flags

設定影響區段清單產生的旗標。

目前支援以下旗標

cache

允許快取(僅影響 M3U8 清單檔案)。

live

允許產生即時友善檔案。

segment_list_size size

更新清單檔案,使其最多包含 size 個區段。如果為 0,清單檔案將包含所有區段。預設值為 0。

segment_list_entry_prefix prefix

在每個項目前面加上 prefix。適用於產生絕對路徑。預設情況下不套用前置詞。

segment_list_type type

選取清單格式。

可辨識以下值

flat

為建立的區段產生平面清單,每行一個區段。

csv, ext

為建立的區段產生清單,每行一個區段,每行符合格式(逗號分隔值)

segment_filename,segment_start_time,segment_end_time

segment_filename 是多工器根據提供的模式產生的輸出檔案名稱。如果需要,則會套用 CSV 逸出(根據 RFC4180)。

segment_start_timesegment_end_time 指定區段開始和結束時間(以秒為單位)。

副檔名為 ".csv"".ext" 的清單檔案將自動選取此格式。

ext’ 已棄用,改用 ‘csv’。

ffconcat

為建立的區段產生 ffconcat 檔案。可以使用 FFmpeg concat 解多工器讀取產生的檔案。

副檔名為 ".ffcat"".ffconcat" 的清單檔案將自動選取此格式。

m3u8

產生延伸的 M3U8 檔案,版本 3,符合 http://tools.ietf.org/id/draft-pantos-http-live-streaming

副檔名為 ".m3u8" 的清單檔案將自動選取此格式。

如果未指定類型,則會從清單檔案名稱副檔名猜測類型。

segment_time time

將區段持續時間設定為 time,該值必須是持續時間規格。預設值為 "2"。另請參閱 segment_times 選項。

請注意,除非您在給定時間強制參考串流關鍵影格,否則分割可能不準確。請參閱簡介通知和以下範例。

min_seg_duration time

將最小區段持續時間設定為 time,該值必須是持續時間規格。這可防止多工器在低於此值的持續時間結束區段。僅在 segment_time 有效。預設值為 "0"。

segment_atclocktime 1|0

如果設定為 "1",則從 00:00 時鐘開始以規律的時鐘時間間隔分割。segment_time 中指定的 time 值用於設定分割間隔的長度。

例如,將 segment_time 設定為 "900" 可在 12:00、12:15、12:30 等時間建立檔案。

預設值為 "0"。

segment_clocktime_offset duration

使用 segment_atclocktime 時,以指定的持續時間延遲區段分割時間。

例如,將 segment_time 設定為 "900",將 segment_clocktime_offset 設定為 "300" 可在 12:05、12:20、12:35 等時間建立檔案。

預設值為 "0"。

segment_clocktime_wrap_duration duration

強制分段器僅在封包在分段時鐘時間後指定持續時間內到達多工器時才開始新的區段。這樣,您可以使分段器更能適應向後本機時間跳躍,例如閏秒或從日光節約時間過渡到標準時間。

預設值為最大可能持續時間,這表示無論自上次時鐘時間以來經過的時間長短,都將開始新的區段。

segment_time_delta delta

指定選擇區段開始時間時的精確度時間,以持續時間規格表示。預設值為 "0"。

當指定 delta 時,如果關鍵影格的 PTS 滿足以下關係,則關鍵影格將開始新的區段

PTS >= start_time - time_delta

當分割視訊內容時,此選項很有用,視訊內容始終在 GOP 邊界分割,以防在指定的分割時間之前找到關鍵影格。

特別是可以與 ffmpeg 選項 force_key_frames 結合使用。force_key_frames 指定的關鍵影格時間可能由於捨入問題而未精確設定,因此關鍵影格時間可能導致設定在指定時間之前。對於恆定影格速率視訊,1/(2*frame_rate) 的值應解決指定時間與 force_key_frames 設定的時間之間的最差情況不符。

segment_times times

指定分割點清單。times 包含以逗號分隔的持續時間規格清單,依遞增順序排列。另請參閱 segment_time 選項。

segment_frames frames

指定分割視訊影格編號清單。frames 包含以逗號分隔的整數數字清單,依遞增順序排列。

此選項指定每當找到參考串流關鍵影格且影格的序號(從 0 開始)大於或等於清單中的下一個值時,都開始新的區段。

segment_wrap limit

在區段索引達到 limit 時環繞。

segment_start_number number

設定第一個區段的序號。預設為 0

strftime 1|0

使用 strftime 函數定義要寫入的新區段名稱。如果選擇此選項,則輸出區段名稱必須包含 strftime 函數範本。預設值為 0

break_non_keyframes 1|0

如果啟用,則允許區段在關鍵影格以外的影格上開始。當關鍵影格之間的時間不一致時,這可以改善某些播放器的行為,但可能會使其他播放器的情況更糟,並可能在尋找期間造成一些異常。預設為 0

reset_timestamps 1|0

在每個區段的開頭重設時間戳記,以便每個區段都以接近零的時間戳記開始。這旨在簡化產生區段的播放。可能不適用於某些多工器/編解碼器的組合。預設設定為 0

initial_offset offset

指定要套用於輸出封包時間戳記的時間戳記偏移量。引數必須是持續時間規格,預設為 0。

write_empty_segments 1|0

如果啟用,如果在區段通常跨越的期間內沒有封包,則寫入空區段。否則,區段將填入下一個寫入的封包。預設為 0

請務必在編碼時要求封閉式 GOP,並設定 GOP 大小以符合您的區段時間限制。

4.68.2 範例

  • 將檔案 in.mkv 的內容重新多工處理到區段清單 out-000.nutout-001.nut 等,並將產生的區段清單寫入 out.list
    ffmpeg -i in.mkv -codec hevc -flags +cgop -g 60 -map 0 -f segment -segment_list out.list out%03d.nut
    
  • 區段輸入並設定輸出區段的輸出格式選項
    ffmpeg -i in.mkv -f segment -segment_time 10 -segment_format_options movflags=+faststart out%03d.mp4
    
  • 根據 segment_times 選項指定的分割點分割輸入檔案
    ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 out%03d.nut
    
  • 使用 ffmpeg force_key_frames 選項強制輸入中指定位置的關鍵影格,以及區段選項 segment_time_delta 以考量設定關鍵影格時間時可能發生的捨入。
    ffmpeg -i in.mkv -force_key_frames 1,2,3,5,8,13,21 -codec:v mpeg4 -codec:a pcm_s16le -map 0 \
    -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 out%03d.nut
    

    為了強制輸入檔案中的關鍵影格,需要轉碼。

  • 透過根據 segment_frames 選項指定的影格編號序列分割輸入檔案來區隔輸入檔案
    ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_frames 100,200,300,500,800 out%03d.nut
    
  • 使用 libx264aac 編碼器將 in.mkv 轉換為 TS 區段
    ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a aac -f ssegment -segment_list out.list out%03d.ts
    
  • 分割輸入檔案,並建立 M3U8 即時播放清單(可用作即時 HLS 來源)
    ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
    -segment_list_flags +live -segment_time 10 out%03d.mkv
    

4.69 smoothstreaming

Smooth Streaming 多工器產生一組檔案(資訊清單、區塊),適用於使用傳統網頁伺服器提供服務。

window_size

指定資訊清單中保留的片段數量。預設值為 0(保留全部)。

extra_window_size

指定從磁碟移除之前在資訊清單外保留的片段數量。預設值為 5。

lookahead_count

指定前瞻片段的數量。預設值為 2。

min_frag_duration

指定最小片段持續時間(以微秒為單位)。預設值為 5000000。

remove_at_exit

指定是否在完成時移除所有片段。預設值為 0(不移除)。

4.70 streamhash

每個串流雜湊測試格式。

此多工器計算並列印每個串流的所有輸入影格的加密雜湊。這可用於相等性檢查,而無需執行完整的二進位比較。

預設情況下,音訊影格會轉換為帶正負號的 16 位元原始音訊,而視訊影格則轉換為原始視訊,然後再計算雜湊值,但也可以使用明確轉換為其他編碼解碼器的輸出。時間戳記會被忽略。預設情況下,它使用 SHA-256 密碼編譯雜湊函式,但支援數種其他演算法。

多工器的輸出由每行一個串流組成,格式為:streamindex,streamtype,algo=hash,其中 streamindex 是對應串流的索引,streamtype 是指示串流類型的單一字元,algo 是表示所用雜湊函數的簡短字串,而 hash 是表示計算雜湊的十六進位數字。

hash algorithm

使用字串 algorithm 指定的密碼編譯雜湊函式。支援的值包括 MD5murmur3RIPEMD128RIPEMD160RIPEMD256RIPEMD320SHA160SHA224SHA256(預設值)、SHA512/224SHA512/256SHA384SHA512CRC32adler32

4.70.1 範例

若要計算輸入轉換為原始音訊和視訊的 SHA-256 雜湊值,並將其儲存在檔案 out.sha256

ffmpeg -i INPUT -f streamhash out.sha256

若要將 MD5 雜湊值列印到 stdout,請使用命令

ffmpeg -i INPUT -f streamhash -hash md5 -

另請參閱 hashframehash 多工器。

4.71 tee

tee 多工器可用於將相同的資料寫入多個輸出,例如檔案或串流。例如,它可用於透過網路串流視訊,並同時將其儲存到磁碟。

它與為 ffmpeg 命令列工具指定多個輸出不同。使用 tee 多工器,音訊和視訊資料將僅編碼一次。使用傳統的多個輸出,將並行啟動多個編碼操作,這可能是一個非常昂貴的過程。當直接使用 libavformat API 時,tee 多工器沒有用處,因為那時可以直接將相同的封包饋送到多個多工器。

由於 tee 多工器不代表任何特定的輸出格式,因此 ffmpeg 無法自動選取輸出串流。因此,所有預定用於輸出的串流都必須使用 -map 指定。請參閱以下範例。

某些編碼器可能需要根據輸出格式使用不同的選項;tee 多工器無法自動偵測到這一點,因此需要明確指定。主要範例是 global_header 旗標。

從屬輸出在給定多工器的檔案名稱中指定,以 '|' 分隔。如果任何從屬名稱包含 '|' 分隔符號、前導或尾隨空格或任何特殊字元,則必須逸出這些字元(請參閱 (ffmpeg-utils)ffmpeg-utils(1) 手冊中的「引號和逸出」章節)。

4.71.1 選項

use_fifo bool

如果設定為 1,則從屬輸出將使用 fifo 多工器在個別執行緒中處理。這允許補償輸出的不同速度/延遲/可靠性,並設定透明復原。預設情況下,此功能已關閉。

fifo_options

要傳遞給 fifo 虛擬多工器執行個體的選項。請參閱 fifo

可以為每個從屬指定多工器選項,方法是在方括號之間以 ':' 分隔的 key=value 配對清單形式在其前面加上這些選項。如果選項值包含特殊字元或 ':' 分隔符號,則必須逸出這些字元;請注意,這是第二層逸出。

也識別以下特殊選項

f

指定格式名稱。如果無法從輸出 URL 猜測,則為必要選項。

bsfs[/spec]

指定要套用於指定輸出的位元串流篩選器清單。

可以透過將串流規範附加到以 / 分隔的選項,來指定給定位元串流篩選器套用至哪些串流。spec 必須是串流規範(請參閱 格式串流規範)。

如果未指定串流規範,則位元串流篩選器將套用於輸出中的所有串流。如果輸出包含無法套用位元串流篩選器的串流,例如將 h264_mp4toannexb 套用於包含音訊串流的輸出,則這將導致輸出操作失敗。

位元串流篩選器的選項必須以 opt=value 的形式指定。

可以指定多個位元串流篩選器,以 "," 分隔。

use_fifo bool

這允許覆寫個別從屬多工器的 tee 多工器 use_fifo 選項。

fifo_options

這允許覆寫個別從屬多工器的 tee 多工器 fifo_options。請參閱 fifo

select

選取應對應到從屬輸出的串流,由串流規範指定。如果未指定,則預設為所有對應的串流。如果輸出格式不接受所有對應的串流,則這將導致輸出操作失敗。

您可以使用以逗號 (,) 分隔的多個串流規範,例如:a:0,v

onfail

指定輸出失敗時的行為。可以將其設定為 abort(預設值)或 ignoreabort 將在從屬輸出失敗時導致整個程序失敗。ignore 將忽略此輸出上的失敗,因此其他輸出將繼續而不受影響。

4.71.2 範例

  • 編碼某些內容,並將其封存到 WebM 檔案中,並透過 UDP 將其串流為 MPEG-TS
    ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a
      "archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
    
  • 與上述相同,但即使輸出到本機檔案失敗(例如本機磁碟已滿),也繼續串流
    ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a
      "[onfail=ignore]archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
    
  • 使用 ffmpeg 編碼輸入,並將輸出傳送到三個不同的目的地。dump_extra 位元串流篩選器用於將額外資料資訊新增至所有輸出視訊關鍵影格封包,這是 MPEG-TS 格式要求的。select 選項套用於 out.aac,以便使其僅包含音訊封包。
    ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac
           -f tee "[bsfs/v=dump_extra=freq=keyframe]out.ts|[movflags=+faststart]out.mp4|[select=a]out.aac"
    
  • 與上述相同,但僅為音訊輸出選取串流 a:1。請注意,必須執行第二層逸出,因為 ":" 是用於分隔選項的特殊字元。
    ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac
           -f tee "[bsfs/v=dump_extra=freq=keyframe]out.ts|[movflags=+faststart]out.mp4|[select=\'a:1\']out.aac"
    

4.72 webm_chunk

WebM 即時區塊多工器。

此多工器將 WebM 標頭和區塊寫出為個別檔案,支援 WebM 即時串流的用戶端可以取用這些檔案(透過 DASH)。

4.72.1 選項

此多工器支援以下選項

chunk_start_index

第一個區塊的索引(預設為 0)。

header

將在其中寫入初始化資料的標頭檔案名稱。

audio_chunk_duration

每個音訊區塊的持續時間(以毫秒為單位)(預設為 5000)。

4.72.2 範例

ffmpeg -f v4l2 -i /dev/video0 \
       -f alsa -i hw:0 \
       -map 0:0 \
       -c:v libvpx-vp9 \
       -s 640x360 -keyint_min 30 -g 30 \
       -f webm_chunk \
       -header webm_live_video_360.hdr \
       -chunk_start_index 1 \
       webm_live_video_360_%d.chk \
       -map 1:0 \
       -c:a libvorbis \
       -b:a 128k \
       -f webm_chunk \
       -header webm_live_audio_128.hdr \
       -chunk_start_index 1 \
       -audio_chunk_duration 1000 \
       webm_live_audio_128_%d.chk

4.73 webm_dash_manifest

WebM DASH 資訊清單多工器。

此多工器實作 WebM DASH 資訊清單規格以產生 DASH 資訊清單 XML。它也支援為 DASH 即時串流產生資訊清單。

如需更多資訊,請參閱

4.73.1 選項

此多工器支援以下選項

adaptation_sets

此選項具有以下語法:「id=x,streams=a,b,c id=y,streams=d,e」,其中 x 和 y 是自適應集 (adaptation set) 的唯一識別碼,而 a、b、c、d 和 e 是對應音訊和視訊串流的索引。可以使用此選項新增任意數量的自適應集。

live

將此項設定為 1 以建立即時串流 DASH 資訊清單。預設值:0。

chunk_start_index

第一個區塊的起始索引。這將進入資訊清單中 ‘SegmentTemplate’ 元素的 ‘startNumber’ 屬性。預設值:0。

chunk_duration_ms

每個區塊的持續時間(以毫秒為單位)。這將進入資訊清單中 ‘SegmentTemplate’ 元素的 ‘duration’ 屬性。預設值:1000。

utc_timing_url

將傳回 ISO 格式 UTC 時間戳記的頁面 URL。這將進入資訊清單中 ‘UTCTiming’ 元素的 ‘value’ 屬性。預設值:無。

time_shift_buffer_depth

任何 Representation 保證可用的最小時間(以秒為單位)移位緩衝區。這將進入 ‘MPD’ 元素的 ‘timeShiftBufferDepth’ 屬性。預設值:60。

minimum_update_period

資訊清單的最小更新週期(以秒為單位)。這將進入 ‘MPD’ 元素的 ‘minimumUpdatePeriod’ 屬性。預設值:0。

4.73.2 範例

ffmpeg -f webm_dash_manifest -i video1.webm \
       -f webm_dash_manifest -i video2.webm \
       -f webm_dash_manifest -i audio1.webm \
       -f webm_dash_manifest -i audio2.webm \
       -map 0 -map 1 -map 2 -map 3 \
       -c copy \
       -f webm_dash_manifest \
       -adaptation_sets "id=0,streams=0,1 id=1,streams=2,3" \
       manifest.xml

5 元數據

FFmpeg 能夠將媒體檔案的中繼資料傾印到簡單的 UTF-8 編碼類 INI 文字檔案中,然後使用中繼資料多工器/解多工器將其載回。

檔案格式如下

  1. 檔案由標頭和許多中繼資料標籤組成,這些標籤分為多個區段,每個區段各佔一行。
  2. 標頭是 ‘;FFMETADATA’ 字串,後跟版本號碼(目前為 1)。
  3. 中繼資料標籤的格式為 ‘key=value
  4. 緊接在標頭之後的是全域中繼資料
  5. 全域中繼資料之後,可能會有包含每個串流/每個章節中繼資料的區段。
  6. 區段以大寫區段名稱(即 STREAM 或 CHAPTER)括在括號 (‘[’、‘]’) 中開始,並以區段結束或檔案結尾結束。
  7. 在章節區段的開頭,可能會有一個可選的時間基底,用於開始/結束值。它必須採用 ‘TIMEBASE=num/den’ 格式,其中 numden 是整數。如果時間基底遺失,則開始/結束時間假定為奈秒。

    接下來,章節區段必須包含章節開始和結束時間,格式為 ‘START=num’、‘END=num’,其中 num 是正整數。

  8. 空白行和以 ‘;’ 或 ‘#’ 開頭的行會被忽略。
  9. 包含特殊字元(‘=’、‘;’、‘#’、‘\’ 和換行符號)的中繼資料鍵或值必須使用反斜線 ‘\’ 逸出。
  10. 請注意,中繼資料中的空白字元(例如 ‘foo = bar’)被視為標籤的一部分(在上面的範例中,鍵為 ‘foo ’,值為 ‘ bar’)。

ffmetadata 檔案可能如下所示

;FFMETADATA1
title=bike\\shed
;this is a comment
artist=FFmpeg troll team

[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line

透過使用 ffmetadata 多工器和解多工器,可以從輸入檔案中擷取中繼資料到 ffmetadata 檔案,然後使用編輯過的中繼資料檔案將檔案轉碼為輸出檔案。

使用 ffmpeg 擷取 ffmetadata 檔案的步驟如下

ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE

可以透過以下方式重新插入來自 FFMETADATAFILE 檔案的已編輯中繼資料資訊

ffmpeg -i INPUT -i FFMETADATAFILE -map_metadata 1 -codec copy OUTPUT

6 參見

ffmpegffplayffprobelibavformat

7 作者

FFmpeg 開發人員。

有關作者身份的詳細資訊,請參閱專案的 Git 歷史記錄 (https://git.ffmpeg.org/ffmpeg),例如,在 FFmpeg 原始碼目錄中輸入命令 git log,或瀏覽位於 https://git.ffmpeg.org/ffmpeg 的線上存放庫。

特定元件的維護人員列在原始碼樹狀結構中的 MAINTAINERS 檔案中。

本文件於 2025 年 1 月 21 日 使用 makeinfo 產生。

託管由 telepoint.bg 提供