ffmpeg文檔05-選項

5 選項

全部的數值選項,若是沒有特殊定義,則須要一個接受一個字符串表明一個數做爲輸入,這可能跟着一個單位量詞首字母,例如"k","m""G"web

若是i是附加到SI單位的首字母,完整的字母將被解釋爲一個2的冪數單位,這是基於1024而不是1000的,添加B的SI單位則是再將此值乘以8。例如KBMiBGB算法

對於選項中不帶參數的布爾選項,即把相應的值設置爲true,它們能夠添加no設置爲false,例如nofoo就至關於foo falseshell

流說明(限定)符

不少選項是做用於單獨的流的,例如碼率(bitrate)或者編碼(codec),流說明符就是精確的爲每一個流指定相應的選項。canvas

一個流說明符是一個以冒號分隔的字符串,其中分隔出的部分是附加選項,例如-codec:a:1 ac3表示編碼器是對第2音頻流以ac3編碼。windows

一個流說明符可能匹配多個流,則該選項是全部匹配項的選項,例如-b:a 128k表示全部的音頻流都是128k的碼率。api

一個空的流說明符匹配全部的流,例如-codec copy或者-codec: copy表示全部的流都不進行再次編碼(包括視頻和音頻)app

可能的流說明符有:async

  • stream_index:匹配流的索引,例如-threads:1 4表示對2號流採用4個線程處理ide

  • stream_type[:stream_index]:stream_typev表示視頻,a表示音頻,s表示字幕,d表示數據和t表示附加/附件等可能,若是stream_index同時被指定,則匹配該索引對於的該類型的流。例如-codec:v:0 h264表示第1視頻流是h.264編碼。工具

  • p:program_id[:stream_index]:若是stream_index被指定,則表示被program_id指定的程序僅做用於stream_index所指流,不然將做用於全部流。

  • #stream_id或者i:stream_id:匹配stream_id所指流(MPEG-TS中的PID)

  • m:key[:value]:匹配在元數據中以標籤key=value值的流,若是value沒有設置,則匹配全部。

  • u:匹配不能被配置的流,這時編碼器必須被定義且有必要的視頻維度或者音頻採樣率之類的信息。注意ffmpeg匹配由元數據標識的狀態僅對於輸入文件有效。

常規選項

這些常規選項也能夠用在ffmpeg項目中其餘ff*工具,例如ffplayer

  • -L:顯示受權協議

  • -h,-?,-help,--help[arg]:顯示幫助,一個附加選項能夠指定幫助顯示的模式,若是沒有參數,則是基本選項(沒有特別聲明)說明被顯示,下面是參數定義

    • long:在基本選項說明基礎上增長高級選項說明

    • full:輸出完整的選項列表,包括編(解)碼器,分離器混合器以及濾鏡等等的共享和私有選項

    • decoder=decoder_name:輸出指定解碼器名的詳細信息。可使用-decoders來獲取當前支持的全部解碼器名

    • encoder=encoder_name:輸出指定編碼器名的詳細信息。可使用-encoders來獲取當前支持的全部編碼器名

    • demuxer=demuxer_name:輸出指定分離器名詳細信息。可使用-formats來獲取當前支持的全部分離器和混合器

    • muxer=muxer_name:輸出指定混合器名詳細信息。可使用-formats來獲取當前支持的全部分離器和混合器

    • filter=filter_name:輸出指定濾鏡名的詳細信息。可使用-filters來獲取當前支持的全部濾鏡

  • -version:顯示版本信息

  • -formats:顯示全部有效的格式(包括設備)

  • -devices:顯示有效設備

  • -codecs:顯示全部已支持的編碼(libavcodec中的)格式注意編碼/codec僅僅是文檔中一個用於指示媒體數據流格式的術語。

  • -decoders:顯示全部有效解碼器

  • -encoders:顯示全部有效的編碼器

  • -bsfs:顯示有效的數據流(bitstream)濾鏡

  • -protocols:顯示支持的協議

  • -filters:顯示libavfilter中的濾鏡

  • -pix_fmts:顯示有效的像素(pixel)格式

  • -sample_fmts:顯示有效的實例格式

  • -layouts:顯示信道名字和信道佈局

  • -colors:顯示註冊的顏色名

  • -sources device[,opt1=val1[,opt2=val]...]:顯示自動識別的輸入設備源。一些設備可能須要提供一些系統指派的源名字而不能自動識別。返回的列表不能認爲必定是完整的(即有可能還有設備沒有列出來)

    ffmpeg -sources pulse,server=192.168.0.4

  • -sinks device[,opt1=val1[,opt2=val]...]:顯示自動識別的輸出設備。一些設備可能須要提供一些系統指派的源名字而不能自動識別。返回的列表不能認爲必定是完整的(即有可能還有設備沒有列出來)

    ffmpeg -sinks pulse,server=192.168.0.4

  • -loglevel [repeat+]loglevel 或者 -v [repeat+]loglevel:設置日誌層次。若是附加有repeat+則表示從第一條非壓縮行到達到最後消息n次之間的行將被忽略。"repeat"也能夠一直使用,若是沒有現有日誌層級設置,則採用默認日誌層級。若是有多個日誌層級參數被獲取,使用"repeat"不改變當前日誌層級。日誌層級是一個字符串或數值,有如下可能值:

    • quiet,-8,什麼都不輸出,是無聲的

    • panic,0,僅顯示形成進程失敗的致命錯誤,它當前不能使用

    • fatal,8僅僅顯示致命錯誤,這些錯誤使得處理不能繼續

    • error,16顯示全部的錯誤,包括能夠回收的錯誤(進程還能夠繼續的)

    • warning,24顯示全部警告和錯誤,任何錯誤或者意外事件相關信息均被顯示

    • info,32顯示過程當中的信息,還包括警告和錯誤,則是默認值

    • verbose,40相似info,但更冗長

    • debug,48顯示全部,包括調試信息

    • trace,56

    默認的日誌輸出是stderr設備,若是在控制檯支持顏色,則錯誤和警告標記的顏色將被顯示處理,默認日誌的顏色設置能夠由環境變量的AV_LOG_FORCE_NOCOLOR或者NO_COLOR或者環境變量AV_LOG_RORCE_COLOR覆蓋。環境變量NO_COLOR不推薦使用,由於其已經不被新版本支持。

  • -report:複製全部命令行和控制檯輸出到當前目錄下名爲program-YYYMMDD-HHMMSS.log文件中。這經常使用於報告bug,因此通常會同時設置-loglevel verbose

    設置環境變量FFREPORT能夠起到相同的效果。若是值是一個以分隔的關鍵值對,則將影響到報告效果。值中的特殊符號或者分隔符必須被轉義(參考ffmepg-utils手冊中"引用逃逸"(「Quoting and escaping」)章節)。如下是選項值範圍:

    • file:設置報告文件名字,%p被擴展爲程序名字,%t是時間碼,%%表示一個字符%

    • level:用數字設定日誌信息詳略程度(參考-longlevel

      例如:

      `FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output`

      會把日誌信息輸出到環境變量定義的文件中, 內容包括簡要過程信息,警告和錯誤。

  • -hide_banner:禁止打印輸出banner。全部FFmpeg工具使用中常規都會在前面顯示一些版權通知、編譯選項和庫版本等,這個選項能夠禁止這部分的顯示。

  • cpuflags flags(global):容許設置或者清除cpu標誌性和。當前這個選項主要仍是測試特性,不要使用,除非你明確須要:

ffmpeg -cpuflags -sse+mmx ...
ffmpeg -cpuflags mmx ...
ffmpeg -cpuflags 0 ...

可能的選項參數有:

- `x86`
    - mmx
    - mmxext
    - sse
    - sse2
    - sse2slow
    - sse3
    - atom
    - sse4.1
    - sse4.2
    - avx
    - avx2
    - xop
    - fma3
    - fma4
    - 3dnow
    - 3dnowext
    - bmi1
    - bmi2
    - cmov
- `ARM`
    - armv5te
    - armv6
    - armv6t2
    - vfp
    - vfpv3
    - neon
    - setend
- `AArch64`
    - armv8
    - vfp
    - neon
- `PowerPC`
    - altivec
- `Specific Processors`
    - pentium2
    - pentium3
    - pentium4
    - k6
    - athlon
    - athlonxp
    - k8
  • -opencl_bench:輸出全部效OpenCL設備的基準測試狀況。當前選項僅在編譯FFmepg中打開了--enable-opencl纔有效。

    當FFmpeg指定了--enable-opencl編譯後,這個選項還能夠經過全局參數-opencl_options進行設定,參考OpenCL選項,在ffmpeg-utils手冊中對於選項的支持狀況,這包括在特定的平臺設備上支持OpenCL的能力。默認,FFmpeg會運行在首選平臺的首選設備上,經過設置全局的OpenCL則能夠實如今選定的OpenCL設備上運行,這樣就能夠在更快的OpenCL設備上運行(平時節點,須要時才選用性能高但耗電的設備)

    這個選項有助於幫助用戶瞭解信息以進行有效配置。它將在每一個設備上運行基準測試,並以性能排序全部設備,用戶能夠在隨後調用ffmpeg時使用-opencl_options配置合適的OpenCL加速特性。

    通常如下面的步驟使用這個參數:

    ffmpeg -opencl_bench

    注意輸出中第一行的平臺ID(pidx)和設備ID(didx),而後在選擇平臺和設備用於命令行:

    ffmpeg -opencl_options platform_idx=pidx:device_idx=didx ...
  • opencl_options options(global):設置OpenCL環境選項,這個選項僅僅在FFmpeg編譯選項中打開了--enable-opencl纔有效。

    options必須是一個由:分隔的key=value鍵值對列表。參考OpenCL選項,在ffmpeg-utils手冊中對於選項的支持狀況

AV選項

這些選項由特定的庫提供(如libavformat,libavdevice以及libavcodec)。爲了更多的瞭解AV選項,使用-help進行進一步瞭解。它們能夠指定下面2個分類:

  • generic(常規):這類選項能夠用於設置 容器、設備、編碼器、解碼器等。通用選項對列在AVFormatContext中的容器/設備以及AVCodecContext中的編碼有效。

  • private(私有):這類僅對特定的容器、設備或者編碼有效。私有選項由相應的 容器/設備/編碼 指定(肯定)。

例如要在一個默認爲ID3v2.4爲頭的MP3文件中寫入ID3v2.3頭,須要使用id3v2_version 私有選項來對MP3混流:

ffmpeg -i input.flac -id3v2_version 3 out.mp3

全部編碼AV選項是針對單獨流的,因此必須詳細指定。

注意-nooption語法不能被用於AV選項中的布爾值項目,而必須使用-option 0/-option 1

注意以往使用v/a/s命名指定每一個流的AV選項語法已經不建議使用,它們很快就會失效移除。

主要選項

  • -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(僅對輸出文件)則意味着流數據直接複製而再也不編碼。例如:

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

這將在輸出文件中第2視頻流按libx264編碼,第138音頻流按libvorbis編碼,其他都直接複製輸出。
  • -t duration (input/output):限制輸入/輸出的時間。若是是在-i前面,就是限定從輸入中讀取多少時間的數據;若是是用於限定輸出文件,則表示寫入多少時間數據後就中止。duration能夠是以秒爲單位的數值或者 hh:mm:ss[.xxx]格式的時間值。 注意-to-t是互斥的,-t有更高優先級。

  • -to position (output):只寫入position時間後就中止,position能夠是以秒爲單位的數值或者 hh:mm:ss[.xxx]格式的時間值。 注意-to-t是互斥的,-t有更高優先級。

  • -fs limit_size (output):設置輸出文件大小限制,單位是字節(bytes)。

  • -ss position (input/output):

    • 當在-i前,表示定位輸入文件到position指定的位置。注意可能一些格式是不支持精肯定位的,因此ffmpeg多是定位到最接近position(在以前)的可定位點。當有轉碼發生且-accurate_seek被設置爲啓用(默認),則實際定位點到position間的數據被解碼出來但丟棄掉。若是是複製模式或者-noaccurate_seek被使用,則這之間的數據會被保留。

    • 當用於輸出文件時,會解碼丟棄position對應時間碼前的輸入文件數據。

    • position能夠是以秒爲單位的數值或者 hh:mm:ss[.xxx]格式的時間值

  • -itsoffset offset (input):設置輸入文件的時間偏移。offset必須採用時間持續的方式指定,便可以有-號的時間值(以秒爲單位的數值或者 hh:mm:ss[.xxx]格式的時間值)。偏移會附加到輸入文件的時間碼上,意味着所指定的流會以時間碼+偏移量做爲最終輸出時間碼。

  • -timestamp date (output):設置在容器中記錄時間戳。date必須是一個時間持續描述格式,即

[(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...]]])|(HHMMSS[.m...]]]))[Z] 格式。
  • -metadata[:metadata_specifier] key=value (output,per-metadata):指定元數據中的鍵值對。

    流或者章的metadata_specifier可能值是能夠參考文檔中-map_metadata部分了解。

    簡單的覆蓋-map_metadata能夠經過一個爲空的選項實現,例如:

    ffmpeg -i in.avi -metadata title="my title" out.flv

    設置第1聲道語言:

    ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
  • -taget type (output):指定目標文件類型(vcd,svcd,dvd,dv,dv50),類型還能夠前綴一個pal-,ntsc-或者film-來設定更具體的標準。全部的格式選項(碼率、編碼、緩衝尺寸)都會自動設置,而你僅僅只須要設置目標類型:

    ffmpeg -i myfile.avi -taget vcd /tmp/vcd.mpg

    固然,你也能夠指定一些額外的選項,只要你知道這些不會與標準衝突,如:

    ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
  • -dframes number (output):設定指定number數據幀到輸出文件,這是-frames:d的別名。

  • frames[:stream_specifier] framecount (output,per-stream):在指定計數幀後中止寫入數據。

  • -q[:stream_specifier] q (output,per-stream)

  • -qscale[:stream_specifier] q (output,per-stream)

    使用固定的質量品質(VBR)。用於指定q|qscale編碼依賴。若是qscale沒有跟stream_specifier則只適用於視頻。其中值q取值在0.01-255,越小質量越好。

  • -filter[:stream_specifier] filtergraph (output,per-stream):建立一個由filtergraph指定的濾鏡,並應用於指定流。

    filtergraph是應用於流的濾鏡鏈圖,它必須有一個輸入和輸出,並且流的類型須要相同。在濾鏡鏈圖中,從in標籤指定出輸入,從out標籤出輸出。要了解更多語法,請參考ffmpeg-filters手冊。

    參考-filter_complex選項以瞭解如何創建多個輸入/輸出的濾鏡鏈圖。

  • -filter_script[:stream_specifier] filename (output,per-stream):這個選項相似於-filter,只是這裏的參數是一個文件名,它的內容將被讀取用於構建濾鏡鏈圖。

  • -pre[:stream_specifier] preset_name (output,per-stream):指定預設名字的流(單個或者多個)。

  • -stats (global):輸出編碼過程/統計,這是系統默認值,若是你想禁止,則須要採用-nostats

  • -progress url (global):發送友好的處理過程信息到url。處理過程信息是一種鍵值對(key=value)序列信息,它每秒都輸出,或者在一次編碼結束時輸出。信息中最後的一個鍵值對代表了當前處理進度。

  • -stdin:容許標準輸入做爲交互。在默認狀況下除非標準輸入做爲真正的輸入。要禁用標準輸入交互,則你須要顯式的使用-nostdin進行設置。禁用標準輸入做爲交互做用是有用的,例如FFmpeg是後臺進程組,它須要一些相同的從shell開始的調用(ffmpeg ... </dev/null)。

  • -debug_ts (global):打印時間碼信息,默認是禁止的。這個選項對於測試或者調試是很是有用的特性,或者用於從一種格式切換到另外的格式(包括特性)的時間成本分析,因此不用於腳本處理中。還能夠參考-fdebug ts選項。

  • -attach filename (output):把一個文件附加到輸出文件中。這裏只有不多文件類型能被支持,例如使用Matroska技術爲了渲染字幕的字體文件。附件做爲一種特殊的流類型,因此這個選項會添加一個流到文件中,而後你就能夠像操做其餘流同樣使用每種流選項。在應用本選項時,附件流須做爲最後一個流(例如根據-map映射流或者自動映射時須要注意)。注意對於Matroska你也能夠在元數據標籤中進行類型設定:

ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

(這時要訪問到附件流,則就是訪問輸出文件中的第3個流)

  • -dump_attachment[:stream_specifier] filename (input,per-stream):從輸入文件中解出指定的附件流到文件filename:

ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

若是想一次性把全部附件都解出來,則
ffmpeg -dump_attachment:t "" -i INPUT

技術說明:附件流是做爲編碼擴展數據來工做的,因此其餘流數據也能展開,而不只僅是這個附件屬性。
  • -noautorotate:禁止自動依據文件元數據旋轉視頻。

視頻(video)選項

  • -vframes number (output):設置輸出文件的幀數,是-frames:v的別名。

  • -r[:stream_specifier] fps (input/output,per-stream):設置幀率(一種Hz值,縮寫或者分數值)。

    在做爲輸入選項時,會忽略文件中存儲的時間戳和時間戳而產生的假設恆定幀率fps,即強制按設定幀率處理視頻產生(快進/減緩效果)。這不像-framerate選項是用來讓一些輸入文件格式如image2或者v412(兼容舊版本的FFmpeg)等,要注意這一點區別,而不要形成混淆。

    做爲輸出選項時,會複製或者丟棄輸入中個別的幀以知足設定達到fps要求的幀率。

  • -s[:stream_specifier] size (input/output,per-stream):設置幀的尺寸。

    看成爲輸入選項時,是私有選項video_size的縮寫,一些文件沒有把幀尺寸進行存儲,或者設備對幀尺寸是能夠設置的,例如一些採集卡或者raw視頻數據。

    看成爲輸出選項是,則至關於scale濾鏡做用在濾鏡鏈圖的最後。請使用scale濾鏡插入到開始或者其餘地方。

    數據的格式是wxh,即寬度值X高度值,例如320x240,(默認同源尺寸)

  • aspect[:stream_specifier] aspect (output,per-stream):指定視頻的縱橫比(長寬顯示比例)。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),它一般用於2次視頻編碼的場景。第一次編碼一般把分析統計數據記錄到1個日誌文件中(參考-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):設置2次編碼模式下日誌文件存儲文件前導,默認是"ffmepg2pass",則完整的文件名就是"PREFIX-N.log",其中的N是指定的輸出流序號(對多流輸出狀況)

  • -vf filtergraph (output):建立一個filtergraph的濾鏡鏈並做用在流上。它實爲-filter:v的別名,詳細參考-filter選項。

高級視頻選項

  • -pix_fmt[:stream_specifier] format (input/output,per-stream):設置像素格式。使用-pix_fmts能夠顯示全部支持的像素格式。若是設置的像素格式不能被選中(啓用),則ffmpeg會輸出一個警告和並選擇這個編碼最好(兼容)的像素格式。若是pix_fmt前面前導了一個+字符,ffmepg會在要求的像素格式不被支持時退出,這也意味着濾鏡中的自動轉換也會被禁止。若是pix_fmt是單獨的+,則ffmpeg選擇和輸入(或者濾鏡通道)同樣的像素格式做爲輸出,這時自動轉換也會被禁止。

  • -sws_flags flags (input/output):選擇SwScaler放縮標誌量。

  • -vdt n:丟棄的門限設置。

  • -rc_override[:stream_specifier] override (output,per-stream):在特定時間範圍內的間隔覆蓋率,override的格式是"int\int\int"。其中前兩個數字是開始幀和結束幀,最後一個數字若是爲正則是量化模式,若是爲負則是品質因素。

  • -ilme:支持交錯編碼(僅MPEG-2和MPEG-4)。若是你的輸入是交錯的,並且你想保持交錯格式,又想減小質量損失,則選此項。另外一種方法是採用-deinterlace對輸入流進行分離,但會引入更多的質量損失。

  • -psnr:計算壓縮幀的PSNR

  • -vstats:複製視頻編碼統計分析到日誌文件vstats_HHMMSS.log

  • -vstats_file file:複製視頻編碼統計分析到file所指的日誌文件中。

  • -top[:stream_specifier] n (output,per-stream): 指明視頻幀數據描述的起點。頂部=1/底部=0/自動=-1(以往CRT電視掃描線模式)

  • -dc precision:Intra_dc_precision值。

  • -vtag fourcc/tag (output):是-tag:v的別名,強制指定視頻標籤/fourCC (FourCC全稱Four-Character Codes,表明四字符代碼 (four character code), 它是一個32位的標示符,其實就是typedef unsigned int FOURCC;是一種獨立標示視頻數據流格式的四字符代碼。)

  • -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分鐘以及章節chapters-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秒一個關鍵幀:
-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:使用Apple的VDA硬件加速

    • vdpau:使用VDPAU(Video Decode and Presentation API for Unix,類unix下的技術標準)硬件加速

    • dxva2:使用DXVA2 (DirectX Video Acceleration,windows下的技術標準) 硬件加速。

    這個選項可能並不能起效果(它依賴於硬件設備支持和選擇的解碼器支持)

    注意:不少加速方法(設備)如今並不比現代CPU快了,並且額外的ffmpeg須要拷貝解碼的幀(從GPU內存到系統內存)完成後續處理(例如寫入文件),從而形成進一步的性能損失。因此當前這個選項更多的用於測試。

  • -hwaccel_device:[:stream_specifier] hwaccel_device (input,per-stream):選擇一個設備用於硬件解碼加速。這個選項必須同時指定了-hwaccel纔可能生效。它也依賴於指定的設備對於特定編碼的解碼加速支持性能。

    • vdpau:對應於VDPAU,在X11(類Unix)顯示/屏幕 上的,若是這個選項值沒有選中,則必須在DISPLAY環境變量中有設置。

    • dxva2:對應於DXVA2,這個是顯示硬件(卡)的設備號,若是沒有指明,則採用默認設備(對於多個卡時)。

音頻選項

  • -aframes number (output):設置number音頻幀輸出,是-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):禁止輸出音頻

  • -acode codec (input/output):設置音頻解碼/編碼的編/解碼器,是-codec:a的別名

  • -sample_fmt[:stream_specifier] sample_fmt (output,per-stream):設置音頻樣例格式。使用-sample_fmts能夠獲取全部支持的樣例格式。

  • -af filtergraph (output):對音頻使用filtergraph濾鏡效果,其是-filter:a的別名,參考-filter選項。

高級音頻選項

  • -atag fourcc/tag (output):強制音頻標籤/fourcc。這個是-tag:a的別名。

  • -absf bitstream_filter:要深刻了解參考-bsf

  • -guess_layout_max channels (input,per-stream):若是音頻輸入通道的佈局不肯定,則嘗試猜想選擇一個能包括全部指定通道的佈局。例如:通道數是2,則ffmpeg能夠認爲是2個單聲道,或者1個立體聲聲道而不會認爲是6通道或者5.1通道模式。默認值是老是試圖猜想一個包含全部通道的佈局,用0來禁用。

字幕選項

  • -scodec codec (input/output):設置字幕解碼器,是-codec:s的別名。

  • -sn (output):禁止輸出字幕

  • -sbsf bitstream_filter:深刻了解請參考-bsf

高級字幕選項

  • -fix_sub_duration:修正字幕持續時間。對每一個字幕根據接下來的數據包調整字幕流的時間常數以防止相互覆蓋(第一個沒有完下一個就出來了)。這對不少字幕解碼來講是必須的,特別是DVB字幕,由於它在原始數據包中只記錄了一個粗略的估計值,最後還以一個空的字幕幀結束。

    這個選項可能失敗,或者出現誇張的持續時間或者合成失敗,這是由於數據中有非單調遞增的時間戳。

    注意此選項將致使全部數據延遲輸出到字幕解碼器,它會增長內存消耗,並引發大量延遲。

  • -canvas_size size:設置字幕渲染區域的尺寸(位置)

高級選項

  • -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的流,0號流),第二個則指定1號流的,以此類推。

    若是在流限定符前面有一個-標記則代表建立一個「負」映射,這意味着禁止該流輸出,及排除該流。

    一種替代的形式是在複合濾鏡中利用[linklabel]來進行映射(參看-filter_complex選項)。其中的linklabel必須是輸出濾鏡鏈圖中已命名的標籤。

    例子:映射第一個輸入文件的全部流到輸出文件:

ffmpeg -i INPUT -map 0 output

又如,若是在輸入文件中有兩路音頻流,則這些流的標籤就是"0:0"和"0:1",你可使用`-map`來選擇某個輸出,例如:
ffmpeg -i INPUT -map 0:1 out.wav

這將只把輸入文件中流標籤爲"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:a:2 OUTPUT

選擇全部的流除了第二音頻流外的流進行輸出是:
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT

選擇輸出英語音頻流:
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT

**注意**應用了該選項將自動禁用默認的映射。
  • -ignore_unknown:若是流的類型未知則忽略,而不進行復制。

  • -copy_unknown:複製類型未知的流。

  • -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.chnnel_id會映射一個靜音通道

    例如INPUT是一個立體聲音頻文件,你能夠分別選擇兩個音頻通道(下面實際上對於輸入是交換了2個音頻通道順序進行輸出):

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個是立體聲)。聯合使用`-ac`與`-map_channel`,並且在輸入的`-map_channel`與`-ac`不匹配(例如只有2個`-map_channel`,又設置了`-ac 6`)時將使指定音頻流通道提升增益。

你能夠詳細的對每一個輸入通道指派輸出以分離整個輸入文件,例以下面就把有`INPUT`文件中的兩個音頻分別輸出到兩個輸出文件中(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:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg

**注意**當前一個輸出流僅能與一個輸入通道鏈接,既你不能實現利用`-map_channel`把多個輸入的音頻通道整合到不一樣的流中(從同一個文件或者不一樣文件)或者是混合它們成爲單獨的流,例如整合2個單聲道造成立體聲是不可能的。可是分離一個立體聲成爲2個獨立的單聲道是可行的。

若是你須要相似的應用,你須要使用`amerge`濾鏡,例如你須要整合一個媒體(這裏是input.mkv)中的2個單聲道成爲一個立體聲通道(保持視頻流不變),你須要採用下面的命令:
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讀取輸出元數據信息。注意這裏的文件索引也是以0開始計數的,而不是文件名。參數metadata_spec_in/out指定的元數據將被複制,一個元數據描述能夠有以下的信息塊:

    • g:全局元數據,這些元數據將做用於整個文件

    • s[:stream_spec]:每一個流的元數據,steam_spec的介紹在流指定章節。若是是描述輸入流,則第一個被匹配的流相關內容被複制,若是是輸出元數據指定,則全部匹配的流相關信息被複制到該處。

    • c:chapter_index:每一個章節的元數據,chapter_index也是以0開始的章節索引。

    • p:program_index:每一個節目元數據,program_index是以0開始的節目索引

    若是元數據指定被省略,則默認是全局的。

    默認全局元數據會從第一個輸入文件每一個流每一個章節依次複製(流/章節),這種默認映射會由於顯式建立了任意的映射而失效。一個負的文件索引就能夠禁用默認的自動複製。

    例如從輸入文件的第一個流複製一些元數據做爲輸出的全局元數據

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):ffmpeg在編碼處理了duration秒後退出。

  • -dump (global):複製每一個輸入包到標準輸出設備

  • -hex (global):複製包時也複製荷載信息

  • -re (input):以指定幀率讀取輸入。一般用於模擬一個硬件設備,例如在直播輸入流(這時是讀取一個文件)。不該該在實際設備或者在直播輸入中使用(由於這將致使數據包的丟棄)。默認ffmpeg會盡可能以最高可能的幀率讀取。這個選項能夠下降從輸入讀取的幀率,這經常使用於實時輸出(例如直播流)。

  • -loop_input:循環輸入流。當前它僅做用於圖片流。這個選項主要用於FFserver自動化測試。這個選項如今過期了,應該使用-loop 1

  • -loop_output number_of_times:重複播放number_of_times次。這是對於GIF類型的動畫(0表示持續重複而不中止)。這是一個過期的選項,用-loop替代。

  • -vsync parameter:視頻同步方式。爲了兼容舊,常被設置爲一個數字值。也能夠接受字符串來做爲描述參數值,其中可能的值是:

    • 0,passthrough:每一個幀都經過時間戳來同步(從解複用到混合)。

    • 1,cfr:幀將複製或者降速以精準達到所要求的恆定幀速率。

    • 2,vfr:個別幀經過他們的時間戳或者降速以防止2幀具備相同的時間戳

    • drop:直接丟棄全部的時間戳,而是在混合器中基於設定的幀率產生新的時間戳。

    • -1,auto:根據混合器功能在1或者2中選擇,這是默認值。

    注意時間戳能夠經過混合器進一步修改。例如avoid_negative_ts被設置時。

    利用-map你能夠選擇一個流的時間戳做爲憑據,它能夠對任何視頻或者音頻 不改變或者從新同步持續流到這個憑據。

  • -frame_drop_threshold parameter:丟幀的閥值,它指定後面多少幀內可能有丟幀。在幀率計數時1.0是1幀,默認值是1.1。一個可能的用例是避免在混雜的時間戳或者須要增長精準時間戳的狀況下確立丟幀率。

  • -async samples_per_second:音頻同步方式。"拉伸/壓縮"音頻以匹配時間戳。參數是每秒最大可能的音頻改變樣本。-async 1是一種特殊狀況指只有開始時校訂,後續再也不校訂。

    注意時間戳還能夠進一步被混合器修改。例如avoid_negative_ts選項被指定時

    已不推薦這個選項,而是用aresample音頻濾波器代替。

  • -copyts:不處理輸入的時間戳,保持它們而不是嘗試審覈。特別是不會消除啓動時間偏移值。

    注意根據vsync同步選項或者特定的混合器處理流程(例如格式選項avoid_negative_ts被設置)輸出時間戳會忽略匹配輸入時間戳(即便這個選項被設置)

  • -start_at_zero:當使用-copyts,位移輸入時間戳做爲開始時間0.這意味着使用該選項,同時又設置了-ss,例如-ss 50則輸出中會從50秒開始加入輸入文件時間戳。

  • -copytb mode:指定當流複製時如何設置編碼時間基準。mode參數是一個整數值,能夠有以下可能:

    • 1表示使用分離器時間基準,從分離器中複製時間戳到編碼中。複製可變幀率視頻流時須要避免非單調遞增的時間戳。

    • 0表示使用解碼器時間基準,使用解碼器中獲取的時間戳做爲輸出編碼基準。

    • -1嘗試自動選擇,只要能產生一個正常的輸出,這是默認值。

  • -shortest (output):完成編碼時最短輸入端。

  • -dts_delta_threshold:時間不連續增量閥值。

  • -muxdelay seconds (input):設置最大 解複用-解碼 延遲。參數是秒數值。

  • -maxpreload seconds (input):設置初始的 解複用-解碼延遲,參數是秒數值。

  • -streamid output-stream-index:new-value (output):強制把輸出文件中序號爲output-stream-id的流命名爲new-value
    的值。這對應於這樣的場景:在存在了多輸出文件時須要把一個流分配給不一樣的值。例如設置0號流爲33號流,1號流爲36號流到一個mpegts格式輸出文件中(這至關於對流創建連接/別名):

ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts
  • -bsf[:stream_specifier] bitstream_filters (output,per-stream):爲每一個匹配流設置bit流濾鏡。bitstream_filters是一個逗號分隔的bit流濾鏡列表。可使用-bsfs來得到當前可用的bit流濾鏡。

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:爲匹配的流設置標籤/fourcc。

  • -timecode hh:mm:ssSEDff:指定時間碼,這裏SEP若是是:則不減小時間碼,若是是;或者.則可減小。

ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
  • -filter_complex filtergraph (global):定義一個複合濾鏡,能夠有任意數量的輸入/輸出。最簡單的濾鏡鏈圖至少有一個輸入和一個輸出,且須要相同類型。參考-filter以獲取更多信息(更有價值)。filtergraph用來指定一個濾鏡鏈圖。關於濾鏡鏈圖的語法能夠參考ffmpeg-filters相關章節。

    其中輸入鏈標籤必須對應於一個輸入流。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):定義一個複合濾鏡,至少有一個輸入和/或輸出,等效於-filter_complex

  • -filter_complex_script filename (global):這個選項相似於-filter_complex,惟一不一樣就是它的參數是文件名,會從這個文件中讀取複合濾鏡的定義。

  • -accurate_seek (input):這個選項會啓用/禁止輸入文件的精肯定位(配合-ss),它默認是啓用的,便可以精肯定位。須要時可使用-noaccurate_seek來禁用,例如在複製一些流而轉碼另外一些的場景下。

  • -seek_timestamp (input):這個選項配合-ss參數能夠在輸入文件上啓用或者禁止利用時間戳的定位。默認是禁止的,若是啓用,則認爲-ss選項參數是正式的時間戳,而不是由文件開始計算出來的偏移。這通常用於具備不是從0開始時間戳的文件,例如一些傳輸流(直播下)。

  • -thread_queue_size size (input):這個選項設置能夠從文件或者設備讀取的最大排隊數據包數量。對於低延遲高速率的直播流,若是不能及時讀取,則出現丟包,因此提升這個值能夠避免出現大量丟包現象。

  • -override_ffserver (global):對ffserver的輸入進行指定。使用這個選項ffmpeg能夠把任意輸入映射給ffserver而且同時控制不少編碼可能。若是沒有這個選項,則ffmpeg僅能根據ffserver所要求的數據進行傳輸。

    這個選項應用場景是ffserver須要一些特性,但文件/設備不提供,這時能夠利用ffmpeg做爲中間處理環節控制後輸出到ffserver到達所須要求。

  • -sdp_file file (global):輸出sdp信息到文件file。它會在至少一個輸出不是rtp流時同時輸出sdp信息。

  • -discard (input):容許丟棄特定的流或者分離出的流上的部分幀,但不是全部的分離器都支持這個特性。

    • none:不丟幀

    • default:丟棄無效幀

    • noref:丟棄全部非參考幀

    • bidir:丟棄全部雙向幀

    • nokey:丟棄全部非關鍵幀

    • all:丟棄全部幀

  • -xerror (global):在出錯時中止並退出

做爲一個特殊的例外,你能夠把一個位圖字幕(bitmap subtitle)流做爲輸入,它將轉換做爲同於文件最大尺寸的視頻(若是沒有視頻則是720x576分辨率)。注意這僅僅是一個特殊的例外的臨時解決方案,若是在libavfilter中字幕處理方案成熟後這樣的處理方案將被移除。

例如須要爲一個儲存在DVB-T上的MPEG-TS格式硬編碼字幕,並且字幕延遲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 的PIDs,分別指向視頻、音頻和字幕流,通常做爲MPEG-TS中的0:0,0:3和0:7是實際流標籤)

預設文件

一個預設文件是選項/值對的序列(option=value),每行都是一個選項/值對, 用於指定一系列的選項,而這些通常很難在命令行中指定(限於命令行的一些限制,例如長度限制)。以#開始的行是註釋,會被忽略。通常ffmpeg會在目錄樹中檢查presets子目錄以獲取預設文件。

有兩種類型的預設文件:ffpreset 和 avpreset。

ffpreset類型預設文件

採用ffpreset類型預設文件主要包含vpreapresprefpre選項。其中fpre選項的參數能夠代替預設的名稱做爲輸入預設文件名,以用於任何一種編碼格式。對於vpreaprespre選項參數會指定一個預設定文件用於當前編碼格式以替代(做爲)同類項的預訂選項。

選用預設文件傳遞vpreaprespre的參數arg有下面一些搜索應用規則:

  • 將在目錄$FFMPEG_DATADIR(若是設置了)和$HOME/.ffmpeg目錄和配置文件中定義的數據目錄(通常是PREFIX/share/ffmpeg),以及ffpresets所在的執行文件目錄下ffmpeg搜索對應的預約義文件arg.ffpreset,例如參數是libvpx-1080p,則對應於文件libvpx-1080p.ffpreset

  • 若是沒有該文件,則進一步在前述目錄下搜索codec_name-arg.ffpreset文件,若是找到即應用。例如選擇了視頻編碼器-vcodec libvpx-vpre 1080p則對應的預設文件名是libvpx-1080p.ffpreset

avpreset類型預設文件

avprest類型預設文件以pre選項引入。他們工做方式相似於ffpreset類型預設文件(即也是選項值對序列),但只對於特定編碼器選項,所以一些 選項值 對於不適合的編碼器是無效的。根據pre的參數arg查找預設文件基於以下規則:

  • 首先搜索$AVCONV_DATADIR所指目錄(若是定義了),其次搜索$HOME/.avconv目錄,而後搜索執行文件所在目錄(一般是PREFIX/share/ffmpeg),在其下查找arg.avpreset文件。第一個匹配的文件被應用。

  • 若是查找不到,若是還同步還指定了編碼(如-vcodec libvpx)再之前面目錄順序,以codec_name-arg.avpreset再次查找文件。例如對於有選項-vcodec libvpx-pre 1080p將搜索libvpx-1080p.avpreset

  • 若是尚未找到,將在當前目錄下搜索arg.avpreset文件。

相關文章
相關標籤/搜索