2. FFmpeg命令行工具的使用

目錄 | TABLE OF CONTENT


[TOC]


注意:為了避免專有名詞翻譯帶來的混淆,直接使用專有名詞原語言。你應(yīng)該在理解其原理的基礎(chǔ)之上來處理這些專有名詞,而不是為了翻譯。

1. 概述

ffmpeg是ffmpeg項(xiàng)目下的一個(gè)命令行工具,它是一個(gè)非??焖俚囊粢曨l轉(zhuǎn)換在工具,也可以從現(xiàn)場的音視頻源獲取(捕捉音視頻源)。它可以在任意采樣率之間進(jìn)行轉(zhuǎn)換,并使用高質(zhì)量的多相過濾器即時(shí)調(diào)整視頻大小。

ffmpeg通過指定-i選項(xiàng)可以從任意數(shù)量的輸入"文件"中讀取數(shù)據(jù)(這些可以是常規(guī)文件、命名管道文件、網(wǎng)絡(luò)流、捕獲設(shè)備等),并寫入任意數(shù)量的輸出"文件",其中輸出由一個(gè)純粹的輸出URL指定,任何在命令行中不能被解釋為選項(xiàng)的內(nèi)容都被認(rèn)為是一個(gè)輸出URL。

原則上,每個(gè)輸入或者輸出URL都能夠包含不同類型的任意數(shù)量的流(視頻/音頻/字幕/附件/數(shù)據(jù))。流的數(shù)量和(或者)類型可能受到容器格式[1]的限制。選擇哪個(gè)流從哪個(gè)輸入到哪個(gè)輸出操作是自動(dòng)完成的,我們也可以使用-map選項(xiàng)來指定(具體請(qǐng)查看stream selection 章節(jié))。

為了在選項(xiàng)中引用輸入文件,你必須使用索引(索引從0開始)。比如:第一個(gè)輸入文件是0,第二個(gè)是1,等等。

類似地,文件中的流由它們的索引引用。比如:2:3 就表示引用第三個(gè)文件中的第四個(gè)流。n:m的形式其實(shí)可以簡單地看作:n代表文件索引,m代表流的索引。(該知識(shí)會(huì)在后續(xù)章節(jié)詳細(xì)講解)

作為一個(gè)基本的原則,在FFmpeg中,選項(xiàng)被應(yīng)用于下一個(gè)指定的文件。因此,順序非常重要,并且你可以在命令行下多次使用相同的選項(xiàng)。然后每一個(gè)事件被應(yīng)用于下一個(gè)輸入或者輸出文件。除了這個(gè)規(guī)則之外的選項(xiàng)被做為全局選項(xiàng),應(yīng)當(dāng)首先指定。

不要混淆了輸入和輸出文件,首先被指定的一定是輸入文件,然后才是輸出文件。同樣,也別混淆了屬于每一個(gè)文件的選項(xiàng),所有的選項(xiàng)被應(yīng)用于下一個(gè)輸入或者輸出文件,并在文件之間復(fù)位。

例如:

設(shè)置輸出文件的比特率為64 kbit/s[2]

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

強(qiáng)制輸出文件的幀數(shù)率[3]為24fps

ffmpeg -i input.avi -r 24 output.avi

強(qiáng)制輸入文件(僅僅適用于原始格式)的幀數(shù)率為1fps,強(qiáng)制輸出文件的幀數(shù)率為24fps。

ffmpeg -r 1 -i input.m2v -r 24 output.avi

注意:有些格式的選項(xiàng)可能要求輸入文件是原始的,比如要更改輸入文件的幀數(shù)率的時(shí)候,有些容器格式協(xié)議難以或者不支持該操作

2. 詳細(xì)說明

在FFmpeg中,每一個(gè)輸出的轉(zhuǎn)碼過程可以用如下圖來描述:

trancoding_process.png

簡單地講,轉(zhuǎn)碼就是將數(shù)據(jù)從一種格式轉(zhuǎn)換為另一種格式的過程。

ffmpeg調(diào)用libavformat庫(包含多路解復(fù)用器[4])來讀取輸入文件,并從中獲取包含編碼數(shù)據(jù)的數(shù)據(jù)包。當(dāng)有多個(gè)輸入文件時(shí),ffmpeg嘗試在任何活動(dòng)的輸入流上通過跟蹤最低時(shí)間戳來保持同步。然后將編碼的數(shù)據(jù)包傳遞給解碼器。解碼器會(huì)產(chǎn)生未壓縮的數(shù)據(jù)幀(原始的video/PCM、audio/...),隨后被過濾后進(jìn)一步處理。過濾之后,數(shù)據(jù)幀被傳遞給編碼器,編碼器將其編碼,然后輸出編碼包。最終這些編碼好的包被傳遞給復(fù)用器[5],復(fù)用器將編碼包寫入輸出文件。

這里簡單解釋一下復(fù)用器和解復(fù)用器。視頻文件實(shí)際上類似于zip文件,它們是由多個(gè)不同類型的數(shù)據(jù)文件組成的,其中包含元數(shù)據(jù)、視頻軌道、音頻軌道、字幕數(shù)據(jù)等,各個(gè)數(shù)據(jù)還具備自己的元數(shù)據(jù),因此,這些數(shù)據(jù)文件會(huì)通過一個(gè)叫做復(fù)用器的機(jī)制按照一定的標(biāo)準(zhǔn)組合成一個(gè)文件。相反,解復(fù)用器就是將文件還原為多個(gè)數(shù)據(jù)文件的機(jī)制,二者是相反的過程,由于標(biāo)準(zhǔn)的存在,二者是可逆的操作。被還原成的數(shù)據(jù)文件(如數(shù)據(jù)幀、音頻等)叫做原始文件。

2.1. 過濾(filtering)

在編碼之前,ffmpeg可以利用libavfilter庫中的過濾器來處理原始的視頻和音頻數(shù)據(jù)幀(這個(gè)過程稱之為過濾,在最終輸出文件之前,對(duì)各個(gè)產(chǎn)出的數(shù)據(jù)進(jìn)行處理,并且這個(gè)過程是鏈?zhǔn)降?,想象一個(gè)流水線作業(yè),多個(gè)過濾器就在該流水線中)。因此,多個(gè)過濾鏈就形成了一個(gè)過濾圖。ffmpeg可以區(qū)分兩種過濾器圖類型:簡單類型(simple filtergraphs)和復(fù)合類型(complex filtergraphs)。

通俗解釋小貼士:filter主要處理音視頻數(shù)據(jù)的各種特性,諸如視頻大小伸縮、添加水印、添加logo、去除logo等。這些操作會(huì)在產(chǎn)生最終輸出文件的過程中利用過濾器來注入,因此,形象的表示為“過濾”。雖然在命令行中一串指令即可完成需要的輸出文件,但是ffmpeg底層是通過libavfilter庫來對(duì)該過程進(jìn)行過濾處理。

2.1.1. 簡單過濾圖(以下使用simple filtergraphs)

simple filtergraphs(簡單過濾圖)只有一個(gè)相同類型的輸入和輸出??梢酝ㄟ^簡單地在編碼和解碼之間插入一個(gè)步驟來表示,如下圖:

simple-filtergraphs.png

simple filtergraphs(簡單過濾圖)通過使用-vf或者-af別名選項(xiàng)來指定,-vf用于視頻選項(xiàng),展開vf為video filter,同理-af為audio filter。

由此可見,過濾操作就是在輸入和輸出之間插入的過程,這個(gè)過程可以對(duì)數(shù)據(jù)幀做調(diào)整,然后再次按照容器格式標(biāo)準(zhǔn)編碼進(jìn)行輸出。下圖是一個(gè)簡單的對(duì)視頻進(jìn)行伸縮的過程:

scale.png

注意:有些過濾器會(huì)改變幀的屬性,但是不會(huì)改變幀的內(nèi)容,比如fps過濾器,它改變了幀數(shù),卻不改變幀內(nèi)容。

小貼士:simple filtergraphs是只有一個(gè)輸入和輸出的過濾圖。

2.1.2. 復(fù)雜過濾圖(complex filtergraphs)

復(fù)雜過濾圖在一個(gè)流中,不能描述為一個(gè)簡單的過濾鏈的線性處理過程。它相比于simple filtergraphs要復(fù)雜,不再是單一的輸入和輸出了,它接受多個(gè)輸入和產(chǎn)生多個(gè)輸出。如下圖:

complex-filter-graph.png

complex filtergraphs(復(fù)雜過濾器)使用-filter_complex選項(xiàng)來配置。請(qǐng)注意,這個(gè)選項(xiàng)是全局的,因此,它不能與單個(gè)的流或者文件相關(guān)聯(lián)。-lavfi選項(xiàng)等同于-filter_complex選項(xiàng)。

小貼士:復(fù)雜過濾器由多個(gè)輸入和輸出,通過-filter_complex選項(xiàng)來指定,該選項(xiàng)是全局的,不能和單個(gè)的流或者文件關(guān)聯(lián)。

2.2. 流拷貝(Stream copy)

流復(fù)制對(duì)于更改容器格式或者修改容器級(jí)別的元數(shù)據(jù)很有用。它使ffmpeg省略了指定流的編碼和解碼的步驟。其過程如下圖:

stream-copy.png

因?yàn)槭÷粤骶幋a解碼過程,該過程將會(huì)非??焖?,并且沒有質(zhì)量的損失。然而,由于很多其他因素,可能會(huì)失敗。而且無法提供過濾器,過濾器的過程需要未壓縮的數(shù)據(jù)。

3. 流的選擇(Stream selection)

默認(rèn)情況下,ffmpeg只包含輸入文件中存在的每種類型的一個(gè)流(video/audio/subtitle),并將它們添加到每個(gè)輸出文件。它根據(jù)以下標(biāo)準(zhǔn)選擇最好的:

1. 對(duì)視頻而言,選擇最高分辨率的流;
??2. 對(duì)音頻而言,選擇具有最多頻道的流;
??3. 對(duì)字幕而言,選擇第一個(gè)字幕流;
??4. 在相同類型的幾個(gè)流速率相同的情況下,選擇索引最低的一個(gè)流。

你可以使用-vn/-an/-sn/-dn選項(xiàng)來禁用這些默認(rèn)項(xiàng)。對(duì)于完全地手動(dòng)控制,可以使用-map選項(xiàng)來指定,該選項(xiàng)會(huì)禁用前面描述的默認(rèn)項(xiàng)。

4. 選項(xiàng)(Options)

如果沒有另外指定,所有的數(shù)值選項(xiàng)接受一個(gè)表現(xiàn)為數(shù)字的字符串作為輸入,后面跟上國際單位制,如“K”、“M”、“G”等單位后綴。比如:1M,1K,1G等,如果在單位前綴中加入了i,ffmpeg將會(huì)解釋為二進(jìn)制的倍數(shù),比如1KB=1000Byte,1KiB=1024Byte

不帶參數(shù)的選項(xiàng)是布爾選項(xiàng),這會(huì)設(shè)置相應(yīng)的值為true,也可以在參數(shù)前面添加no前綴來設(shè)置為false,比如“-foo”和“-nofoo”。

4.1. 流說明符

格式:

stream_index
    #通過索引來匹配,如:-threads:1 4

stream_type[:stream_index]
    # 通過類型/類型+索引來匹配,流類型由v/V(視頻)、a/A(音頻)、s(字幕)、d(數(shù)據(jù))、t(附件)。
    # v匹配所有視頻流,V僅僅匹配沒有附加圖片的視頻,如視頻縮略圖或者封面藝術(shù)圖片。
    # 如果stream_index被指定了,它將匹配該類型的指定索引的流。否則將匹配所有該類型的流。

p:program_id[:stream_index]
    # 如果指定了stream_index,將會(huì)在指定節(jié)目id的節(jié)目中匹配指定stream_index的流。否則,將匹配所有在該節(jié)目中的流。
    
stream_id 或者 i:stream_id
    # 通過流id匹配流。

m:key[:value]
    # 使用具有指定值的元數(shù)據(jù)標(biāo)簽鍵匹配流,如果沒有指定值,則匹配包含具有任意值的給定標(biāo)簽的流。

u
    # 匹配可用配置的流,必須定義編解碼器,且必須存在的信息,如視頻維度、音頻采樣率。
    # 注意,在ffmpeg中,通過元數(shù)據(jù)匹配只對(duì)輸入文件有效。

一些選項(xiàng)應(yīng)用于每一個(gè)流中,比如比特率和編解碼器。流說明符用于精確地指定哪一個(gè)指定了選項(xiàng)的流屬于誰的。流說明符通常是附加到選項(xiàng)名上的一個(gè)字符串,它被一個(gè)冒號(hào)分割。如下:

-codec:a:1 ac3

上述指令中包含了a:1流說明符,這會(huì)匹配第二個(gè)音頻流,a代表audio(音頻),1代表索引(從0開始)。因此,它將為第二個(gè)音頻流選擇ac3編解碼器。

一個(gè)流說明符可以匹配多個(gè)流,以便將該選項(xiàng)應(yīng)用于所有匹配的流。比如:

-b:a 128k

在上述說明符中匹配了所有的音頻流(通過省略數(shù)字)。

一個(gè)空的說明符能匹配所有所有流。比如:

-codec copy
# 或者
-codec:copy

上述指令可以匹配所有流,如流復(fù)制一節(jié)講到的,copy不必重新編碼。

4.2. 一般選項(xiàng)

以下選項(xiàng)可以在所有ff*工具中共享(如ffmpeg、ffserver、ffplay、ffprobe)。

-L
    # 顯示許可(LICENSE)
    
-h,-?,-help,--help [arg]
    # 顯示幫助信息,如果在后面給定了參數(shù),那么顯示該指定參數(shù)的特定幫助信息。
    [arg]的值:
        long
            # 打印除基本工具之外的高級(jí)工具選項(xiàng)。
        full
            # 打印完整的選項(xiàng)列表,包括共享選項(xiàng)和編解碼器、解復(fù)用器、復(fù)用器、過濾器等的私有選項(xiàng)。
        decoder=decoder_name
            # 打印給定的解碼器名的詳細(xì)信息??梢允褂?decoders選項(xiàng)獲取所有的解碼器。
        encoder=encoder_name
            # 打印給定編碼器名稱的詳細(xì)信息??梢允褂?encoders選項(xiàng)獲取所有的編碼器。
        demuxer=demuxer_name
            # 打印給定解復(fù)用器的詳細(xì)信息。使用-formats選項(xiàng)獲取所有解復(fù)用器和復(fù)用器。
        muxer=muxer_name
            # 打印給定復(fù)用器的詳細(xì)信息。使用-formats選項(xiàng)獲取所有復(fù)用器和解復(fù)用器。
        filter=filter_name
            # 打印給定過濾器的詳細(xì)信息。使用-filters選項(xiàng)獲取所有的過濾器。

-version
    # 顯示版本號(hào)。
    
-formats
    # 顯示可用的容器格式(包括設(shè)備)。
    
-demuxers
    # 顯示可用的解復(fù)用器。
    
-muxers
    # 顯示可用的復(fù)用器。
    
-devices
    # 顯示可用的設(shè)備。
    
-codecs
    # 顯示所有l(wèi)ibavcodec已知的編解碼器。
    
-decoders
    # 顯示可用的解碼器。
    
-encoders
    # 顯示可用的編碼器。
    
-bsfs
    # 顯示可用的比特流過濾器。
    
-protocols
    # 顯示可用的協(xié)議。
    
-filters
    # 顯示可用的libavfilter過濾器。
    
-pix_fmts
    # 顯示可用的像素格式。
    
-sample_fmts
    # 顯示可用的簡單格式。
    
-layouts
    # 顯示頻道名稱和標(biāo)準(zhǔn)頻道布局。
    
-colors
    # 顯示識(shí)別的顏色名稱。
    
-source device[,opt1=val1[,opt2=val2]...]
    # 顯示輸入設(shè)備的自動(dòng)檢測源,一些設(shè)備可能提供于系統(tǒng)相關(guān)的源名稱,這些源是不能被自動(dòng)檢測的。
    
-sinks device[,opt1=val1[,opt1=val2]...]
    # 顯示輸出設(shè)備的自動(dòng)檢測接收器。
    
-loglevel [repeat+]loglevel | -v [repeat+]loglevel
    # 設(shè)置庫使用的日志級(jí)別,添加的repeat+表明重復(fù)的日志輸出不應(yīng)該被壓縮到第一行。
    # loglevel可用值如下:
    quiet, -8
        # 不顯示任何信息。
    panic,0
        # 只顯示可能導(dǎo)致進(jìn)程崩潰的致命錯(cuò)誤。
    fatal,8
        # 只顯示致命錯(cuò)誤,這些錯(cuò)誤會(huì)導(dǎo)致進(jìn)程無法繼續(xù)。
        
    error,16
        # 顯示所有錯(cuò)誤。
        
    warning,24
        # 顯示所有警告和錯(cuò)誤。
        
    info,32
        # 顯示處理過程中的信息。

    verbose,40
        # 同info,除了顯示更多交互信息外。
        
    debug,48
        # 顯示所有信息,包括調(diào)試信息。
        
    trace,56
        # 默認(rèn)情況下,節(jié)目記錄到標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr)。如果終端支持著色,則會(huì)標(biāo)記錯(cuò)誤和警告。日志著色可以通過設(shè)定“AV_LOG_FORCE_NOCOLOR”環(huán)境變量或者“NO_COLOR”來禁用。或者強(qiáng)制設(shè)定環(huán)境變量“AV_LOG_FORCE_COLOR”。“NO_COLOR”在未來的ffmpeg版本中將被標(biāo)記為過時(shí)的。
        
-report
    # 將完整的命令行和控制臺(tái)輸出到當(dāng)前的一個(gè)文件中,文件自動(dòng)按照“program-YYYYMMDD-HHMMSS.log”格式命名。這對(duì)于bug的報(bào)告很有幫助。這個(gè)選項(xiàng)隱式地使用了verbose的日志級(jí)別。
    
-hide_banner
    # 禁止打印banner。
    # ff*工具會(huì)在前幾行輸出固定的配置信息和庫的版本等信息,使用該選項(xiàng)可以禁止打印這些橫幅。
    
-cpuflags flags(glogal)
    # 允許設(shè)置和清除cpu 標(biāo)志,該選項(xiàng)用于測試。除非你清楚地知道你在做什么,否則不要使用這個(gè)選項(xiàng)。
    # 可能的cpu標(biāo)志值:
    'x86'
        ‘mmx’
        ‘mmxext’
        ‘sse’
        ‘sse2’
        ‘sse2slow’
        ‘sse3’
        ‘sse3slow’
        ‘ssse3’
        ‘a(chǎn)tom’
        ‘sse4.1’
        ‘sse4.2’
        ‘a(chǎn)vx’
        ‘a(chǎn)vx2’
        ‘xop’
        ‘fma3’
        ‘fma4’
        ‘3dnow’
        ‘3dnowext’
        ‘bmi1’
        ‘bmi2’
        ‘cmov’
        
    ‘ARM’
        ‘a(chǎn)rmv5te’
        ‘a(chǎn)rmv6’
        ‘a(chǎn)rmv6t2’
        ‘vfp’
        ‘vfpv3’
        ‘neon’
        ‘setend’
        
    ‘AArch64’
        ‘a(chǎn)rmv8’
        ‘vfp’
        ‘neon’
        
    ‘PowerPC’
        ‘a(chǎn)ltivec’
        
    ‘Specific Processors’
        ‘pentium2’
        ‘pentium3’
        ‘pentium4’
        ‘k6’
        ‘k62’
        ‘a(chǎn)thlon’
        ‘a(chǎn)thlonxp’
        ‘k8’
        
-opencl_bench
    # 該選項(xiàng)對(duì)所有可用的opencl設(shè)備進(jìn)行基準(zhǔn)測試,并打印結(jié)果。只有使用了--enable-opencl選項(xiàng)編譯了ffmpeg后才會(huì)生效。

4.3. AV選項(xiàng)

libavformat,libavdevice,libavcodec庫直接提供這些選項(xiàng),使用-help查看詳細(xì)信息。

4.4. 主要選項(xiàng)

-f fmt(輸入 / 輸出)
    # 強(qiáng)制輸入或者輸出文件格式。通常輸入文件的格式會(huì)被自動(dòng)檢測。然后通過文件擴(kuò)展名猜測輸出文件格式,因此在大多數(shù)情況下,該選項(xiàng)不需要顯式使用。
    
-i url(輸入文件)
    # 輸入文件的url。
    
-y(全局)
    # 不通過詢問而直接覆蓋輸出文件。
    
-n(全局)
    # 不覆蓋輸出文件,如果已經(jīng)存在同名文件則立即退出。
    
-stream_loop number(輸入)
    # 設(shè)置輸入流應(yīng)當(dāng)循環(huán)的次數(shù),0意味著不循環(huán),-1意味著無限循環(huán)。
    
-c[:stream_specifier] codec (輸入/輸出,每個(gè)流)
-codec[:stream_specifier] codec (輸入/輸出,每個(gè)流)
    # 為一個(gè)或者多個(gè)流選擇一個(gè)解碼器或者編碼器,codec選項(xiàng)是一個(gè)編碼器或者解碼器,或者使用copy來表明這僅僅是流復(fù)制,流的復(fù)制不需要進(jìn)行重新編碼。如:
    ffmpeg -i input.avi -map 0 -c:v libx264 -c:a copy output.avi # 使用libx264來編碼所有的流,并復(fù)制音頻。
    
-t duration(輸入/輸出)
    # 當(dāng)用作輸入選項(xiàng)時(shí)(-i之前),可以限制從輸入文件讀取數(shù)據(jù)的時(shí)間。
    # 當(dāng)用作輸出選項(xiàng)時(shí)(在輸出url之前),到達(dá)持續(xù)時(shí)間后停止寫入數(shù)據(jù)。
    # -t的時(shí)間值必須符合時(shí)間格式規(guī)范。具體參考后面章節(jié)。

-to position(輸出)
    # 在給定的位置上停止寫入數(shù)據(jù)到輸出。position必須符合時(shí)間格式規(guī)范。具體參考后面章節(jié)。
    
-fslimit_size(輸出)
    # 設(shè)置文件大小限制,使用字節(jié)表示。到達(dá)字節(jié)限制時(shí)會(huì)停止寫入字節(jié)數(shù),

-ss position(輸入/輸出)
    # 當(dāng)用作輸入選項(xiàng)時(shí)(-i之前),會(huì)在此文件中尋找position指定的位置。注意:在大多數(shù)容器格式中,不可能完全尋找到,所以ffmpeg會(huì)尋求距離position最近的點(diǎn)。
    # 用作輸出選項(xiàng)時(shí)(在輸出url之前),解碼,但是會(huì)丟棄輸入,直到時(shí)間戳抵達(dá)position。同樣的,position依然是時(shí)間格式。
    
-sseof position(輸入/輸出)
    # 這個(gè)選項(xiàng)于ss相似,但是相對(duì)于文件結(jié)束符(eof=end of file),

-itsoffset offset(輸入)
    # 設(shè)置輸入的時(shí)間偏移量。
    # offset必須是一個(gè)時(shí)間段偏移量。偏移量會(huì)被添加到輸入文件的時(shí)間戳中。指定了正的偏移量意味著相應(yīng)的流被延遲了偏移量設(shè)定的時(shí)間段。
    
-timestamp date(輸出)
    # 在容器中設(shè)置錄制時(shí)間戳。
    # date必須是一個(gè)日期格式規(guī)范。
    
-metadata[:metadata_specifier] key=value(輸出,每個(gè)metadata)
    # 設(shè)置元數(shù)據(jù)鍵值對(duì)。
    # 可選的元數(shù)據(jù)說明符(metadata_specifier)可以用來設(shè)置流/章節(jié)/節(jié)目上的元數(shù)據(jù)。
    # 例如:
        ffmpeg -i input.avi -metadata title="my title" out.flv # 這串指令用于設(shè)置輸出文件的標(biāo)題元數(shù)據(jù)。
        
        ffmpeg -i input.avi -metadata:s:a:0 language=eng out.flv # 設(shè)置該流的第一個(gè)音頻的語言。
        
-disposition[:stream_specifier] value(輸出,每個(gè)流)
    # 該選項(xiàng)會(huì)從輸入流中復(fù)制配置,并且覆蓋輸出流??梢酝ㄟ^設(shè)置其值為0來刪除這個(gè)設(shè)置。
    # 以下是disposition的枚舉值:
    default
    dbd
    original
    comment
    lyrics
    karaoke
    forced
    hearing_impaired
    visual_impaired
    clean_effects
    captions
    descriptions
    metadata
    如:
    ffmpeg -i in.mkv -disposition:a:1 default out.mkv # 將第二個(gè)音頻設(shè)置為default
    
    ffmpeg -i INPUT -disposition:s:0 0 -disposition:s:1 default OUTPUT # 將第二個(gè)字幕流設(shè)置為默認(rèn),從第一個(gè)字幕流中移除默認(rèn)配置。
    
-program [title=title:][program_num=program_num:]st=stream[:st=stream...](輸出)
    # 創(chuàng)建具有指定標(biāo)題和program_num(節(jié)目編號(hào))的節(jié)目。并將指定的流添加到其中。
    
-target type(輸出)
    # 指定目標(biāo)文件類型(vcd、svcd、dvd、dv、dv50),這些類型可能會(huì)加上pal-、ntsc-或者filem-前綴以使用相應(yīng)的標(biāo)準(zhǔn),然后自動(dòng)地設(shè)置格式選項(xiàng)。如:
    ffmpeg -i input.avi -target vcd /tmp/vcd.mpg
    
-dframes number(輸出)
    # 設(shè)置要輸出的數(shù)據(jù)幀數(shù)量。這是一個(gè)過時(shí)的別名,它真是的樣子是這樣的:-frames:d,你應(yīng)該使用這個(gè)來替代。
    
-frames[:stream_specifier] framecount(輸出,每個(gè)流)
    # 在到達(dá)給定的幀數(shù)量后停止寫入流。
    
-q[:stream_specifier] q (輸出,每個(gè)流)
-qscale[:stream_specifier] q (output,per-stream)
    # 使用固定質(zhì)量標(biāo)尺。
    
-filter[:stream_specifier] filtergraph(輸出,每個(gè)流)
    # 根據(jù)指定的filtergraph創(chuàng)建filtergraph。并用其過濾流。
    
-filter_script[:stream_specifier] filename (輸出,每個(gè)流)
    # 該選項(xiàng)于-filter相似。
    
-filter_threads nb_threads (全局)
    # 定義了使用多少個(gè)線程用于處理過濾器管道。每個(gè)管道會(huì)產(chǎn)生一個(gè)線程池用于并行處理。默認(rèn)是可用的cpu核心數(shù)。
    
-pre[:stream_specifier] preset_name (輸出,每個(gè)流)
    # 為匹配的流預(yù)設(shè)。
    
-stats(全局)
    # 打印編碼的進(jìn)度和統(tǒng)計(jì)信息。該選項(xiàng)默認(rèn)開啟,如果要禁用它使用-nostats。
    
-process url(全局)
    # 發(fā)送進(jìn)度信息到url。大約每秒寫入一次。
    
-stdin
    # 在標(biāo)準(zhǔn)輸入中啟用交互,該選項(xiàng)默認(rèn)啟用,要禁用使用-nostdin。
    
-debug_ts(全局)
    # 打印時(shí)間戳信息。該選項(xiàng)默認(rèn)禁用。調(diào)試于測試使用該選項(xiàng)非常有用。
    
-attach filename(輸出)
    # 添加一個(gè)附件到輸出文件,該選項(xiàng)僅有少量的格式支持。比如添加一個(gè)字體文件用于渲染字幕的字體。這個(gè)附件被實(shí)現(xiàn)為一個(gè)特定的流。所以,該選項(xiàng)會(huì)往文件中添加一個(gè)流。如:
    ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.flv # 注意:我們依然需要將metadata指定mime映射。
    
-dump_attachment[:stream_specifier] filename (輸入,每個(gè)流)
    # 提取匹配的附件流到指定的文件中,文件名由filename指定。
    # 如,提取第一個(gè)附件到文件,命名為out.tff:
    ffmpeg -dump_attachment:t:0 out.tff -i INPUT
    
    # 如,提取所有附件到文件中:
    ffmpeg -dump_attachment:t "" -i INPUT
    
-noautorotate
    # 基于文件元數(shù)據(jù)禁用視頻旋轉(zhuǎn)。

4.5. 視頻選項(xiàng)

-vframes number(輸出)

# 設(shè)置視頻幀數(shù)到輸出文件,該選項(xiàng)已過時(shí),它是-frames:v的別名。你應(yīng)當(dāng)使用這個(gè)選項(xiàng)。

-r[:stream_specifier] fps(輸入、輸出、流)

# 設(shè)置幀速率,單位為Hz或者分?jǐn)?shù)。
# 該選項(xiàng)作為輸入選項(xiàng)時(shí),忽略所有存儲(chǔ)于文件中的時(shí)間戳,并以固定不變的幀速率生成時(shí)間戳。
# 作為輸出選項(xiàng)時(shí),復(fù)制或刪除輸入幀以實(shí)現(xiàn)不變輸出幀速率fps。

-s[:stream_specifier] size (輸入、輸出、流)

# 設(shè)置幀大小。
# 用作輸入選項(xiàng)時(shí),它是video_size私有選項(xiàng)的快捷方式。
# 用作輸出選項(xiàng)時(shí),它將縮放視頻過濾器插入相應(yīng)過濾圖的尾部。

-aspect[:stream_specifier] aspect (輸出、流)

# 設(shè)置由aspect指定的視頻顯示寬高比例。
# aspect是一個(gè)浮點(diǎn)數(shù)的字符串,或者是形如num:den的字符串。視頻顯示寬高比中,num代表分子,den代表分母。

-vn(output)

# 禁用視頻錄像。

-vcodec codec(輸出)

# 設(shè)置視頻編解碼器,它是-codec:v的別名。

-pass[:stream_specifier] n(輸出、流)


-vf filtergraph(輸出)

通過指定的filtergraph名創(chuàng)建filtergraph,它是-filter:v的別名。

4.6. 視頻高級(jí)選項(xiàng)

-pix_fmt[:stream_specifier] format(輸入、輸出、流)

# 設(shè)置像素格式。使用-pix_fmts查看所有支持的像素格式。如果像素格式不能被選擇,ffmpeg會(huì)打印警告信息,然后選擇編碼器支持的最佳像素格式。

-sws_flags flags(輸入、輸出)

# 設(shè)置SwScaler的flags。

-vdt n

# 丟棄閾值。

-rc_override[:stream_specifier] override(輸出、流)


-ilme

# 在編碼器中強(qiáng)制隔行掃描(僅支持mpeg-2、mpeg-4),如果你的輸入文件是隔行掃描的,并且想保持最低損失的隔行格式,請(qǐng)使用該選項(xiàng)。
# 另一個(gè)選擇是使用-deinterlace選項(xiàng)來逐行掃描輸入流。

-psnr

# 計(jì)算壓縮幀的PSNR。

-vstats

# 將視頻編碼統(tǒng)計(jì)信息轉(zhuǎn)存到vstats_HHMMSS.log文件中。

-vstats_file file

# 將視頻編碼信息轉(zhuǎn)存到指定文件中。

-vstats_version file

# 指定使用哪一個(gè)vstats格式版本,默認(rèn)為2。
# version = 1:
    frame= %5d q= %2.1f PSNR= %6.2f f_size= %8.9fkb time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s
    
# version > 2:
    out= %2d st= %2d frame= %5d q= %2.1f PSNR= %6.2f f_size= %6d s_size= %8.0fkb time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s

-top[:stream_specifier] n(輸出、流)

# top=1/bottom=/auto=-1

-dc precision

# Intra_dc_precision

-vtag fourcc/tag (輸出)

# -tag:v的別名,強(qiáng)制視頻使用tag/fourcc。

-qphist(全局)

# 顯示QP直方圖。

-vbsf bitstream_filter

# 已過時(shí)

-force_key_frame[:stream_specifier] time[,time...](輸出、流)
-force_key_frame[:stream_specifier] expr:expr(輸出、流)

# 強(qiáng)制指定時(shí)間戳的關(guān)鍵幀,更確切地講,是指定時(shí)間之后的第一幀。如果參數(shù)帶有expr前綴,該字符串會(huì)被解釋為一個(gè)表達(dá)式,在每一幀的時(shí)候會(huì)被計(jì)算。
# 如果添加了chapter [delta]選項(xiàng),將會(huì)擴(kuò)展到文件中所有chapter的開始。如:
-force_key_frames 0:05:00,chapters-0.1

-copyinkf[:stream_specifier](輸出、流)

# 當(dāng)進(jìn)行流復(fù)制時(shí),復(fù)制一些非關(guān)鍵幀。

-init_hw_device type[=name][:device[,key=value...]]

# 使用給定的設(shè)備參數(shù)初始化一個(gè)新的類型名稱為name參數(shù)的硬件設(shè)備。如果沒有指定name參數(shù)的值,則默認(rèn)會(huì)接受一個(gè)格式為tyoe%d的默認(rèn)name。
# 設(shè)備含義和以下參數(shù)依賴于設(shè)備類型:
cuda
    # device是CUDA設(shè)備號(hào)。
    
dxva2
    # device是Direct3D 9的顯示適配器。
    
vaapi
    # device是X11顯示名稱或者DRM渲染節(jié)點(diǎn)。如果未指定,將會(huì)嘗試打開默認(rèn)的X11($DISPLAY),以及第一個(gè)DRM渲染節(jié)點(diǎn)(/dev/dri/renderD128)。
    
vdpau
    # device是X11的顯示名稱,如果未指定,將會(huì)嘗試打開默認(rèn)的X11顯示($DISPLAY)。
    
qsv
    # device在“MFX_IMPL_”為前綴的值中選擇一個(gè)值,我們寫為"MFX_IMPL_*",用*代表所有可能的值。允許的值如下:
    auto
    sw
    hw
    auto_any
    hw_any
    hw2
    hw3
    hw4
    
    # 如果為指定這個(gè)值,“auto_any”將會(huì)成為默認(rèn)選擇被使用。

-init_hw_device type[=name]@source

# 初始化一個(gè)新的類型的硬件設(shè)備,類型名稱由name值指定。

-init_hw_device list

# 列出ffmpeg支持的所有硬件設(shè)備類型。

-filter_hw_device name

# 發(fā)送名為name的硬件設(shè)備到任意過濾圖中的所有過濾器。

-hwaccel[:stream_specifier] hwaccl(輸入、流)

# 使用硬件加速器解碼匹配到的流,可識(shí)別的accl值如下:
none
    # 不使用任何硬件加速器(默認(rèn))。
    
auto
    # 自動(dòng)選擇硬件加速器。
    
vda
    # 使用Apple硬件加速器。
    
vdpau
    # 使用vdpau硬件加速器(Video Decode and Presentation API for Unix)。
    
dxva2
    # 使用dxva2硬件加速器(DerictX Video Acceleration)。
    
vaapi
    # 使用vaapi硬件加速器(Video Acceleration API)。
    
qsv
    # 使用intel QuickSync Video Acceleration為視頻轉(zhuǎn)碼。不同于其他選項(xiàng)值,該選項(xiàng)不啟用加速解碼(每當(dāng)qsv解碼器被選擇時(shí),都會(huì)自動(dòng)使用),除了加速轉(zhuǎn)碼。

-hwaccl_device[:stream_speficier] hwaccl_device(輸入、流)

# 選擇要用于硬件加速的設(shè)備。

-hwaccels

# 列出ffmpeg支持的所有硬件加速器。

4.7. 音頻選項(xiàng)

-aframes number (輸出)

# 設(shè)置要輸出的音頻幀數(shù)。該選項(xiàng)已經(jīng)過時(shí),它是-frames:a的別名,你應(yīng)當(dāng)使用這個(gè)來替代。

-ar[:stream_specifier] freq (輸入、輸出、流)

# 設(shè)置音頻采樣率。

-aq q (輸出)

# 設(shè)置音頻質(zhì)量,它是-q:a的別名。

-ac[:stream_specifier] channels (輸入、輸出、流)

# 設(shè)置音頻通道數(shù),對(duì)于輸出流來說,它被默認(rèn)設(shè)置為輸入流的通道數(shù)。對(duì)于輸入流來說,該選項(xiàng)適用于音頻抓取設(shè)備和原始解復(fù)用器。

-an (輸出)

# 禁用音頻錄音。

-acodec codec (輸入、輸出)

# 設(shè)置音頻編解碼。它是-codec:a的別名。

-sample_fmt[:stream_specifier] sample_fmt (輸出、流)

# 設(shè)置音頻采樣格式??梢允褂?sample_fmts獲取受支持的所有格式列表。

-af filtergraph (輸出)

# 使用給定的filtergraph創(chuàng)建一個(gè)filtergraph,并將這個(gè)filtergraph應(yīng)用于流。該選項(xiàng)是-filter:a的別名。

4.8. 高級(jí)音頻選項(xiàng)

-atag fourcc/tag (輸出)

# 強(qiáng)制音頻tag/fourcc。該選項(xiàng)是-tag:a的別名。

-absf bitstream_filter

# 過時(shí)。

-guess_layout_max channels (輸入、流)

# 如果一些輸入通道布局是未知的,只能在指定最多通道數(shù)的時(shí)候嘗試猜測。

4.9. 字幕選項(xiàng)

-scodec codec(輸入、輸出)

# 設(shè)置字幕的編解碼器,該選項(xiàng)是-codec:s的別名。

-sn(輸出)

# 禁止字幕錄制。

-sbsf bitstream_filter

# 過時(shí)。

4.10. 高級(jí)字幕選項(xiàng)

-fix_sub_duration

# 修復(fù)字幕持續(xù)時(shí)間。對(duì)于每一個(gè)字幕而言,等待相同流中的下一個(gè)數(shù)據(jù)包,并調(diào)整第一個(gè)數(shù)據(jù)包的持續(xù)時(shí)間以避免字幕重疊。這對(duì)于一些字幕的編解碼器是非常必要的,尤其是DVB字幕,因?yàn)樵谠嫉臄?shù)據(jù)包中的持續(xù)時(shí)間只是一個(gè)粗略估算的值,

-canvas_size size

# 設(shè)置用于渲染字幕畫布的大小。

4.11. 高級(jí)選項(xiàng)

-map [-]input_file_id [:stream_specifier][?][,sync_file_id[:stream_specifier]] | [linklabel](輸出)

# 指定一個(gè)或者多個(gè)輸流作為輸出文件的源,每一個(gè)輸入流都由輸入文件的input_file_id索引標(biāo)識(shí),輸入流的id存在與輸入文件中。所有的索引都從0開始。
# 第一個(gè)選項(xiàng)-map指定第0個(gè)輸出流的源,第二個(gè)-map選項(xiàng)指定第1個(gè)輸出流的源,等等。理解-map選項(xiàng)最好的方式就是考慮這樣一種方式:告訴ffmpeg你想從輸入當(dāng)中選擇/復(fù)制哪個(gè)流到輸出中去。下面舉幾個(gè)例子:

# 默認(rèn)
ffmpeg -i INPUT OUTPUT # 當(dāng)沒有指定map時(shí),這是默認(rèn)行為。從本質(zhì)上講,上述指令的行為是從所有輸入中“發(fā)現(xiàn)最高質(zhì)量(單個(gè))”的視頻輸入流和“最高質(zhì)量的(單個(gè))”音頻輸入流,并將它們發(fā)送到輸出,原則上講,所有其他輸入流被丟棄,默認(rèn)行為只選擇最高質(zhì)量的流。

# map選項(xiàng)基本上意味著:將此流包含進(jìn)隨后的輸出文件中。如果我們想要使用-map選項(xiàng)顯示出相同的行為,那么它看上去像是這樣的:
ffmpeg -i INPUT -map single_highest_quality_video_stream_from_all_inputs -map single_highest_quality_audio_stream_from_all_inputs OUTPUT
# 因此,如果你想要選擇從輸入當(dāng)中選擇不同的流或者選擇多個(gè)流,你會(huì)使用map的這個(gè)特性。

# 例子1,從輸入文件中映射所有流到輸出:
ffmpeg -i INPUT -map 0 OUTPUT

# 例子2,如果在輸入文件中有兩個(gè)音頻流,那么這些流標(biāo)記為0:0,0:1。你可以使用-map選擇哪一個(gè)流輸出到輸出文件中:
ffmpeg -i INPUT -map 0:1 OUTPUT.wav

# 例子3,從輸入文件a.mov中選擇索引為2的流(通過標(biāo)識(shí)0:2指定),從輸入文件b.mov中選擇索引為6的流(通過標(biāo)識(shí)1:6指定),將二者復(fù)制到輸出文件out.mov中:
ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov

# 例子4,從一個(gè)輸入文件中選擇所有視頻流和第三個(gè)音頻流,并輸出到指定的OUTPUT:
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT

# 例子5,映射除了第二個(gè)流外的所有流,使用排除映射(通過在-map選項(xiàng)的值前面添加-前綴來排除匹配到的流):
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT # -0:a:1排除了第2個(gè)音頻流。

# 例子6,從第一個(gè)輸入中映射視頻和音頻流,并且使用?來跟蹤,?作為-map選項(xiàng)值的后置,意味著當(dāng)標(biāo)記了?的規(guī)則不存在時(shí),則忽略這個(gè)錯(cuò)誤:
ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT # 如果第一個(gè)音頻流不存在,則忽略。

# 例子7,選擇語言為英語的音頻流:
ffmpeg -i INPUT -map 0:m:lanaguage:eng OUTPUT

-ignore_unknown

# 當(dāng)嘗試復(fù)制流時(shí)失敗,則忽略未知類型的輸入流。

-copy_unknown

# 嘗試復(fù)制流時(shí)出現(xiàn)故障,則允許使用位置類型的輸入流被復(fù)制。

-map_channel [input_file_id.stream_specifier.channel_id | -1][?][:output_file_id.stream_specifier]

# 從給定的輸入映射一個(gè)音頻通道到輸出。如果為給定output_file_id.stream_specifier,那么音頻軌道從所有音軌上映射。使用-1替代input_file_id.stream_specifier.channel_id將會(huì)映射一個(gè)靜音通道。
# 以?結(jié)尾將允許map_channel成為可選的:如果map_channel沒有匹配到通道,那么map_channel將會(huì)被忽略,而不是拋出一個(gè)錯(cuò)誤,

# 例子1,假設(shè)輸入文件是一個(gè)立體聲音頻文件,你可以使用如下指令交換兩個(gè)音頻通道:
ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT
# 如果你想使第一個(gè)通道靜音,保留第二個(gè)通道,那么你可以(上面提到的使用-1提到-map_channel的值可以使其靜音):
ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT

# -map_channel選項(xiàng)的順序決定了輸出流中的音頻通道順序。輸出的通道布局會(huì)從映射到的通道數(shù)中猜測(如果只有一個(gè)-map_channel選項(xiàng)則判定為單聲道,兩個(gè)則為立體聲等)。

# 你也可以提取每一個(gè)輸入通道到指定的輸出中;以下指令從輸入的音頻流(文件0,流0)中提取了兩個(gè)通道到輸出的各自通道中(分別是OUTPUT_CH0和OUTPUT_CH1):
ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1

# 例子1,以下例子分離了立體聲輸入的通道為兩個(gè)分別的流,并將這兩個(gè)分離的流放到同一個(gè)輸出文件中:
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

# 注意:當(dāng)前每一個(gè)輸出流只能包含單一輸入流中的通道;你不能使用-map_channel選項(xiàng)來挑選不同流中的多個(gè)輸入音頻通道,并且將它們合并到一個(gè)輸出流中。因此,目前也就不可能從兩個(gè)不同的單聲道流轉(zhuǎn)換為一個(gè)立體聲流。然而,將一個(gè)立體聲流分離成兩個(gè)單聲道流是可能的。

#如果需要上述功能,可以使用amerge過濾器來實(shí)現(xiàn)。比如,如果你要將2個(gè)單聲道音頻流合并到一個(gè)立體聲道的音頻流中(并且保留視頻流),你可以使用以下指令:
ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

# 為了從第一個(gè)輸入映射前兩個(gè)音頻通道,使用?后綴,如果第一個(gè)輸入是單聲道,那么忽略音頻通道映射:
ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT

-map_metadata[:metadata_spec_out] infile[:metadata_spec_in](輸出、元數(shù)據(jù))

# 根據(jù)infile設(shè)置下一個(gè)輸出文件的元數(shù)據(jù)信息??蛇x的metadata_spec_in/out參數(shù)指定了哪一個(gè)元數(shù)據(jù)需要被復(fù)制。元數(shù)據(jù)的說明符可以具備如下的形式:
g
    # 全局元數(shù)據(jù),即應(yīng)用到整個(gè)文件的元數(shù)據(jù)信息。
    
s[:stream_spec]
    # 單個(gè)流的元數(shù)據(jù)。stream_spec是一個(gè)流說明符。在一個(gè)輸入流元數(shù)據(jù)說明符中,第一個(gè)匹配到的流會(huì)被復(fù)制。在輸出元數(shù)據(jù)說明符中,將復(fù)制所有匹配的流。
    
c:chapter_index
    # 單個(gè)章節(jié)的元數(shù)據(jù)。chapter_index是一個(gè)從0開始的索引。
    
p:program_index
    # 單個(gè)節(jié)目的元數(shù)據(jù)。同樣的,program_index也是一個(gè)從0起始的索引。
    
# 如果元數(shù)據(jù)說明符被省略了,默認(rèn)的說明符為g,即全局。
# 默認(rèn)情況下,全局的元數(shù)據(jù)是從第一個(gè)輸入文件中復(fù)制的,每個(gè)流和每個(gè)章節(jié)的元數(shù)據(jù)是隨著流/章節(jié)來復(fù)制的。這些默認(rèn)映射通過創(chuàng)建相應(yīng)類型的映射來禁用。使用負(fù)的文件索引值可以創(chuàng)建一個(gè)假的映射,這樣會(huì)禁用自動(dòng)映射。
# 例子,從輸入文件的第一個(gè)流中復(fù)制元數(shù)據(jù)到輸出文件的全局元數(shù)據(jù):
ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3

# 例子2,反過來,即從全局元數(shù)據(jù)復(fù)制到所有音頻流:
ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

-map_chapters input_file_index(輸出)

# 從輸入文件以input_file_index索引為準(zhǔn)復(fù)制章節(jié)到下一個(gè)輸出文件。如果沒有指定章節(jié)映射,那么從第一個(gè)輸入文件中至少復(fù)制一個(gè)章節(jié)。使用負(fù)的文件索引來禁用章節(jié)復(fù)制。

-benchmark(全局)

# 在編碼結(jié)束后顯示基準(zhǔn)信息。顯示CPU使用時(shí)間、最大內(nèi)存消耗。并不是所有的系統(tǒng)都支持最大內(nèi)存消耗,如果不支持則顯示0。

-benchmark_all(全局)

# 在編碼期間顯示基準(zhǔn)信息。顯示用于音頻/視頻的編解碼所消耗的CPU使用時(shí)間。

-timelimit duration(全局)

# ffmpeg運(yùn)行了指定的duration時(shí)間后退出。

-dump(全局)

# 轉(zhuǎn)儲(chǔ)每個(gè)輸入數(shù)據(jù)包到標(biāo)準(zhǔn)錯(cuò)誤。

-hex(全局)

# 當(dāng)轉(zhuǎn)存數(shù)據(jù)包時(shí),也轉(zhuǎn)存有效載荷。

-re(輸入)

# 以原始幀速率讀取輸入。主要用于模擬抓取設(shè)備,或者現(xiàn)場直播的輸入流。請(qǐng)注意這是模擬,真實(shí)環(huán)境中捕獲設(shè)備或者直播流不應(yīng)該使用這個(gè)選項(xiàng)(它會(huì)導(dǎo)致丟失數(shù)據(jù)包)。默認(rèn)地,ffmpeg嘗試盡快地讀取輸入。該選項(xiàng)會(huì)降低輸入的讀取速率到原始幀數(shù)率速度。這對(duì)于即時(shí)輸入很有用(比如直播)。

-loop_input

# 循環(huán)輸入流。目前只適用于圖像流。該選項(xiàng)用于ffserver自動(dòng)測試。該選項(xiàng)已經(jīng)廢棄,請(qǐng)使用-loop 1。

-loop_output number_of_times

# 根據(jù)number_of_times規(guī)格反復(fù)循環(huán)輸出。該選項(xiàng)過時(shí),請(qǐng)使用-loop。

-vsync parameter

# 視頻同步方式。為了兼容問題,老版本可以使用數(shù)字指定。新版本必須指定為字符串。
0,passthrougth
    # 從解復(fù)用器到復(fù)用器的每一幀,連同其時(shí)間戳一起傳送。
    
1,cfr
    # 復(fù)制并且丟棄幀,以達(dá)到所要求的恒定幀速率。
    
2,vfr
    # 連同時(shí)間戳一起傳送幀或者移除。以防止存在相同時(shí)間戳的幀。
    
drop
    # 傳遞,移除所有時(shí)間戳。使得基于幀速率的復(fù)用器產(chǎn)生新的時(shí)間戳。
    
-1,auto
    # 根據(jù)復(fù)用器的功能從1和2之間選擇。
    
# 注意,過后,時(shí)間戳可能進(jìn)一步被復(fù)用器修改。

-frame_drop_threshold parameter

# 丟棄幀的閾值,其指定了丟棄視頻幀之前可以保留多少視頻幀,在幀速率單位中,1.0指的是1幀。默認(rèn)是-1.1

-copyts

# 不處理輸入的時(shí)間戳,但是保留其值,而不是清除它們。不要?jiǎng)h除起始時(shí)間的偏移值。

-start_at_zero

# 當(dāng)和-copyts一起使用時(shí),轉(zhuǎn)移時(shí)間戳,使其從0開始。
# 如,-ss 50 將會(huì)使輸出時(shí)間戳從第50秒開始,而不管輸入文件的起始時(shí)間戳。

-copytb mode

# 當(dāng)進(jìn)行流復(fù)制的時(shí)候,指定如何設(shè)置編碼時(shí)基。mode是一個(gè)數(shù)字類型的值,它可以是以下數(shù)字中的一種:
1
    # 使用解復(fù)用器時(shí)基。
    # 從相應(yīng)的輸入解復(fù)用器中復(fù)制時(shí)基到輸出編碼器。

0
    # 使用解碼器時(shí)基。
    # 從相應(yīng)的輸入解碼器復(fù)制時(shí)基到輸出編碼器。
    
-1
    # 嘗試自動(dòng)地選擇,以產(chǎn)生一個(gè)智能的輸出。

# 默認(rèn)值是-1。

-enc_time_base[:stream_specifier] timebase (輸出、流)

# 設(shè)置編碼器時(shí)基。timebase是一個(gè)浮點(diǎn)數(shù),可以是以下值:
0
    # 根據(jù)媒體類型分配一個(gè)默認(rèn)值。
    # 對(duì)于視頻而言,使用1/幀速率,對(duì)于音頻而言,使用1/采樣率。
    
-1
    # 如果可能,使用輸入流時(shí)基。
    # 如果輸入流不可用,那么默認(rèn)的時(shí)基將會(huì)啟用。
    
>0
    # 使用提供的數(shù)字作為時(shí)基。
    # 這個(gè)字段可以是兩個(gè)數(shù)字的比值(比如1/24),或者是一個(gè)浮點(diǎn)數(shù)。
    
# 默認(rèn)情況下是0。

-shortest(輸出)

# 當(dāng)最短輸出流結(jié)束時(shí),完成編碼。

-dts_delta_threshold

# 時(shí)間戳中斷增量閾值。

-muxdelay seconds (輸入)

# 設(shè)置最大解復(fù)用器解碼延遲。

-muxpreload seconds (輸入)

# 設(shè)置解復(fù)用器解碼器初始延遲。

-streamid output-stream-index:new-value (輸出)

# 分配一個(gè)新的流id給輸出流。
# 例子:
ffmpeg -i input -streamid 0:33 -streamid 1:36 output.ts

-bsf[:stream_specifier] bitstream_filters (輸出、流)

# 為匹配的流設(shè)置比特流過濾器。
# 例子:
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264

-tag[:stream_specifier] codec_tag(輸入/輸出、流)

# 強(qiáng)制tag/fourcc匹配流。

-timecode hh:mm:ssSEPff

# 為寫入指定時(shí)間代碼。

-filter_complex filtergraph (全局)

# 定義一個(gè)負(fù)責(zé)過濾器,即:一個(gè)具有任意數(shù)量的輸入和(或者)輸出。
# 對(duì)于簡單圖來說,它們是具有相同類型的一個(gè)輸入和一個(gè)輸出。

-filter_complex_threads nb_threads (全局)

# 定義使用多少個(gè)線程來處理filter_complex圖。默認(rèn)是可用cpu數(shù)。

-lavfi filtergraph (全局)

# 定義復(fù)雜過濾圖。

-filter_complex_script filename (全局)

# 該選項(xiàng)和-filter_complex相似,不同的是,它的參數(shù)是一個(gè)文件名。

-accurate_seek (輸入)

# 該選項(xiàng)使用-ss選項(xiàng)啟用或者禁用在輸入文件中的精確查找。默認(rèn)是啟用的。使用-noaccurate_seek來禁用。

-seek_timestamp (輸入)

# 該選項(xiàng)使用-ss選項(xiàng)禁用或者啟用在輸入文件中通過時(shí)間戳來查找的功能。默認(rèn)禁用。

-thread_queue_size size (輸入)

# 當(dāng)從設(shè)備或者文件讀取時(shí),該選項(xiàng)設(shè)置最大隊(duì)列數(shù)。

-override_ffserver (全局)

# 覆蓋ffserver的輸入規(guī)范。使用該選項(xiàng)可以映射任意輸入流到ffserver中,從ffmpeg中控制許多編碼的方面。

-sdp_file file (全局)

# 打印一個(gè)輸出流的sdp信息到file中。

-discard(輸入)

# 用于在解復(fù)用器處丟棄指定的流或者幀。不是所有解復(fù)用器都支持該選項(xiàng)??捎弥等缦拢?none
    # 丟棄不存在的幀。

default
    # 默認(rèn)值,即上述的none。
    
noref
    # 丟棄所有非引用幀。
    
nokey
    # 丟棄除關(guān)鍵幀外的所有幀。
    
all
    # 丟棄所有幀。

-abort_on flags(全局)

# 在多條件下停止并且退出。flags值如下:
empty_output
    # 無數(shù)據(jù)包傳遞給復(fù)用器,輸出是空。

-xerror(全局)

# 當(dāng)錯(cuò)誤時(shí),停止并退出。

-max_muxing_queue_size packets (輸出、流)

# 當(dāng)進(jìn)行音頻或者視頻轉(zhuǎn)碼的時(shí)候,ffmpeg不會(huì)開始寫入數(shù)據(jù)到輸出,直到每個(gè)這樣的流有一個(gè)數(shù)據(jù)包。當(dāng)?shù)却浒l(fā)生時(shí),  流的數(shù)據(jù)包將會(huì)被緩存。該選項(xiàng)設(shè)置了匹配的流的緩存的大小。

4.12. 預(yù)設(shè)文件

一個(gè)預(yù)設(shè)文件包含了option=value鍵值對(duì)的一個(gè)序列,每行一個(gè),#符號(hào)開頭被作為注釋處理。預(yù)設(shè)文件有兩種:ffpreset和avpreset文件。

4.12.1. ffpreset文件

ffpreset文件使用vpre、apre、spre、fpre來指定。fpre選項(xiàng)將預(yù)設(shè)文件名來替代預(yù)設(shè)名作為輸入,并且可以被所有編解碼使用。對(duì)于vpre、apre、spre選項(xiàng)來說,這些在預(yù)設(shè)文件中指定的選項(xiàng)被應(yīng)用于當(dāng)前選擇的相同類型的編解碼器作為預(yù)設(shè)選項(xiàng)。

傳遞給vpre、apre、spre預(yù)設(shè)選項(xiàng)的參數(shù)根據(jù)以下規(guī)則識(shí)別要使用的預(yù)設(shè)文件:

首先,ffmpeg從$FFMPEG_DATADIR(環(huán)境變量)目錄和$HOME/.ffmpeg目錄下查找的一個(gè)名為arg.ffpreset的文件。

4.12.2. avpreset files

使用pre選項(xiàng)指定avpreset文件。這和ffpreset文件工作原理很相似,除了僅允許編碼器特定的選項(xiàng)。因此,不能使用指定了編碼器的鍵值對(duì)選項(xiàng)。

當(dāng)指定pre選項(xiàng)時(shí),ffmpeg將在目錄$AVCONV_DATADIR(如果設(shè)置了)和$HOME/.avconv以及在配置時(shí)定義的datadir(通常為PREFIX/share/ffmpeg)中查找后綴為.avpreset的文件,按照上述順序。

首先,ffmpeg會(huì)在上述提到的目錄中查找名為codec_name.avpreset的文件,其中,codec_name是要應(yīng)用預(yù)設(shè)文件選項(xiàng)的編碼器的名稱。比如,如果使用-vcode libvpx選擇視頻,使用-pre 1080p。


  1. 容器格式:諸如avi,mp4等格式,專業(yè)上稱之為容器格式。在后面章節(jié)會(huì)講解視頻的組成原理和容器格式。 ?

  2. 比特率:單位,bit/s,指每秒傳送的比特(bit)數(shù)。比特率越高,傳輸?shù)臄?shù)據(jù)越大,速度越快。在音視頻中的比特率是指模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)后單位時(shí)間內(nèi)傳輸?shù)亩M(jìn)制數(shù)據(jù)量。通常用該指標(biāo)衡量聲音和視頻文件的質(zhì)量。 ?

  3. 幀數(shù)率:單位,fps(frame per second - 每秒幀數(shù)),是指每秒刷新的圖片數(shù)量。 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,312評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,993評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,410評(píng)論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,778評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,955評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,521評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,266評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,468評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,696評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評(píng)論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,193評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,431評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,821評(píng)論 18 139
  • 這是一封在隔離區(qū)里的母親寫給遠(yuǎn)在他鄉(xiāng)兒子的信。就打出來看看吧,在戰(zhàn)爭年代母親在要被處死的前一段時(shí)間對(duì)兒子的思念。 ...
    寶寶腳抽筋閱讀 297評(píng)論 0 0
  • 交作業(yè)了,落了好多。抓緊補(bǔ)上一
    myselfliya閱讀 192評(píng)論 2 3