ffmpeg的中文文檔

1. 概要

ffmpeg [global_options] {[input_file_options] -i INPUT_FILE} ... {[output_file_options] OUTPUT_FILE} ...linux

2. 說明

ffmpeg是一個很是快的視頻和音頻轉換器,還能夠抓取實時的音頻/視頻流。它能夠在任意的採樣率之間的轉換和調整視頻,並同時使用高品質的多相濾波器。算法

ffmpeg從輸入「文件」(其能夠是常規文件,管道,網絡流,錄製裝置等),由指定任意數量的讀取-i選項,並寫入到任意數量的輸出「文件」,只需指定一個輸出的文件名。任何一個命令行中不能被解釋爲選項的內容都被認爲是一個輸出文件名。canvas

每一個輸入或輸出文件能夠在原則上,包含任意數量的不一樣類型(視頻/音頻/字幕/附件/數據)的流。輸出文件中容許流的數量和類型是由輸出格式容器限制決定的。輸入流和輸出流直接的映射能夠自動完成也能夠用-map選項給定(見流選擇章節)。服務器

引用輸入文件的選項時,則必須使用他們的索引(從0開始)。例如:第一輸入文件是0 ,第二個是1等。相似地,一個文件中的流也經過其索引指定。例如2:3指的是在第三個輸入文件中的第四數據流。參見流章節。網絡

做爲通常規則,選項做用於下一個指定的文件。所以,命令的順序是重要,你能夠在命令行上屢次相同的選項。每次選項的出現都將做用於下一個輸入或輸出文件。這條規則如有例外將會提早聲明(例如冗餘級別)。app

不要混合輸入和輸出文件。首先指定全部輸入文件,那麼全部的輸出文件。也不要混用屬於不一樣的文件的選項。全部選項僅適用於下一個輸入或輸出文件,以後選項將被重置。async

設置輸出文件以64千比特/秒的視頻比特率:ide

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單位的字符串,例如:KM,或G

若是i被附加在SI單位,完整的前綴將被解釋爲一個單元前綴的二進制倍數,也即1024倍,而不是1000倍。追加B可以使數值增長8倍。這容許使用,例如:KBMiBGB的數量後綴。

選項​​不帶參數是布爾選項,並設置相應的值設置爲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選項

這些選項直接由libavformatlibavdevicelibavcodec庫提供。要查看可用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_CH0OUTPUT_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.h264
ffmpeg -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 directories HOME/.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.mpg
0.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

lminlmaxmblminmblmax四個選項的單位是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

相關文章
相關標籤/搜索