寫在前面
如果您對音視頻技術(shù)感興趣,可以訂閱我的專題:音視頻專輯
也可以關(guān)注我的簡書賬戶: 張芳濤背稼,我后期會發(fā)布更多的音視頻以及圖像處理方面的文章。
正文
ffmpeg工具的最常見用法是從一種音頻或視頻格式轉(zhuǎn)換為另一種相關(guān)的格式肯夏。 格式參數(shù)在輸出文件之前由-f選項設(shè)置闺兢,或者在輸入文件之前也有原始輸入,具體的可用格式信息在顯示幫助和功能一章中列出來了帽揪。
多媒體格式介紹
文件格式
媒體格式是能夠存儲音頻或視頻數(shù)據(jù)的特殊文件類型硝清。 其中一些能夠存儲更多類型的數(shù)據(jù)與多個流,這些被稱為容器转晰。 第二章列出了可用的媒體格式芦拿,并可以使用命令ffmpeg -formats
進(jìn)行顯示。
視頻文件格式通巢樾希可以同時包含視頻和音頻流蔗崎,但是有一些特殊的格式,只能包含音頻扰藕,詳細(xì)信息在數(shù)字音頻章節(jié)中有描述缓苛。
多媒體容器
媒體容器是特定類型的包裝文件,用于存儲多媒體流和相關(guān)元數(shù)據(jù)的特殊文件格式邓深。 由于音頻和視頻可以通過各種方法(算法)進(jìn)行編碼和解碼樱调,容器提供了將各種媒體流存儲在一個文件中的簡單方法祖娘。 一些容器只能存儲音頻(AIFF,WAV澳化,XMF等)欠啤,一些只能存儲圖片(TIFF ...)嘴瓤,但大多數(shù)容器存儲音頻场梆,視頻摹芙,字幕日月,元數(shù)據(jù)等。所有列出的視頻容器也支持一些 字幕格式染乌,特別是SubRip和Advanced SubStation Alpha山孔。
如果只更改容器并保留編解碼器,我們可以使用
-c copy
或-c:a copy
或-c:v copy
選項:
ffmpeg -i input.avi -q 1 -c copy output.mov
轉(zhuǎn)碼和轉(zhuǎn)換
將輸入文件使用ffmpeg處理成輸出文件稱為轉(zhuǎn)換荷憋,它可以包括格式之間的轉(zhuǎn)換或者僅修改某些數(shù)據(jù),輸出媒體格式保持不變的轉(zhuǎn)碼褐望。 數(shù)據(jù)包可以被編碼壓縮或解壓縮勒庄,壓縮包括使用特定的編解碼器。 轉(zhuǎn)碼過程可以分為幾個部分:
*解復(fù)用(demultiplexing) - 基于文件擴(kuò)展名(.avi瘫里,mpg等)被選中來自libavformat庫的最好的解復(fù)用(解復(fù)用器)实蔽,從輸入文件生成編碼數(shù)據(jù)包
- 解碼-數(shù)據(jù)包是由一個適當(dāng)?shù)慕獯a器解碼,產(chǎn)生未壓縮的幀;如果使用
-c copy
(或-codec copy
)選項谨读,則不會發(fā)生解碼(也不進(jìn)行過濾)局装。 - 可選的過濾器 - 解碼的幀可以通過指定的過濾器進(jìn)行修改
- 編碼 - 未壓縮的幀由選定的編碼器編碼為數(shù)據(jù)包
-
復(fù)用(multiplexing) - 將數(shù)據(jù)包復(fù)用(multiplexed)為選定的媒體格式。
ffmpeg中轉(zhuǎn)換的可用選項被劃分為通用的和私有的《咭觯可以為任何容器宣增、編解碼器或設(shè)備設(shè)置通用選項,私有選項針對所選的編解碼器矛缨、容器或設(shè)備爹脾。
編解碼器介紹
codec的名字來源于單詞編碼解碼器(或編碼解碼器),它表示一個設(shè)備或軟件工具箕昭,用于編碼和解碼一個被壓縮的視頻或音頻流灵妨。FFmpeg編解碼器定義是一種媒體比特流格式。下一個命令顯示可用的編解碼器:
ffmpeg -codecs
...顯示的都是解碼器和編碼器ffmpeg -decoders
...只顯示解碼器-
ffmpeg -encoders
...只顯示編碼器
命令行上的編解碼器是由-c
或-codec
選項指定的落竹,語法是:-codec[:stream_specifier] codec_name
可以為輸入和輸出文件指定編解碼器泌霍,如果輸出包含多個流,則每個流可以使用不同的編解碼器筋量。 如果我們在沒有編解碼器的情況下指定輸出格式烹吵,則ffmpeg會選擇默認(rèn)編解碼器,常見媒體格式的默認(rèn)編解碼器列表如下:
格式 | 編解碼器 | 其他數(shù)據(jù) |
---|---|---|
.avi | mpeg4 | mpeg4 (Simple profile), yuv420p; audio: mp3 |
.flv | flv1 | yuv420p; audio: mp3 |
.mkv | h264 | h264 (High), yuvj420p; audio: vorbis codec, fltp sample format |
.mov | h264 | h264 (High), yuvj420p; audio: aac (mp4a) |
.mp4 | h264 | h264 (High), yuvj420p; audio: aac (mp4a) |
.mpg | mpeg1video | yuv420p; audio: mp2 |
.ogg | theora | yuv422p, bitrate very low; audio excluded during conversion |
.ts | mpeg2video | yuv422p; audio: mp2 |
.webm | vp8 | yuv420p; audio: vorbis codec, fltp sample format |
格式 | 編解碼器 | 額外數(shù)據(jù) |
---|---|---|
.aac | aac | libvo_aacenc, bitrate 128 kb/s |
.flac | flac | FLAC (Free Lossless Audio Codec), bitrate 128 kb/s |
.m4a | aac | mp4a, bitrate 128 kb/s |
.mp2 | mp2 | MPEG Audio Layer 2, bitrate 128 kb/s |
.mp3 | mp3 | libmp3lame, bitrate 128 kb/s |
.wav | pcm_s16le | PCM (Pulse Code Modulation), uncompressed |
.wma | wmav2 | Windows Media Audio |
覆蓋相同的命名輸出文件
如果在ffmpeg命令中具有指定名稱的文件已經(jīng)存在桨武,控制臺將請求“y”(yes)或“n”(no)來覆蓋舊文件肋拔。為了避免這個問題,可以使用-n選項來取消處理呀酸,-y選項用于設(shè)置覆蓋而不需要請求凉蜂。例如,在默認(rèn)情況下,我們可以使用以下命令來覆蓋舊的輸出文件:
ffmpeg -y -i input.avi output.mp4
通用選項轉(zhuǎn)換
通用選項可設(shè)置為任何編解碼器窿吩、容器或設(shè)備茎杂。在表中描述了與編碼器(codec)規(guī)范相關(guān)的轉(zhuǎn)換中包含的最常見的通用選項,目標(biāo)列包含5個字母代碼纫雁,限制了特定選項的使用煌往。某些字母的存在意味著該選項適用于編碼(E)、解碼(D)轧邪、視頻(V)刽脖、音頻(A)或字幕(S)。
選項 | 類型 | 標(biāo)簽 | 描述 |
---|---|---|---|
-flags | flags | EDVAS | 數(shù)值:(ffmpeg幫助的詳細(xì)信息):mv4忌愚、qpel曲管、loop、gmc硕糊、mv0院水、gray、psnr简十、naq檬某、ildct、low_delay勺远、global_header橙喘、bitreal、aic胶逢、cbp厅瞎、qprd、ilme初坠、cgop |
-me_method | int | E..V.. | 數(shù)值:(請參閱ffmpeg幫助詳細(xì)信息):0和簸、full、epzs碟刺、esa锁保、tesa、dia半沽、log爽柒、phods、x1者填、hex浩村、umh、iter |
-g | int | E..V.. | 設(shè)置圖片組大小 |
-qcomp | float | E..V.. | 視頻量化壓縮(VBR)占哟。ratecontrol方程的常數(shù)心墅。默認(rèn)rc_eq: 0-1.0的推薦范圍 |
-qblur | float | E..V.. | 視頻量化器尺度模糊(VBR) |
-qmin | int | E..V.. | 最小視頻量化器規(guī)模(VBR) |
-qmax | int | E..V.. | 最大視頻數(shù)字轉(zhuǎn)換器規(guī)模(VBR) |
-qdiff | int | E..V.. | 量化器的最大差異(VBR) |
-bf | int | E..V.. | 使用“幀”B幀 |
-b_qfactor | float | E..V.. | p和b之間的qp因子 |
-rc_strategy | int | E..V.. | ratecontrol方法 |
-b_strategy | int | E..V.. | 在I/P/ b幀之間選擇策略 |
-ps | int | E..V.. | rtp負(fù)載大小以字節(jié)為單位 |
-lelim | int | E..V.. | 亮度的單系數(shù)消除閾值(負(fù)值也考慮直流系數(shù)) |
-celim | int | E..V.. | 色度的單系數(shù)消除閾值(負(fù)值也考慮直流系數(shù)) |
-strict | int | ED.VA. | 如何嚴(yán)格遵循標(biāo)準(zhǔn)酿矢,值為(請參閱ffmpeg幫助細(xì)節(jié)):very, strict, normal, unofficial, experimental |
-b_qoffset | float | E..V.. | qp偏移在P和B幀之間 |
-err_detect | flags | .D.VA. | 設(shè)置錯誤檢測標(biāo)志,值為(請參閱ffmpeg幫助細(xì)節(jié)):crccheck, bitstream, buffer, explode, careful, compliant, aggressive |
-mpeg_quant | int | E..V.. | 使用MPEG量化器代替H.263 |
-qsquish | float | E..V.. | 如何在qmin - qmax (0=clip, 1=使用可微函數(shù))之間保持量化器 |
-rc_qmod_amp | float | E..V.. | 實驗量化器調(diào)制 |
-rc_qmod_freq | int | E..V.. | 實驗量化器調(diào)制 |
-rc_eq | string | E..V.. | 設(shè)置速度控制方程怎燥。在計算表達(dá)式時瘫筐,除了在數(shù)學(xué)函數(shù)章節(jié)中定義的標(biāo)準(zhǔn)函數(shù)外,還有以下函數(shù):bits2qp(bits)铐姚, qp2bits(qp)策肝。也可以使用以下常數(shù):iTex pTex texmv fCode iCount mcVar iount isB avgQP qComp avgpiex avgPPTex avgTex |
-i_qfactor | float | E..V.. | P和I之間的qp因子 |
-i_qoffset | float | E..V.. | qp偏移在P和I幀之間 |
-rc_init_cplx | float | E..V.. | 1-pass編碼的初始復(fù)雜度 |
-dct | int | E..V.. | DCT算法,值為(請參閱ffmpeg幫助細(xì)節(jié)):auto, fastint, int, mmx, altivec, faan |
-lumi_mask | float | E..V.. | 壓縮明亮的區(qū)域比中等的區(qū)域強 |
-tcplx_mask | float | E..V.. | 時間復(fù)雜性掩蓋 |
-scplx_mask | float | E..V.. | 空間復(fù)雜性掩蓋 |
-p_mask | float | E..V.. | inter屏蔽 |
-dark_mask | float | E..V.. | 壓縮暗區(qū)比中型區(qū)域強 |
-idct | int | ED.V.. | 選擇IDCT實現(xiàn)谦屑,值為(請參閱ffmpeg幫助細(xì)節(jié)):auto, int, simple, simplemmx, libmpeg2mmx, mmi, arm, altivec, sh4, simplearm, simplearmv5te, simplearmv6, simpleneon, simplealpha, h264, vp3, ipp, xvidmmx, faani |
-ec | flags | .D.V.. | 設(shè)置錯誤隱藏策略驳糯,值:guess_mvs(迭代運動矢量(MV)搜索(慢)),deblock (.D.V氢橙。使用強大的deblock過濾器,對損壞的MBs) |
-pred | int | E..V.. | 預(yù)測方法恬偷,值是(更多的見ffmpeg幫助):left, plane, median |
-vismv | int | .D.V.. | 可視化運動矢量(MVs)悍手,值是(更多的見ffmpeg幫助):pf, bf, bb |
-cmp | int | E..V.. | 完整的pel我比較函數(shù),值(更多的見ffmpeg幫助章節(jié)):sad, sse, satd, dct, psnr, bit, rd, 0, vsad, vsse, nsse, w53, w97, dctmax, chroma |
-subcmp | int | E..V.. | 比較函數(shù)袍患,值和-cmp選項(更多的見ffmpeg幫助章節(jié)) |
-mbcmp | int | E..V.. | macroblock比較函數(shù)坦康,值與-cmp選項(更多的是ffmpeg幫助里面) |
-ildctcmp | int | E..V.. | 交錯dct比較函數(shù),值與-cmp選項(更多在ffmpeg幫助章節(jié)里面) |
-dia_size | int | E..V.. | 運動估計的diamond 類型和尺寸 |
-last_pred | int | E..V.. | 從上一幀的運動預(yù)測器數(shù)量 |
-preme | int | E..V.. | 前運動估計 |
-precmp | int | E..V.. | 前運動估計比較函數(shù)诡延,值與-cmp選項(更多的見ffmpeg幫助) |
-pre_dia_size | int | E..V.. | 運動預(yù)估的diamond類型和尺寸 |
-subq | int | E..V.. | 子波運動估計質(zhì)量 |
-me_range | int | E..V.. | 極限運動矢量范圍(DivX播放器的1023) |
-ibias | int | E..V.. | 內(nèi)部定量偏差 |
-pbias | int | E..V.. | inter定量偏差 |
-coder | int | E..V.. | 值:vlc(可變長度/huffman編碼器)滞欠,ac(算術(shù)),raw(無編碼)肆良,rle(運行長度)筛璧,deflate (deflate-based) |
-context | int | E..V.. | 上下文模型 |
-mbd | int | E..V.. | macroblock決策算法(高質(zhì)量模式),值為(請參閱ffmpeg幫助細(xì)節(jié)):simple, bits, rd |
-sc_threshold | int | E..V.. | 場景變化閾值 |
-lmin | int | E..V.. | 最小拉格朗日因子(VBR) |
-lmax | int | E..V.. | 最大拉格朗日因子(VBR) |
-flags2 | flags | ED.VA | 值(更多的見ffmpeg幫助):快速惹恃、sgop夭谤、noout、local_header巫糙、塊朗儒、showall、skiprd |
-threads | int | ED.V.. | 自動數(shù)值(檢測大量線程) |
-dc | int | E..V.. | intra_dc_precision(不知道怎么翻譯) |
-nssew | int | E..V.. | nsse weight |
-skip_top | int | .D.V.. | 在頂部跳過的macroblock行數(shù) |
-skip_bottom | int | .D.V.. | 在底部跳過的macroblock行數(shù) |
-profile | int | E..VA. | 值(更多的鍵ffmpeg幫助):未知的参淹,aac_main, aac_low, aac_ssr, aac_ltp, aac_he, aac_he_v2, aac_ld, aac_ld, dts, dts_es, dts 96 24, dts_hd_hra, dts_hd_ma |
-level | int | E..VA. | 數(shù)值:未知的 |
-lowres | int | .D.VA. | 解碼1= 1/2,2=1/4,3=1/8 |
-skip_factor | int | E..V.. | 幀跳躍因素 |
-skip_exp | int | E..V.. | 幀跳躍指數(shù) |
-skipcmp | int | E..V.. | 幀跳過比較函數(shù)醉锄,與-cmp選項相同的值(更多的信息見幫助) |
-border_mask | float | E..V.. | 增加接近邊界的宏塊的量化器 |
-mblmin | int | E..V.. | min macroblock拉格朗日因子(VBR) |
-mblmax | int | E..V.. | max macroblock拉格朗日因子(VBR) |
-mepc | int | E..V.. | 運動估計比特率懲罰補償(1.0 = 256) |
-skip_loop_filter | int | .D.V.. | 值(更多的是ffmpeg幫助):none、default浙值、noref恳不、bidir、nokey亥鸠、all |
-skip_idct | int | .D.V.. | 和-skip_loop里面參數(shù)的值是一樣的(更多內(nèi)容見ffmpeg幫助) |
-skip_frame | int | .D.V.. | 和-skip_loop里面參數(shù)的值是一樣的(更多內(nèi)容見ffmpeg幫助) |
-bidir_refine | int | E..V.. | 細(xì)化雙向宏塊中使用的兩個運動矢量 |
-brd_scale | int | E..V.. | 用于動態(tài)b幀決策的下尺度框架 |
-keyint_min | int | E..V.. | 最小間隔IDR-frames |
-refs | int | E..V.. | 考慮運動補償?shù)膮⒖枷?/td> |
-chromaoffset | int | E..V.. | 色度qp從luma偏移 |
-trellis | int | E..VA. | 率失真優(yōu)化量化 |
-sc_factor | int | E..V.. | 每一幀乘以qscale妆够,并添加到scene_change_score |
-b_sensitivity | int | E..V.. | 調(diào)整b_frame_strategy 1的靈敏度 |
-colorspace | int | ED.V.. | 名字的顏色空間 |
-slices | int | E..V.. | 片數(shù)识啦,用于并行編碼 |
-thread_type | flags | ED.V.. | 選擇多線程類型,值:slice, frame |
-rc_init_occupancy | int | E..V.. | 在解碼開始之前神妹,要加載到rc緩沖區(qū)的位數(shù) |
-me_threshold | int | E..V.. | 運動估計閾值 |
-mb_threshold | int | E..V.. | macroblock閾值 |
-skip_threshold | int | E..V.. | 幀跳過閾值 |
-timecode_frame_start | int64 | E..V.. | GOP timecode框架啟動號碼颓哮,在非下降幀格式 |
-request_channels | int | .D..A. | 設(shè)置所需的音頻通道數(shù) |
-channel_layout | int64 | ED..A. | 可用值:ffmpeg布局 |
-audio_service_type | int | E...A. | 音頻服務(wù)類型,值(更多的見ffmpeg幫助):ma, ef, vi, hi, di, co, em, vo, ka |
-request_sample_fmt | s_fmt | .D..A. | 示例格式音頻解碼器應(yīng)使用(列表:ffmpeg -sample_fmts) |
有關(guān)如何使用某些選項的示例鸵荠,請參閱“預(yù)設(shè)編解碼器”一章冕茅。 為了保持輸出質(zhì)量相同,我們使用-q
或-qscale [:stream_specifier]
選項來設(shè)置固定的質(zhì)量范圍蛹找,通常從1到31姨伤,其中值1表示最高質(zhì)量(某些編解碼器使用其他比例)。
私有的的選擇轉(zhuǎn)選項
雖然可以為任何編解碼器庸疾,容器或設(shè)備設(shè)置通用選項乍楚,但私有選項是可以僅為選定的編解碼器,容器或設(shè)備指定的附加選項届慈。
MPEG-1視頻編碼器
除了通用選項之外徒溪,mpeg1video
編碼器可以使用表中描述的私有選項:
選項 | 類型 | 描述 |
---|---|---|
-gop_timecode | string | MPEG GOP Timecode在hh:mm:ss[:;]ff格式 |
-intra_vlc | int | 使用MPEG-2 intra VLC表 |
-drop_frame_timecode | int | Timecode采用了drop - frame格式 |
-scan_offset | int | 預(yù)留空間用于SVCD掃描偏移用戶數(shù)據(jù) |
-mpv_flags | flags | 所有基于mpegvideo的編碼器通用的標(biāo)志,值是(更多的ffmpeg幫助):skip_rd, strict_gop, qp_rd, cbp_rd |
-luma_elim_threshold | int | 亮度的單系數(shù)消除閾值(負(fù)值也考慮直流系數(shù)) |
-chroma_elim_threshold | int | 色度的單系數(shù)消除閾值(負(fù)值也考慮直流系數(shù)) |
-quantizer_noise_shaping | int | 沒有描述 |
MPEG-2 視頻編碼器
mpeg2video編碼器可以使用mpeg1視頻編碼器的所有選項和2個附加選項:
選項 | 類型 | 描述 |
---|---|---|
-non_linear_quant | int | 使用非線性量化器 |
-alternate_scan | int | 啟用備用表掃描 |
MPEG-4 視頻編碼器
mpeg4編碼器包括前面2個表中描述的下一個選項:
- data_partioning
- alternate_scan
- mpv_flags
- luma_elim_threshold
- chroma_elim_threshold
- quantizer_noise_shaping
libvpx視頻編碼器
libvpx編碼器以WEBM格式為例金顿,包括下一個選項:
選項 | 類型 | 描述 |
---|---|---|
-cpu-used | int | 質(zhì)量/速度比修飾符 |
-auto-alt-ref | int | 啟用備用參考框架(僅2-pass) |
-lag-in-frames | int | 幀的數(shù)量臊泌,以展望備用參考幀的選擇 |
-arnr-maxframes | int | altref降噪最大幀數(shù) |
-arnr-strength | int | altref降噪濾波強度 |
-arnr-type | int | altref降噪濾波類型,值為:向后揍拆、正向渠概、中心 |
-deadline | int | 花在編碼上的時間,在微秒內(nèi)嫂拴,值是:最好的播揪,好的,實時的 |
-error-resilient | flags | 錯誤恢復(fù)配置:值(更多在ffmpeg幫助下):默認(rèn)值顷牌,分區(qū) |
-max-intra-rate | int | 最大i幀比特率(pct) 0=無限 |
-speed | int | 沒有描述 |
-quality | int | 價值是:最好的剪芍,好的,實時的 |
-vp8flags | flags | 值是(更多的ffmpeg幫助):error_窟蓝, altref |
-arnr_max_frames | int | altref降噪最大幀數(shù) |
-arnr_strength | int | altref降噪濾波強度 |
-arnr_type | int | altref降噪濾波器類型 |
-rc_lookahead | int | 幀的數(shù)量罪裹,以展望備用參考幀的選擇 |
-crf | int | 選擇質(zhì)量不變的質(zhì)量模式 |
AC-3音頻編碼器
ac3音頻編碼器可以使用表中描述的其他選項:
選項 | 類型 | 描述 |
---|---|---|
per_frame_metadata | integer | 允許改變元數(shù)據(jù)每幀 |
center_mixlev | float | 中心組合水平 |
surround_mixlev | float | 圍繞混合水平 |
mixing_level | integer | 混合水平 |
room_type | integer | 房間類型,值是:不指示运挫,大状共,小 |
copyright | integer | 版權(quán)位 |
dialnorm | integer | 對話水平(dB) |
dsur_mode | integer | 杜比環(huán)繞模式,值:不顯示谁帕,打開峡继,關(guān)閉 |
original | integer | 原始比特流 |
dmix_mode | integer | 首選立體聲調(diào)合模式,值:不顯示 |
ltrt_cmixlev | float | lt / rt中心混合水平 |
ltrt_surmixlev | float | lt / rt環(huán)繞混合水平 |
loro_cmixlev | float | lo / ro中心混合水平 |
loro_surmixlev | float | lo / ro環(huán)繞混合水平 |
dsurex_mode | integer | Dolby環(huán)繞EX模式匈挖,值:不顯示碾牌,on, off |
dheadphone_mode | integer | 杜比耳機模式康愤,值:不顯示,打開舶吗,關(guān)閉 |
ad_conv_type | integer | A/D轉(zhuǎn)換器類型征冷,值:標(biāo)準(zhǔn)(默認(rèn)),hdcd |
stereo_rematrixing | integer | 立體重映射 |
channel_coupling | integer | 通道耦合 值:自動 |
cpl_start_band | integer | 耦合開始band 值:自動 |
簡化的VCD誓琼、SVCD检激、DVD、DV腹侣、DV50編碼
一個特殊的目標(biāo)選項只允許使用一個選項叔收,而不是特定媒體類型所需要的大量選項(VCD=視頻CD、SVCD=超級視頻CD傲隶、DV=數(shù)字視頻等)饺律,可用的值為:
vcd, pal-vcd, ntsc-vcd, film-vcd
svcd, pal-svcd, ntsc-svcd, film-svcd
dvd, pal-dvd, ntsc-dvd, film-dvd
dv, pal-dv, ntsc-dv, film-dv
-
dv50, pal-dv50, ntsc-dv50, film-dv50
所有需要的參數(shù),如幀率跺株、縱橫比蓝晒、比特率等都是根據(jù)特定媒體格式的規(guī)格設(shè)置的。例如帖鸦,為DVD的視頻編碼我們可以使用命令:ffmpeg -i input.avi -target dvd output.mpg