REF: wanglongqi.github.io/tools/2015/02/13/ffmpegcn/
1. 概要
ffmpeg [global_options] {[input_file_options] -i INPUT_FILE} ... {[output_file_options] OUTPUT_FILE} ...
2. 說明
ffmpeg是一個非常快的視頻和音頻轉換器,還可以抓取實時的音頻/視頻流。它可以在任意的採樣率之間的轉換和調整視頻,並同時使用高品質的多相濾波器。
ffmpeg從輸入“檔案”(其可以是常規檔案,管道,網路流,錄製裝置等),由指定任意數量的讀取-i選項,並寫入到任意數量的輸出“檔案”,只需指定一個輸出的檔案名稱。任何一個命令行中不能被解釋為選項的內容都被認為是一個輸出檔案名稱。
每個輸入或輸出檔案可以在原則上,包含任意數量的不同類型(視頻/音頻/字幕/附屬檔案/數據)的流。輸出檔案中允許流的數量和類型是由輸出格式容器限制決定的。輸入流和輸出流直接的映射可以自動完成也可以用-map選項給定(見流選擇章節)。
引用輸入檔案的選項時,則必須使用他們的索引(從0開始)。例如:第一輸入檔案是0,第二個是1等。類似地,一個檔案中的流也通過其索引指定。例如2:3指的是在第三個輸入檔案中的第四數據流。參見流章節。
作為一般規則,選項作用於下一個指定的檔案。因此,命令的順序是重要,你可以在命令行上多次相同的選項。每次選項的出現都將作用於下一個輸入或輸出檔案。這條規則若有例外將會提前聲明(例如冗餘級別)。
不要混合輸入和輸出檔案。首先指定所有輸入檔案,那么所有的輸出檔案。也不要混用屬於不同的檔案的選項。所有選項僅適用於下一個輸入或輸出檔案,之後選項將被重置。
設定輸出檔案以64千比特/秒的視頻比特率:
ffmpeg -i input.avi -b:V 64K -bufsize 64K output.avi
要強制輸出檔案為24 fps的幀速率:
ffmpeg -i input.avi -r 24 output.avi
要強制輸入檔案的幀頻(僅對原始格式有效),以1 FPS讀入檔案,以每秒24幀的幀速率輸出:
ffmpeg -r 1 -i input.m2v -r 24 output.avi
format選項可能需要指定,對於原始輸入檔案。
3. 詳細描述
在轉碼過程ffmpeg每個輸出可以由以下圖描述:
_______ ______________| | | || input | demuxer | encoded data | decoder| file | ---------> | packets | -----+|_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ || | | | || output | <-------- | encoded data | <----+| file | muxer | packets | encoder|________| |______________|
ffmpeg調用libavformat庫(含分流器)來讀取輸入檔案並獲得含有他們編碼信息的數據包。當有多個輸入檔案,ffmpeg將通過跟蹤最小的時間戳來試圖在所有活躍的輸入流間同步。編碼的數據包然後被傳遞到解碼器(除非複製音頻流被選擇用於流,見進一步的說明)。解碼器產生的未壓縮的幀(原始視頻/ PCM音頻/ …),它可以進一步通過濾鏡進行處理(見下一節)。通過濾鏡後,這些幀被傳遞到編碼器,編碼器將其編碼並輸出編碼後的數據包。最後,這些將被傳輸給混合器以將編碼數據寫入到輸出檔案。
3.1 濾鏡
在編碼之前,ffmpeg可以使用libavfilter庫中的濾鏡處理原始的音頻和視頻幀。幾個連線的濾鏡可以形成一個濾鏡組(filtergraphs)。ffmpeg有兩種filtergraphs:簡單和複雜。
3.1.1 簡單filtergraphs
簡單filtergraphs是那些具有相同的類型且正好一個輸入和輸出的濾鏡組。另外,在上圖中,他們可以由簡單地在解碼和編碼之間插入附加步驟來表示:
_________ ______________| | | || decoded | | encoded data || frames |\ _ | packets ||_________| \ /||______________| \ __________ / simple_\||| / encoder filtergraph | filtered |/ | frames | |__________|
簡單filtergraphs配置了每個流的篩選器選項(與視頻和音頻分別-vf和-af別名)。一個簡單的FilterGraph動態視頻可以看一下這樣的例子:
_______ _____________ _______ ________| | | | | | | || input | ---> | deinterlace | ---> | scale | ---> | output ||_______| |_____________| |_______| |________|
需要注意的是一些濾鏡改變幀屬性而不是畫面的內容。例如,在上例中,fps改變幀的數量,但不觸及幀的內容。又如setpts濾鏡,其僅設定時間戳而保持幀不變。
3.1.2 複雜filtergraphs
複雜filtergraphs是那些不能被描述為簡單的線性處理鏈的濾鏡組。例如,當濾鏡組具有多個輸入和/或輸出,或當輸出流的類型是不同於輸入。它們可以被表示為以下圖:
_________| || input 0 |\__________|_________| \ || \ _________ /| output 0 | \ | | / |__________| _________\| complex | /| || |/| input 1 |---->| filter ||_________|| | \ __________/| graph | \ || / | | \| output 1 | _________ / |_________| |__________|| | /| input 2 |/|_________|
複雜filtergraphs可使用-filter_complex選項配置。注意,此選項是全局性的,因為複雜FilterGraph,就其本質,不能明確地與單個流或檔案相關聯。
-lavfi選項相當於-filter_complex。
一個複雜FilterGraph動態的簡單的例子是在overlay濾鏡,它具有兩個視頻輸入和一個視頻輸出,含有一個視頻重疊在另一個的上面。其對應的音頻濾鏡是amix。
3.2 複製流
複製流是通過添加copy選項到-codec選項完成的。它使ffmpeg對指定的流忽略解碼和編碼步驟,所以它只能混合和拆包。它用於改變所述容器的格式或修改容器級別的元數據是有用的。在這種情況下,可以簡化為這樣:
_______ ______________ ________| | | || || input | demuxer | encoded data | muxer | output || file | ---------> | packets | -------> | file ||_______| |______________||________|
由於不存在解碼或編碼,它是非常快,沒有質量損失。然而因為許多因素的工作,它可能無法在某些情況下使用。套用濾鏡顯然也是不可能的,因為濾鏡僅能作用在未壓縮的數據上。
4 選擇流
默認情況下,ffmpeg只包含輸入檔案中每個類型流各一個(視頻,音頻,字幕),並將它們添加到每個輸出檔案。它選擇“最好”的每一個流基於以下標準:用於視頻,它選擇最高解析度的流;對於音頻,它使用最多聲道的流;對於字幕,它是第一個字幕流。在相同類型中,參數相等的若干流中具有最低索引的流被選擇。
您可以通過-vn/-an/-sn選項禁用其中的一些默認值。若需全手動控制,請使用-map選項,它將禁用剛才所描述的默認設定。
5 選項
所有的數值選項中,如果不另外指明,均表示接受數作為輸入,其後可添加一個SI單位的字元串,例如:K,M,或G。
如果i被附加在SI單位,完整的前綴將被解釋為一個單元前綴的二進制倍數,也即1024倍,而不是1000倍。追加B可使數值增加8倍。這允許使用,例如:KB,MiB,G和B的數量後綴。
選項??不帶參數是布爾選項,並設定相應的值設定為true。他們可以通過在選項前添加no來將選項設定為false。例如使用-nofoo將設定名稱為foo為假。
5.1 流標識符
有些選項是按流的,例如比特率或編解碼器。流標識符被用來精確地指定一個給定的選項作用於哪一個數據流(多個)。
一個標識符一般是選項名稱加冒號分隔的字元串。例如-codec:a:1 ac3包含流標識符a:1,它匹配第二音頻流。因此,將選擇AC3編解碼器的第二音頻流。
一個標識符可以匹配多個流,這個選項將適用於所有流。比如,流標識符-b:a 128k標識了所有的音頻流。
空標識符匹配所有的流。例如,-codec copy或-codec: copy會複製所有的數據流而不重新編碼。
流標識符的可能形式有:
stream_index
匹配與該索引對應的流。例如-threads:1 4將設定第二個流的執行緒計數為4。
stream_type[:stream_index]
流類型是下列字母之一:v為視頻,a為聲音,s為字幕,d為數據,t為附屬檔案。如果stream_index給出,則它匹配該類型的索引為stream_index的流。否則,它匹配所有這種類型的流。
p:program_id[:stream_index]
如果給定stream_index,那其將與在與ID為program_id的program的stream_index的流相匹配。否則,它將匹配在program_id中的所有流。
#stream_id或者i:stream_id
按流索引逐一匹配流(如在MPEG-TS容器中的PID)。
m:key[:value]
匹配流的元數據標籤中具有指定key的流。如果value沒有給出,將匹配包含給定標籤的所有流。
請注意,在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`選項來獲得所有濾鏡的列表。
-version
顯示的版本。
-formats
顯示可用的格式(包括設備)。
-devices
顯示可用的設備。
-codecs
顯示libavcodec已知的所有編解碼器。
注意,整個文檔中術語“解碼器”更正確地稱呼是比特流媒體格式(media bitstream format)。
-decoders
顯示可用的解碼器。
-encoders
顯示所有可用的編碼器。
-bsfs
顯示可用的流濾鏡。
-protocols
顯示可用的協定。
-filters
顯示可用的libavfilter濾鏡。
-pix_fmts
顯示可用的像素格式。
-sample_fmts
顯示可用的採樣格式。
-layouts
顯示頻道名稱和標準的渠道布局。
-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 [repeat+]loglevel | -v [repeat+]loglevel
設定庫使用的日誌記錄級別。加入repeat+表示重複日誌輸出不應該被壓縮到所述第一條日誌和“最後的日誌重複n次”線將被省略。repeat,也可以單獨使用。如果repeat可以單獨使用,並沒有預設的記錄級別,默認記錄級將被使用。如果給定多個日誌級別參數,使用repeat不會改變日誌級別。loglevel是一個字元串或數字,可為以下值之一:
`quiet, -8`保持沉默。`panic, 0`只顯示可能導致程式崩潰的致命錯誤。目前沒有此類錯誤。`fatal, 8`只顯示致命錯誤。這些錯誤會導致進程絕對無法繼續。`error, 16`顯示所有的錯誤,包括那些可以修復的。`warning, 24`顯示所有警告和錯誤。將顯示任何有關可能不正確或不正常事件的信息。`info, 32`顯示處理過程中的信息。不單單是警告和錯誤。這是默認值。`verbose, 40`與info類似 ,但更詳細。`debug, 48`顯示一切信息,包括調試信息。默認情況下,程式日誌輸出到標準錯誤流,如果終端支持著色,顏色用來標記錯誤和警告。日誌著色可以被環境變數AV_LOG_FORCE_NOCOLOR或NO_COLOR ,或者可以被強制設定環境變數AV_LOG_FORCE_COLOR 禁用。使用環境變數NO_COLOR已被棄用,並在之後的FFmpeg的版本將被丟棄。
-report
轉儲完整的命令行和控制台輸出到當前目錄一個檔案名稱 ??為program - YYYYMMDD - HHMMSS .log的檔案。此檔案對於錯誤報告非常有用。這也意味著-loglevel verbose。
將環境變數設定FFREPORT為任何值具有相同的效果。如果該值是一個’:’ - 分隔鍵=值序列,這些選項會影響報表;如果包含特殊字元則需要使用轉義字元,或者“:”分隔(參見的ffmpeg-utils的手冊中的“引用與轉義”一節)。
下列選項也可使用:
`file`設定報告使用的檔案名稱??; %p添加程式名, %t添加時間戳, %%添加一個普通的%`level`設定使用的數值(查看日誌詳細級別`-loglevel` )。
例如,要輸出到名為ffreport.log使用的一個日誌級別檔案的報告32 (日誌級別info的別稱 ):
FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
非致命的環境變數的解析錯誤不會出現在報告中。
-hide_banner
不列印橫幅。
所有FFmpeg的工具通常會顯示一個著作權聲明,構建選項和庫版本。此選項可以用來抑制列印此信息。
-cpuflags flags (global)
允許設定和清除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’ ‘xop’ ‘fma4’ ‘3dnow’ ‘3dnowext’ ‘cmov’`ARM` ‘armv5te’ ‘armv6’ ‘armv6t2’ ‘vfp’ ‘vfpv3’ ‘neon’ ‘PowerPC’ ‘altivec’`Specific Processors` ‘pentium2’ ‘pentium3’ ‘pentium4’ ‘k6’ ‘k62’ ‘athlon’ ‘athlonxp’ ‘k8’
-opencl_bench
測試所有可用的OpenCL設備並顯示結果。此選項僅當FFmpeg含有–enable-opencl 編譯時可用。
-opencl_options options (global)
設定的OpenCL環境選項。此選項僅當FFmpeg的已編譯–enable-opencl 。
options必須是冒號分隔的key = value選項對。參見ffmpeg-utils的手冊中的“OpenCL的選項”部分的內容。
5.3 AVOption選項
這些選項直接由libavformat,libavdevice和libavcodec庫提供。要查看可用AVOption的列表,請使用-help選項。它們被分為兩類:
generic 這些選項可以為任何容器,編解碼器或設備進行設定。通用的選項都列在AVFormatContext選擇容器/設備和AVCodecContext選擇編解碼器小節。
private 這些選項是作用於給定的容器,裝置或編解碼器。私有選項列在其相應的容器/設備/編解碼器。
比如編輯ID3v2.3頭而不是默認的ID3v2.4到MP3檔案,使用MP3混合器的id3v2_version私有選項:
ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有編解碼器AVOption選項是按流指定的,並且因此應該指定相應的流標識符。
註:-nooption語法不能用於布爾AVOption選項,請使用-option 0/-option 1。
註:老的前綴v/a/s的流標識記號已經過時,將被移除。
5.4 主要選項
-f fmt (input/output)
強制指定輸入或輸出的檔案格式。輸入檔案的格式通常是自動檢測的,輸出檔案的格式由該檔案的擴展名猜測,所以在大多數情況下不需要此選項。
-i filename (input)
輸入的檔案名稱
-y (global)
直接覆蓋輸出檔案。
-n (global)
如果指定的輸出檔案已經存在,不要覆蓋輸出檔案,並立即退出。
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
用於對一個或多個數據流指定一個編碼器(一個輸出檔案之前使用時)或一個解碼器(一個輸入檔案之前使用時)。 codec是一個解碼器/編碼器的名稱或特殊值copy (僅輸出),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 (input/output)
當作為輸入選項(在-i之前 ),限制從輸入檔案中讀取數據的duration。
當作為輸出選項(輸出檔案名稱之??前)使用,在達到duration後停止寫入輸出檔案。
duration可能是以秒為單位,或以hh:mm:ss[.xxx]形式出現。
-to和-t是相互排斥的,-t具有優先權。
-to position (output)
在position位置停止輸出。position可能是一個表示秒數的數,或hh:mm:ss[.xxx]形式。
-to和-t是相互排斥的,-t具有優先權。
-fs limit_size (output)
設定檔案大小限制,以位元組表示。
-ss position (input/output)
當用作輸入選項一起使用(在-i以前),跳轉到輸入檔案中position位置。請注意,在大多數的格式是不可能確切定位,這樣ffmpeg將尋求最接近的position位置點。當轉碼和-accurate_seek啟用(默認設定),尋找點和position位置之間的附加段將被解碼並丟棄。當進行流複製或當-noaccurate_seek被使用時,它都將被保留。
當用作輸出選項(在輸出檔案名稱??前),解碼但丟棄輸入直到時間戳到達的位置。
position位置可以是秒數或hh:mm:ss[.xxx]形式。
-itsoffset offset (input)
設定輸入時間偏移。
offset必須是持續時間規範,請參閱(ffmpeg-utils)在FFmpeg-utils(1)手動的持續時間段的相關內容 。
偏移被添加到輸入檔案的時間戳。指定一個正偏移意味著相應流將延遲offset所指定的時間。
-timestamp date (output)
設定在容器內記錄的時間戳。
date必須是一個規範的持續時間,請參閱(ffmpeg-utils)在FFmpeg-utils的(1)日期部分 。
-metadata[:metadata_specifier] key=value (output,per-metadata)
設定元數據的鍵/值對。
可選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`
-target type (output)
指定目標檔案類型( vcd , svcd , dvd , dv , dv50 )。 類型可能與前綴pal-,ntsc-或film-使用相應的標準。所有的格式選項(比特率,編解碼器,緩衝大小)都將自動設定。你僅需鍵入:
`ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg`不過,你可以指定其他選項,只需你知道他們與標準不衝突,如:ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
-dframes number (output)
設定輸出數據的幀數。這是-frames:d的別名。
-frames[:stream_specifier] framecount (output,per-stream)
在framecount幀後停止寫入流。
-q[:stream_specifier] q (output,per-stream)-qscale[:stream_specifier] q (output,per-stream)
使用固定編碼率(VBR)。q/qscale的意思與編解碼器定義相關。如果qscale不與stream_specifier聯用,那么它僅適用於視頻流,這是為了保持兼容性。另外將相同的編碼器參數賦給兩個不同的編解碼器通常並不是用戶想要的,因此若需要這樣的功能,可以使用流標識符(stream_specifier)來指定。
-filter[:stream_specifier] filtergraph (output,per-stream)
創建由FilterGraph指定的濾鏡組並使用它。
FilterGraph是作用於流的濾鏡組的描述,而且必須有一個單一的輸入和同一類型的數據流輸出。
在濾鏡組裡,輸入被關聯到in標籤 ,輸出到out標籤 。關於ffmpeg濾鏡組的語法可參見ffmpeg-filters的手冊。
如果你想創建具有多個輸入或輸出的濾鏡組,參見-filter_complex的相關選項。
-filter_script[:stream_specifier] filename (output,per-stream)
這個選項類似於-filter,唯一的區別是,它的參數是濾鏡組所在的檔案名稱。
-pre[:stream_specifier] preset_name (output,per-stream)
指定匹配流(S)的預設。
-stats (global)
列印編碼進度/統計數據。這是默認值,你可通過指定-nostats禁用 。
-progress url (global)
傳送程式友好的進展信息到url
進度信息大約每秒和編碼過程結束後寫入。它是由key = value行組成。 key只能包含字母和數字字元。最後一個關鍵字序列始終是progress。
-stdin
啟用標準輸入互動。這是默認設定,除非標準輸入被作為輸入。要明確禁用互動,你需要指定-nostdin。
在標準輸入禁用相互作用是很有用的,例如,如果ffmpeg在後台進程組中。大致相同的結果可以用ffmpeg ... < /dev/null實現,但它需要一個終端。
-debug_ts (global)
列印時間戳信息。它默認是關閉的。此選項主要是用於測試和調試目的,輸出格式可從一個版本切換到另一個,所以它不應該在可移植腳本中使用。
參見-fdebug ts選項。
-attach filename (output)
添加一個附屬檔案到輸出檔案。這僅由幾個格式支持。例如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 (input,per-stream)
提取匹配的附屬檔案流成一個名??為filename的檔案??。如果filename??是空的,那么??元數據標籤中的filename標籤的值將被使用。
例如,提取第一附屬檔案到“out.ttf”:`ffmpeg -dump_attachment:t:0 out.ttf -i INPUT`提取所有附屬檔案,並按照filename ?標籤命名檔案:`ffmpeg -dump_attachment:t "" -i INPUT`
技術說明 - 附屬檔案是通過編解碼器額外數據實現的,所以這個選項實際上可以用來提取任意額外數據,而不僅僅是附屬檔案。
5.5 視頻選項
-vframes number (output)
設定視頻幀的輸出數量。這是的-frames:v別名 。
-r[:stream_specifier] fps (input/output,per-stream)
設定幀速率(Hz值,分數或縮寫)。
作為輸入選項,忽略存儲在檔案中的任何時間戳,而是產生時間戳假設恆定的幀速率fps這與一些輸入格式,諸如image2或者v4l2,中的-framerate選項是不同的(在老版本的ffmpeg中是一樣的)。如有疑問,使用的輸入選項-framerate代替-r。
作為輸出選項,複製或刪除輸入幀以達到恆定的輸出幀速率fps。
-s[:stream_specifier] size (input/output,per-stream)
設定幀尺寸。
作為輸入的選項,這是私有選項video_size的捷徑,部分分流器可以識別該參數,這時幀大小或者未存儲在檔案中或不可配置,例如原始視頻或視頻採集卡。
作為輸出的選擇,這將插入scale視頻濾鏡到相應濾鏡組的末端 。如需改變濾鏡位置,請將scale濾鏡直接插入到開頭或其他地方。
格式是wxh(默認值是使用與源相同的尺寸)。
-aspect[:stream_specifier] aspect (output,per-stream)
設定指定視頻顯示的寬高比aspect。
aspect可以是一個浮點數,或使用形如num: den的形式,其中num是分子,den是分母。例如,“4:3”,“16:9”,“1.3333”,和“1.7777”都是有效的參數值。
如果與-vcodec copy一起使用,這會影響儲存在容器級別的寬高比,而不是存儲在編碼幀的寬高比,如果有的話。
-vn (output)
禁用視頻錄製。
-vcodec codec (output)
設定視頻編解碼器。這是-codec:v的別名。
-pass[:stream_specifier] n (output,per-stream)
選擇通過次數(1或2)。它是用來做兩遍視頻編碼。視頻的統計信息記錄在第一次編碼時寫入到日誌檔案中(也參見選項-passlogfile),在第二次編碼時,該日誌檔案被用於按要求生成準確比特率的視頻。在第一次編碼中,你可以通過禁用音頻並將輸出設定為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 (output,per-stream)
設定二次編碼的日誌檔案名稱 ??前綴為prefix,默認的檔案名稱 ??前綴是ffmpeg2pass。完整的檔案名稱 ??將是PREFIX-N.log,其中N是一個輸出流的特定數字
-vf filtergraph (output)
創建由filtergraph指定的濾鏡組,並使用它。
這是-filter:v的別名 ,參見-filter選項。
5.6 高級視頻選項
-pix_fmt[:stream_specifier] format (input/output,per-stream)
設定的像素格式。使用-pix_fmts顯示所有支持的像素格式。如果所選擇的像素格式不能被選擇,ffmpeg將列印警告,並選擇由編碼器所支持的最好的像素格式。如果pix_fmt前綴+,如果請求的像素格式不能被選中,ffmpeg會出現錯誤退出,同時濾鏡組中的自動轉換將被禁用。如果pix_fmt是一個單一的+,ffmpeg的選擇與輸入或者濾鏡輸出相同的像素格式,並將禁用自動轉換。
-sws_flags flags (input/output)
設定軟體縮放的標誌。
-vdt n
丟棄的閾值。
-rc_override[:stream_specifier] override (output,per-stream)
覆蓋特定的時間間隔內的幀率控制,格式為用斜槓分隔的“整型,整型,整型”列表。前兩個值是在開始和結束幀編號,最後一個如果是正數,則為量化器;負數則為品質因數。
-ilme
支持編碼器force interlacing(僅對MPEG-2和MPEG-4有效)。如果你的輸入檔案是隔行並要保持隔行格式最小損失,請使用此選項。另一種方法是使用-deinterlace反交錯輸入流,但這會引入損失。
-psnr
計算壓縮幀的PSNR(偽信噪比)。
-vstats
輸出視頻編碼統計到vstats_HHMMSS.log。
-vstats_file file
輸出頻編碼統計到file。
-top[:stream_specifier] n (output,per-stream)
top=1/bottom=0/auto=-1 field first
-dc precision
Intra_dc_precision.
-vtag fourcc/tag (output)
強制視頻 tag/ fourcc。這是-tag:v的別名。
-qphist (global)
顯示QP直方圖
-vbsf bitstream_filter
已拋棄,見-bsf
-force_key_frames[:stream_specifier] time[,time...] (output,per-stream)
-force_key_frames[:stream_specifier] expr:expr (output,per-stream)
強制關鍵幀在指定的時間戳,更精確地在每個指定的時間之後的第一幀。
如果參數的前綴expr:,expr將解釋為一個表達式,並在每一幀執行。如果運行結果非零,一個關鍵幀被強制加入。
如果時間之一是chapters [ delta ],它被擴展成的檔案中的所有章節開始通過delta偏移的時間(時間以秒為單位)。這個選項可能是有用的,以確保存在一個搜尋點位於章節標記或者在輸出檔案中的任何其它指定的地方。
例如,在5分鐘插入一個關鍵幀,同時在每章開始前0.1秒插入一個關鍵幀:
`-force_key_frames 0:05:00,chapters-0.1`
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秒:`-1-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))`
需要注意的是太多強制的關鍵幀對某些編碼器的超前算法是非常有害的:使用固定的GOP選項或類似選項會更有效。
-copyinkf[:stream_specifier] (output,per-stream)
當複製流時,也複製起始處的非關鍵幀。
-hwaccel[:stream_specifier] hwaccel (input,per-stream)
使用硬體加速解碼匹配流。hwaccel的允許值包括:
`none`不要使用任何硬體加速(默認)。`auto`自動選擇硬體加速的方法。`vda`使用蘋果VDA硬體加速。`vdpau`使用VDPAU(視頻解碼和演示API對於Unix)硬體加速。`dxva2`使用DXVA2(DirectX視頻加速)硬體加速。
如果選擇的hwaccel不可用或不支持選擇的解碼器,此選項沒有效果。
注意,大多數加速方法適用於播放,但並不會比現代CPU軟體解碼更快。此外, ffmpeg通常需要解碼幀從GPU存儲器複製到系統存儲器,從而導致進一步的性能損失。因此此選項主要用於測試。
-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)
選擇一個設備使用硬體加速。
此選項僅使得同時與-hwaccel選項使用。它的確切含義取決於所選擇的具體硬體加速方法。
`vdpau`對於VDPAU,此選項在X11中使用。如果沒有指定這個選項, DISPLAY環境變數的值被使用`dxva2`對於DXVA2,這個選項應包含在顯示適配器使用的數量。如果未指定此選項,默認的適配器將被使用。
5.7 音頻選項
-aframes number (output)
設定的音頻幀輸出的數目。這是-frames:a的別名。
-ar[:stream_specifier] freq (input/output,per-stream)
設定音頻採樣頻率。對於輸出流,將默認設定為相應的輸入流的採樣頻率。對於輸入流該選項僅對音頻抓取設備和raw格式分流器和映射到相應分流器上的選項有效。
-aq q (output)
設定音頻質量(與編解碼器有關,VBR)。這是-q:a的別名。
-ac[:stream_specifier] channels (input/output,per-stream)
設定音頻通道的數目。輸出流默認將設定為輸入音頻信道的數目。對於輸入流該選項僅對音頻抓取設備和raw格式分流器和映射到相應分流器上的選項有效。
-an (output)
禁用錄音。
-acodec codec (input/output)
設定音頻解碼器。這是-codec:a的別名。
-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)
設定音頻樣本格式。使用-sample_fmts得到支持的採樣格式的列表。
-af filtergraph (output)
創建由FilterGraph指定的濾鏡組並使用它。
這是-filter:a的別名 ,參見-filter選項。
5.8 高級音頻選項
-atag fourcc/tag (output)
強制音頻tag/fourcc值。這是-tag:a的別名。
-absf bitstream_filter
已過時,參見-bsf
-guess_layout_max channels (input,per-stream)
如果一些輸入通道布局是未知的,試圖猜測它最多的聲道數量。例如,2要求ffmpeg識別1個通道為單聲道和2聲道立體聲,6聲道作為5.1。默認是總是試圖去猜測。用0來禁用所有的猜測。
5.9 字幕選項
-scodec codec (input/output)
設定字幕的編解碼器。這是-codec:s的別名。
-sn (output)
關閉字幕記錄。
-sbsf bitstream_filter
已過時,參見-bsf
5.10 高級字幕選項
-fix_sub_duration
調整字幕的持續時間。對於每個字幕,等待在相同的流中的下一個分組,並調節第一持續時間,以避免重疊。這對某些字幕編解碼器是必要的,特別是數位電視廣播字幕(DVB),因為在原來的分組的持續時間僅僅是一個粗略的估計,結束標記是通過一個空的字幕幀完成的。沒有使用這個選項在必要時可導致誇張的持續時間,或由於非單調時間戳混流故障。
注意,此選項將延遲所有數據的輸出直到下一個字幕分組被解碼:它可能會增加記憶體消耗和延遲。
-canvas_size size
設定用於呈現字幕的畫布的大小。
5.11 高級選項
-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]] | [linklabel] (output)
指定一個或多個輸入流作為用於輸出檔案的來源。每個輸入流由輸入檔案索引input_file_id和輸入流索引input_stream_id標識。這兩個指標都是從0開始。sync_file_id:stream_specifier可用於指定輸入流作為同步參考。
在命令行上第一個-map選項指定的輸出流0,第二-map選項指定的源輸出流1等
一個連字元-創建一個“否定的”的映射。它禁用從已經建立映射中匹配流。
另一種LinkLabel的形式將映射從複雜濾波器組輸出到輸出檔案(見-filter_complex選項)。LinkLabel必須對應於一個鏈路中已定義的輸出標籤。
例如,映射第一輸入檔案的所有流到輸出ffmpeg -i INPUT -map 0 output例如,如果在第一輸入檔案中的兩個音頻流,這些流記為“0:0”,“0:1”。您可以使用-map選擇哪個流輸出到輸出檔案。例如:ffmpeg -i INPUT -map 0:1 out.wav將映射INPUT的輸入數據流“0:1”到在(單)輸出流out.wav。例如,從輸入檔案a.mov選擇索引2流(由識別符“0:2”指定的)與從輸入b.mov索引6(由識別符“1:6”指定)流,複製到輸出檔案out.mov: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映射所有的數據流,除了第二音頻,使用否定的映射ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT選擇英語音頻流:ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
請注意,使用此選項將禁用此輸出檔案的默認映射。
-map_channel [input_file_id.stream_specifier.channel_id|-1][:output_file_id.stream_specifier]
映射從一個給定的輸入音頻聲道到輸出。如果output_file_id.stream_specifier未設定時,聲道將被映射的所有音頻流。
使用-1替代input_file_id.stream_specifier.channel_id將映射一個靜音聲道。
例如,假設INPUT是一個立體聲音頻檔案,你可以切換兩個音頻通道與下面的命令:ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT如果您想要靜音的第一聲道,並保留第二個:ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT
-map_channel選項的順序指定在輸出流中的聲道的順序。所述輸出信道的布局是從映射信道數猜測的(如果只有一個-map_channel,則使用單聲道,如果是2,則使用立體聲,如此等等)。如果輸入和輸出信道的布局不匹配(例如2個-map_channel和-ac 6),聯合使用-map_channel和-ac將更新聲道的增益水平。
您也可以提取各個輸入通道到特定的輸出;以下命令中提取的兩個通道的INPUT音頻流(檔案0,流0)到相應的OUTPUT_CH0和OUTPUT_CH1輸出:
ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1
以下示例拆分立體聲輸入的通道成兩個獨立的數據流,其被放入同一個輸出檔案:
ffmpeg -i stereo.wav -map 0:0 -map 0:1 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg
注意,目前每個輸出流只能包含來自單個輸入流的聲道;不能使用-map_channel從不同的數據流提取的多個輸入音頻聲道(來自相同的或不同的檔案),並將它們合併成一個單一的輸出流。因此,目前不可能完成例如把兩個單獨的單聲道流成一個單一的立體聲流的任務。然而,拆分立體聲流分成兩個單信道單聲道流則是可能的。
如果你需要這個功能,一個可能的解決方法是使用amerge濾鏡。例如,如果你需要用2個單聲道音頻融合媒體中的(在這裡是input.mkv)流成一個單一的立體聲聲道音頻流(並保持視頻流),可以使用下面的命令:
ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv
-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)
根據infile設定下一個輸出檔案的元數據信息。請注意,這些都是檔案索引(從零開始),而不是檔案名稱。可選參數metadata_spec_in/out可用於指定哪些元數據進行複製。元數據說明可以有以下幾種形式:
`g`全局元數據,即元數據套用於整個檔案`s[:stream_spec]`每個流的元數據`stream_spec`是一個流標識符,參見流標識符一章。在輸入的元數據時,將從第一個匹配的流複製。在輸出元數據時,將複製到所有匹配流。`c:chapter_index`每章的元數據`chapter_index`是從零開始的章節索引。`p:program_index`每個項目的元數據`program_index`是從零開始的的項目索引。
如果元數據說明被省略,則默認為全球性的。
預設情況下,全局元數據是從第一輸入檔案複製的,每個流和每個章節的元數據與數據流/章節將被依次複製。創建相關類型的任何映射將禁用這些默認映射。否定的檔案索引可以用來創建只禁用自動複製的虛擬映射。
例如,從輸入檔案的第一數據流複製元數據到輸出檔案的全局元數據:ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3反過來,即全局的元數據複製到所有音頻流:ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv需要注意的是0在本實例中能起到相同的效果,由於全局元數據被假定默認。
-map_chapters input_file_index (output)
從輸入檔案複製章節與索引input_file_index到下一個輸出檔案中。如果不指定章節映射,則章節從第一輸入檔案複製並至少有一個章節。使用負的檔案索引來排除任何章節的複製。
-benchmark (global)
在編碼結束顯示基準信息。顯示使用的CPU時間和最大記憶體消耗。不是所有系統都支持最大記憶體消耗,如果不支持,它通常會顯示為0。
-benchmark_all (global)
顯示編碼過程中基準信息。顯示各個步驟(音頻/視頻編碼/解碼)所使用的CPU時間。
-timelimit duration (global)
在已經運行duration秒後退出ffmpeg
-dump (global)
轉儲每個輸入包到標準錯誤流。
-hex (global)
當dump包時,也dump有效載荷。
-re (input)
讀取輸入的原始幀速率。主要用於模擬抓取設備。或實時輸入流(例如從檔案讀取時)。不應該在實際的抓取設備或實時輸入流中使用(它可能會導致數據包丟失)。默認ffmpeg嘗試儘可能快地讀出輸入端。此選項會減慢輸入的本地幀速率的讀取。它是用於實時輸出(如直播)是有用的。
-loop_input
循環輸入流。目前,它僅適用於圖像流。此選項用於自動測試ffserver。此選項已被棄用,使用-loop 1。
-loop_output number_of_times
反覆循環輸出支持循環的格式如動畫GIF(0意味著無限循環輸出)。此選項已被棄用,使用-loop。
-vsync parameter
視頻同步方法。出於兼容性考慮舊值可以被指定為數字。新添加的值將必須總是指定為字元串。
0, passthrough每一幀傳遞從分流器到復用器的時間戳。1, cfr幀將被複製並下降至達到完全所需的恆定幀速率。2, vfr幀通過與其時間戳或下降,從而防止兩幀具有相同的時間戳。drop與passthrough相同,但破壞所有時間戳,使得復用器生成基於幀速率新的時間戳。-1, auto根據復用器的功能選擇1或者2。這是默認的方法。
注意,該時間戳在此之後可以進一步由復用器修改。例如,在格式選項avoid_negative_ts被啟用時。
與-map聯用,您可以選擇從哪個流提取時間戳。您可以留下視頻或音頻不變,同步剩餘流不變的。
-async samples_per_second
音頻同步的方法。“伸展/擠壓”音頻流相匹配的時間戳,所述參數是音頻發生改變所容許的每秒最大點數。-async 1是一種特殊情況,音頻數據流僅在開始校正,而其後將不再校正。
注意,該時間戳在此之後可以進一步由復用器修改。例如,在格式選項avoid_negative_ts被啟用時。
此選項已被棄用。使用aresample音頻過濾器代替。
-copyts
不要處理輸入時間戳,但保持它們的值,不嘗試對它們進行sanitize。尤其是,不要刪除初始啟動時間偏移值。
需要注意的是,即使使用了該選項,根據不同的vsync選項或對特定復用器處理(例如格式選項avoid_negative_ts被啟用)輸出時間戳與輸入可能不匹配時間戳。
-start_at_zero
當與copyts使用,調整輸入時間戳,使他們從零開始。
這意味著使用例如-ss 50將使輸出時間戳開始50秒時,不管輸入檔案開始處的時間戳是多少。
-copytb mode
指定在拷貝流時如何設定編碼器的時間基準,mode是一個整型,可以假定為下列值之一:
1使用分流器的時間基準。時間基準從相應的輸入分流器複製到輸出編碼器。該情況下,對可變幀速率的視頻流的複製,有時需要避免非單調的時間戳。0使用解碼器時間基準。時間基準從相應的輸入解碼器複製到輸出編碼器。-1嘗試自動做出選擇,以便產生一個合理的輸出。
默認值為-1。
-shortest (output)
最短的輸入流結束時完成編碼。
-dts_delta_threshold
時間戳間斷門檻。
-muxdelay seconds (input)
設定最大分流解碼延時。
-muxpreload seconds (input)
設定初始解碼分流延遲。
-streamid output-stream-index:new-value (output)
分配一個新流id值到輸出流。該選項?需指定到輸出檔案名稱之前。對於在多個輸出檔案存在的情況下,一個流id將被重新分配到不同的值。
例如,要設定流0 到流33,同時流1至流36,到MPEGTS格式的輸出檔案:ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts
-bsf[:stream_specifier] bitstream_filters (output,per-stream)
指定匹配流的bitstream_filters。它是一個逗號分隔的濾鏡列表。使用-bsfs選項得到的濾鏡列表。
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
-tag[:stream_specifier] codec_tag (input/output,per-stream)
指定匹配流的tag/fourcc。
-timecode hh:mm:ssSEPff
指定寫入的時間碼。對於non drop 時間碼,分隔設定SEP是:對於drop時間碼是;(或.)。
ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
-filter_complex filtergraph (global)
定義複雜FilterGraph,即具有輸入和/或輸出任意個數的濾鏡組。對於簡單濾鏡——那些具有一個輸入和相同類型的一個輸出的濾鏡——參見-filter選項。FilterGraph是FilterGraph的描述,參見FFMPEG濾鏡手冊的“FilterGraph語法”部分中的描述。
輸入鏈路標籤必須關聯到使用[file_index:stream_specifier]語法標記的輸入流(即-map選項中使用的格式)。如果stream_specifier匹配多個流,第一個將被使用。未標記的輸入將被連線到匹配類型的第一未使用的輸入流。
輸出連結標籤由-map指定。未標記的輸出被加到第一輸出檔案。
注意,使用該選項,可以只有lavfi源而沒有正常的輸入檔案。
例如,疊加圖像到視頻 ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' out.mkv這裡[0:v]指的是在第一輸入檔案中的第一視頻流,這是與覆蓋濾波器的第一(主)輸入。同樣,在第二輸入的第一視頻流連結到覆蓋層的第二(覆蓋)輸入。假定在每個輸入檔案中只有一個視頻流,就可以省略輸入標籤,因此上述命令相當於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要使用lavfi產生5秒鐘的純紅色視頻color來源:ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
-lavfi filtergraph (global)
定義複雜FilterGraph,即具有輸入和/或輸出任意個數的濾鏡組。相當於-filter_complex。
-filter_complex_script filename (global)
這個選項類似於-filter_complex,唯一的區別是,它的參數是包含被讀取FilterGraph的檔案的名稱。
-accurate_seek (input)
此選項啟用或禁用準確尋求輸入檔案,配合-ss選項使用。它默認是啟用的,所以當轉碼時是準確的。使用-noaccurate_seek禁用它,在拷貝一些數據流和轉碼時,這可能是有用的。
-override_ffserver (global)
從ffserver 覆蓋輸入規格。使用這個選項,你可以映射任何輸入流到ffserver,並從ffmpeg 控制編碼的許多方面。如果沒有這個選項ffmpeg將傳送ffserver要求的內容。
該選項用於那些不能被指定到ffserver的功能 ,即便他們可以用於ffmpeg 。
-discard (input)
允許在分路器丟棄特定流或流幀。不是所有的分路器都支持。
none禁止丟棄幀。default默認情況下,不丟棄幀。noref丟棄所有非參考幀。bidir放棄所有雙向幀。nokey丟棄所有幀除了關鍵幀。all丟棄所有幀。
作為一個特例,可以使用一個點陣圖字幕流作為輸入:它將被轉換到檔案中最大的視頻相同尺寸,或720×576,如果沒有視頻。需要注意的是,這是一個實驗性和臨時解決方案。它會在libavfilter有適當字幕支持後刪除。
例如,硬編碼存儲在MPEG-TS格式的DVB-T的記錄的頂部字幕,1秒延遲字幕:ffmpeg -i input.ts -filter_complex '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' -sn -map '#0x2dc' output.mkv(0x2d0,0x2dc和0x2ef分別是MPEG-TS的PID的視頻,音頻和字幕流; 0:0,0:3和0:7可起到同樣作用)
5.12 預置檔案
預置檔案是包含option = value的檔案 ,每行一個,指定的選項需按照命令行中的順序。’#’開頭的字元行被忽略,並用來提供注釋。參見FFmpeg的原始碼樹中的preset目錄中的例子。
Preset files are specified with the vpre, apre, spre, and fpre options. The fpre option takes the filename of the preset instead of a preset name as input and can be used for any kind of codec. For the vpre, apre, and spre options, the options specified in a preset file are applied to the currently selected codec of the same type as the preset option.
The argument passed to the vpre, apre, and spre preset options identifies the preset file to use according to the following rules:
First ffmpeg searches for a file named arg.ffpreset in the directoriesFFMPEGDATADIR(ifset),andFFMPEGDATADIR(ifset),andHOME/.ffmpeg, and in the datadir defined at configuration time (usually PREFIX/share/ffmpeg) or in a ffpresets folder along the executable on win32, in that order. For example, if the argument is libvpx-1080p, it will search for the file libvpx-1080p.ffpreset.
If no such file is found, then ffmpeg will search for a file named codec_name-arg.ffpreset in the above-mentioned directories, where codec_name is the name of the codec to which the preset file options will be applied.
6 提示
- 為在非常低的比特率流,使用低幀速率和小的GOP大小。這對於那些配置較低的Linux用戶上播放RealVideo尤是如此,它可能會丟幀。例如:ffmpeg -g 3 -r 3 -t 10 -b:v 50k -s qcif -f rv10 /tmp/b.rm
- 編碼中顯示的參數“q”是當前量化器。值1表示非常良好的質量。值31表示最差的質量。如果Q = 31出現過於頻繁,這意味著該編碼器無法壓縮到滿足您的比特率要求的碼率。您必須增加比特率,降低幀率或減少幀的大小。
- 如果你的電腦不夠快,可以犧牲壓縮比換取速度。你可以用-me 0加快運動估計和-g 0完全禁用運動估計(你僅有I-frames,這意味著它幾乎和JPEG壓縮一樣好)。
- 可通過降低採樣頻率獲得非常低的音頻比特率(對於MPEG音頻,下降到22050Hz,對於AC-3, 使用22050或11025Hz)。
- 有一個恆定的質量(但可變比特率),使用選項-qscale N時,N是1(優秀品質)和31(質量最差)之間。
7 範例
7.1 預置檔案
預置檔案包含option=value,一個用於每行,指定其也可以指定的命令行上的選項的序列的序列。’#’開頭的字元行被忽略,並用來提供注釋。空行將也被忽略。檢查的例子FFmpeg的原始碼樹中的preset目錄。
預置檔案中指定的pre選項,這個選項需要一個預設名稱作為輸入。FFmpeg在$AVCONV_DATADIR和$HOME/.ffmpeg以及編譯時指定的目錄(通常是$PREFIX/share/ffmpeg)的目錄中搜尋檔案名稱??為preset_name.avpreset的檔案。例如,如果該參數是libx264-max,它會搜尋檔案libx264-max.avpreset。
7.2 視頻和音頻抓取
如果指定了輸入格式和設備,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
請注意,您必須在啟動ffmpeg前激活正確的視頻源和信道,比如的xawtv。你也必須正確設定混音器中的音頻記錄電平。
7.3 X11抓取
使用ffmpeg抓取X11顯示器 ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg 0.0是display.screen數量的X11伺服器,與DISPLAY環境變數一致。
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg0.0是display.screen數量的X11伺服器,與DISPLAY環境變數一致。10是在x偏移和20的y偏移。
7.4 視頻和音頻檔案格式轉換
任何支持的檔案格式和協定可以作為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,/ tmp目錄/ TEST0。U, /tmp/test0.V,/tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
Y檔案使用的U和V檔案的解析度的兩倍。他們是原始檔案,沒有頭信息。他們可以通過所有視頻解碼器產生。您必須指定圖像的大小與-s選項,如果ffmpeg的不能猜測它。
您可以從原始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赫茲的採樣率轉換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
轉換a.wav到64千比特的a.mp2和128千比特的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檔案,輸出與MPEG-4視頻和MP3音頻的AVI檔案。注意,在這個命令,我們使用B幀,以便對MPEG-4流與DivX5兼容,並且GOP大小為300,這意味著每10秒插入一幀到29.97fps的輸入視頻。此外,音頻流是MP3編碼,所以你需要啟用通過傳遞LAME支持可使用–enable-libmp3lame配置。該映射是特別有用的用於DVD的轉碼,以獲得所需的音頻語言。
注意:使用ffmpeg -formats查看支持的輸入格式。
您可以從視頻中提取圖像,或從圖像創建視頻:
從視頻中提取圖片:ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
這將每秒提取一個視頻幀,並輸出到名為foo-001.jpeg,foo-002.jpeg等圖片中。圖片將被重新縮放到定義的尺寸。
如果你想提取有限數量的幀,你可以組合使用上面的命令與-vframes或-t選項,或與-ss開始從某一個時間點提取。
從圖像創建視頻:ffmpeg -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi
語法foo-%03d.jpeg指定要使用的三個數字組成的十進制數用零填充到表達的序列號。它支持C語言printf函式相同的語法,但只有格式接受整數。
當導入圖像序列,-i還支持Shell擴展通配符。這在內部通過image2-specific-pattern_type glob選項選擇。
例如,從檔案名稱?匹配foo-*.jpeg的圖片創建視頻ffmpeg -f image2 -pattern_type glob -i 'foo-*.jpeg' -r 12 -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
8 參見
ffmpeg-all , ffplay , ffprobe , ffserver , ffmpeg-utils , ffmpeg-scaler , ffmpeg-resampler , ffmpeg-codecs , ffmpeg-bitstream-filters , ffmpeg-formats , ffmpeg-devices , ffmpeg-protocols , ffmpeg-filters
留言列表