- 要什么要使用命令行呢?
ffmpeg提供的功能幾乎都能通過命令行使用,ffmpeg提供了豐富的選項可以對每一個環節進行配置。在寫代碼之前先用命令行參數驗證可行性
- 如何知道具體的選項還有哪些可選的配置呢?
通過ffmpeg -h full 2>/dev/null > ffmpeg.txt導出所有選項的詳細說明,可以在里面找到每個選項的詳細說明,也可以直接閱讀官方文檔 ffmpeg-all
想要知道ffmpeg的常規用法可以通過命令man ffmpeg或者閱讀官方文檔 ffmpeg
關於日期格式、時間格式、視頻大小縮寫、幀率縮寫、顏色、音頻通道含義等可以通過命令man ffmpeg-utils或者閱讀官方文檔 ffmpeg-utils
下載
$ brew install ffmpeg
$ sudo apt install ffmpeg
Bash自動補全
ffmpeg-bash-completion
Help
我使用的FFmpeg版本如下:
ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 12.0.5 (clang-1205.0.22.9)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
| 命令 |
說明 |
| ffmpeg -L |
顯示License |
| ffmpeg -version |
顯示當前版本 |
| ffmpeg help -buildconf |
顯示編譯此ffmpeg的configuration |
| ffmpeg help -formats |
顯示支持的文件格式,同時顯示muxers和demuxers |
| ffmpeg help -muxers |
顯示支持的muxers格式 |
| ffmpeg help -demuxers |
顯示支持的demuxers格式 |
| ffmpeg help -devices |
顯示支持的設備,包括音視頻設備 |
| ffmpeg help -codecs |
顯示支持的格式,同時顯示視頻、音頻、字幕、幀內編碼、有損壓縮和無損壓縮的解編碼支持情況 |
| ffmpeg help -decoders |
顯示支持的解碼器 |
| ffmpeg help -encoders |
顯示支持的編碼器 |
| ffmpeg help -bsfs |
顯示支持的二進制流過濾器,例如h264_metadata、h264_mp4toannexb、hevc_mp4toannexb等 |
| ffmpeg help -protocols |
顯示支持的可用的協議,區分Input和Output,例如file、http、hls、rtmp、rtp、pipe、tee等 |
| ffmpeg help -filters |
顯示支持的可用的過濾器 |
| ffmpeg help -pix_fmts |
顯示支持的可用的像素格式 |
| ffmpeg help -layouts |
顯示支持的聲道布局,例如mono、stereo、2.1、2.0、3.0、5.0、5.1等 |
| ffmpeg help -sample_fmts |
顯示支持的音頻采樣格式,例如u8、s16、s32、flt等 |
| ffmpeg help -colors |
顯示支持的顏色 |
| ffmpeg help -sources device |
列出輸入設備的源 |
| ffmpeg help -sinks device |
列出輸出設備的槽(節點) |
| ffmpeg help -hwaccels |
顯示可用的硬件加速方法 |
Usage
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
options 全局參數
infile options 輸入文件參數
infile 輸入文件
outfile options 輸出文件參數
outfile 輸出文件
全局選項
| 參數 |
說明 |
| -loglevel loglevel |
設置日志登記,具體用法可以通過man ffmpeg查看,例如ffmpeg -loglevel verbose -i 1080p.mp4,可選:quiet panic fatal error warning info verbose debug trace |
| -v loglevel |
設置日志登記,具體用法可以通過man ffmpeg查看,例如ffmpeg -v verbose -i 1080p.mp4,可選:quiet panic fatal error warning info verbose debug trace |
| -report |
生成一個報告,報告的名字是ffmpeg自動生成的,例如ffmpeg -report -i 1080p.mp4,想要自定義文件以及日志等級可以使用宏FFREPORT,例如FFREPORT=file=ffreport.log:level=32 ffmpeg -i 1080p.mp4 |
| -max_alloc bytes |
設置通過ffmpeg的malloc函數系列設置在堆上分配塊的最大大小限制。嵌入式設備可能會用到這個選項 |
| -y |
覆蓋輸出文件 |
| -n |
切勿覆蓋輸出文件 |
| -ignore_unknown |
忽略未知的流類型 |
| -filter_threads |
定義用於處理過濾器管道的線程數。每個管道將生成一個線程池,其中包含許多可用於並行處理的線程。默認是可用CPU的數量 |
| -filter_complex_threads |
定義用於處理filter_complex圖的線程數。類似於filter_threads但僅用於-filter_complex圖形。默認值為可用 CPU 的數量 |
| -stats |
編碼期間打印進度報告 |
| -max_error_rate maximum |
在所有輸入中設置解碼幀失敗的比例,當超過時ffmpeg將返回退出代碼69。超過此閾值不會終止處理。值的范圍是0到1之間的浮點數。默認值為2/3 |
| -bits_per_raw_sample number |
設置每個原始樣本的位數 |
| -vol volume |
改變音量 ,volume默認值是256,也就是它把音量分為256等分,例如要把音量放大為原來的兩倍(256*2):ffmpeg -vol 512 -y -i bugua.mp3 output.mp3 |
輸入輸出選項
Per-file main options
| 選項 |
說明 |
例子 |
| -f fmt |
force format |
設置輸入容器是mp4 ffmpeg -i bugua.mp3 -f mp4 output.m4a |
| -c codec |
codec name |
設置輸入編碼格式是ac3 ffmpeg -y -i bugua.mp3 -c ac3 output.m4a |
| -codec codec |
codec name |
設置輸入編碼格式是ac3 ffmpeg -y -i bugua.mp3 -codec ac3 output.m4a |
| -pre preset |
preset name |
- |
| -map_metadata outfile[,metadata]:infile[,metadata] |
set metadata information of outfile from infile |
- |
| -t duration |
record or transcode "duration" seconds of audio/video |
設置只錄制前50秒 ffmpeg -i bugua.mp3 -t 50 output.mp3 |
| -to time_stop |
record or transcode stop time |
設置只錄制前50秒 ffmpeg -i bugua.mp3 -t 50 output.mp3 |
| -fs limit_size |
set the limit file size in bytes |
設置輸出文件大小限制在0.1MB ffmpeg -y -i bugua.mp3 -fs 0.1MB output.mp3 |
| -ss time_off |
set the start time offset |
設置從第50秒開始錄制 fmpeg -ss 50 -y -i bugua.mp3 output.mp3 |
| -sseof time_off |
set the start time offset relative to EOF |
設置從倒數第50秒開始錄制 ffmpeg -sseof -50 -y -i bugua.mp3 output.mp3 |
| -seek_timestamp |
此選項使用-ss選項在輸入文件中啟用或禁用按時間戳搜索。默認情況下它是禁用的。如果啟用,則-ss選項的參數被視為實際時間戳,並且不會被文件的開始時間偏移。這僅適用於不從時間戳 0 開始的文件,例如傳輸流 |
- |
| -timestamp time |
在容器中設置錄制時間戳 |
|
| -metadata string=string |
設置修改容器這一層的metadata |
設置標題 ffmpeg -i in.avi -metadata title="my title" out.flv |
| -program title=string:st=number... |
添加或者修改program的Metadata |
設置program標題 ffmpeg -y -i 1080p.mp4 -program title="XXXXXX":st=1 -c copy output.mp4 |
| -target type |
指定目標文件類型 ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-") |
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg |
| -apad |
音頻填充(追加) |
在音頻文件的最后追加10秒靜音 ffmpeg -y -i bugua.mp3 -af "apad=pad_dur=10" output.mp3 |
| -frames number |
設置要輸出的幀數 |
只寫入200幀 ffmpeg -i 1080p.mp4 -frames 200 -c copy output.mp4 |
| -filter filter_graph |
設置簡單的filter(不對音視頻內容進行任何處理的filter) |
把視頻幀的PTS設置為原來的0.5倍 ffmpeg -y -i 1080p.mp4 -filter:v "setpts=0.5*PTS" output.mp4 |
| -filter_script filename |
read stream filtergraph description from a file |
- |
| -reinit_filter |
reinit filtergraph on input parameter changes |
- |
| -discard |
允許從流中丟棄特定的流或幀。使用值all會丟棄所有的流,在解復用時從流中選擇要丟棄的幀,並非所有解復用器都支持 |
去掉視頻中的音頻 ffmpeg -y -discard:a all -i 1080p.mp4 -c copy output.mp4 |
| -disposition |
設定特定的流作為默認流 |
使第二個音頻流成為默認流 ffmpeg -i in.mkv -c copy -disposition🅰️1 default out.mkv |
視頻選項
| 選項 |
說明 |
例子 |
| -vframes number |
set the number of video frames to output |
輸出200幀 ffmpeg -y -i 1080p.mp4 -vframes 200 output.mp4 |
| -r rate |
set frame rate (Hz value, fraction or abbreviation) |
設置輸出幀率為10幀 ffmpeg -y -i 1080p.mp4 -r 10 -vframes 500 output.mp4 |
| -fpsmax rate |
set max frame rate (Hz value, fraction or abbreviation) |
設置最大幀率為15幀 ffmpeg -y -i 1080p.mp4 -fpsmax 15 -vframes 500 output.mp4 |
| -s size |
set frame size (WxH or abbreviation) |
把視頻裁剪為640x480 ffmpeg -y -i 1080p.mp4 -s 640x480 -vframes 500 output.mp4 |
| -aspect aspect |
set aspect ratio (4:3, 16:9 or 1.3333, 1.7777) |
視頻比例改為4:3 ffmpeg -y -i 1080p.mp4 -aspect 4:3 -vframes 500 output.mp4 |
| -bits_per_raw_sample number |
set the number of bits per raw sample |
- |
| -vn |
disable video |
只輸出音頻 ffmpeg -y -i 1080p.mp4 -vn -c copy output.mp4 |
| -vcodec codec |
force video codec ('copy' to copy stream) |
設置輸出編碼器為libx265 ffmpeg -y -i 1080p.mp4 -vframes 500 -vcodec libx265 output.mp4 |
| -timecode hh:mm:ss[:;.]ff |
set initial TimeCode value. |
- |
| -pass n |
select the pass number (1 to 3) |
- |
| -vf filter_graph |
set video filters |
逆時針旋轉 ffmpeg -y -i 1080p.mp4 -vframes 300 -vf "transpose=2" output.mp4 |
| -ab bitrate |
audio bitrate (please use -b:a) |
設置音頻輸出碼率為56k ffmpeg -y -i 1080p.mp4 -ab 56k -vn output.mp4 |
| -b bitrate |
video bitrate (please use -b:v) |
設置視頻輸出碼率為256k ffmpeg -y -i 1080p.mp4 -b 256k -an output.mp4 |
| -dn |
disable data |
- |
音頻選項
| 選項 |
說明 |
例子 |
| -aframes number |
set the number of audio frames to output |
只寫入1000幀音頻數據 ffmpeg -y -i 1080p.mp4 -vn -aframes 1000 output.mp4 |
| -aq quality |
set audio quality (不同的編碼器使用不同的數字表示不同的碼率) |
這里以MP3為例,把碼率設置為245kbps左右 ffmpeg -y -i bugua.mp3 -aq -0 output.mp3 |
| -ar rate |
set audio sampling rate (in Hz) |
重采樣為16k ffmpeg -y -i 1080p.mp4 -vn -aframes 1000 -ar 16000 output.mp4 |
| -ac channels |
set number of audio channels |
改為雙聲道 ffmpeg -y -i 1080p.mp4 -vn -aframes 1000 -ac 2 output.mp4 |
| -an |
disable audio |
只輸出視頻 ffmpeg -y -i 1080p.mp4 -an -c copy output.mp4 |
| -acodec codec |
force audio codec ('copy' to copy stream) |
強制使用ac3編碼器 ffmpeg -y -i 1080p.mp4 -vn -aframes 1000 -acodec ac3 output.mp4 |
| -vol volume |
change audio volume (256=normal) |
把聲音調為原來的2倍 ffmpeg -y -i 1080p.mp4 -vn -aframes 1000 -vol 512 output.mp4 |
| -af filter_graph |
set audio filters |
寫入音頻之前先進行afade處理 ffmpeg -y -i 1080p.mp4 -vn -aframes 1000 -af afade output.mp4 |
Subtitle options
| 選項 |
說明 |
例子 |
| -s size |
set frame size (WxH or abbreviation) |
- |
| -sn |
disable subtitle |
- |
| -scodec codec |
force subtitle codec ('copy' to copy stream) |
- |
| -stag fourcc/tag |
force subtitle tag/fourcc |
- |
| -fix_sub_duration |
fix subtitles duration |
- |
| -canvas_size size |
set canvas size (WxH or abbreviation) |
- |
| -spre preset |
set the subtitle options to the indicated preset |
- |
例子
視頻
ffmpeg -y -i 1080p.mp4 -vn output.mp4
ffmpeg -y -i 1080p.mp4 -vcodec libx265 output.mp4
# 把前100幀視頻數據轉換為yuv444p
ffmpeg -i 1080p.mp4 -vframes 100 -pix_fmt yuv444p output.yuv
# 把前100幀視頻數據轉換為bgr555le
ffmpeg -i 1080p.mp4 -vframes 100 -pix_fmt bgr555le output.rgb
# H.264
ffmpeg -i 1080p.mp4 -f h264 -c copy output.264
# H.265
ffmpeg -i 1080p.mp4 -f h265 -c copy output.264
ffmpeg -y -i 1080p.mp4 -s 640x480 output.mp4
- 改變視頻碼率(2986kb/s -> 1000kb/s)
- 設置碼率大於原碼率是沒有意義的,因為重新編碼的數據不可能比原來的要清晰
- 如果不希望改變碼率請使用
-c:v copy
ffmpeg -y -i 1080p.mp4 -b:v 1000k output.mp4 # k表示kilo bit/s
ffmpeg -y -i 1080p.mp4 -b:v 256KB output.mp4 # KB表示 kilo Byte/s
ffmpeg -y -i 1080p.mp4 -r 40 output.mp4
- 截圖(一段時間,從69.3秒開始,持續2秒的視頻轉為圖片)
ffmpeg -y -i 1080p.mp4 -ss 69.3 -t 2 "screenshot%d.png"
ffmpeg -y -i 1080p.mp4 -ss 69.3 -vframes 1 screenshot.png
- 裁剪(從第10秒開始,截取20秒)
因為不需要改變碼率、分辨率,所以使用-c copy
ffmpeg -y -i 1080p.mp4 -ss 00:00:10 -t 20 -c copy output.mp4
- 文件轉HLS(mp4 -> hls)
切片長度為10秒,切換名字為1080p_xx.ts。關於hls可以配置的選項可以看hls muxer AVOptions
ffmpeg -i 1080p.mp4 -c copy -f hls -hls_time 10 -hls_segment_filename "1080p_%d.ts" index.m3u8
音頻
ffmpeg -y -i 1080p.mp4 -an -c copy output.mp4
ffmpeg -i bugua.mp3 -c:a copy output.mp4
ffmpeg -y -i bugua.mp3 -c aac output.mp4
ffmpeg -y -i 1080p.mp4 -b:a 64k -c:v copy output.mp4
- 為音頻添加封面
音頻文件bugua.mp3,封面文件screenshot.png,把第一個和第二個文件都映射到0號Stream,選擇第3版本的ID3v2容器(具體可以看MP3 muxer AVOptions)
ffmpeg -i bugua.mp3 -i screenshot.png -map 0:0 -map 1:0 -c copy -id3v2_version 3 out.mp3
ffmpeg -y -i 1080p.mp4 -i bugua.mp3 -i iubirea.aac -map 0:v -map 1:a -map 2:a -metadata:s:a:0 language=eng -metadata:s:a:0 title="Title 1" -metadata:s:a:1 language=sme -metadata:s:a:1 title="Title 2" -c:v copy -c:a libopus output.mp4
Filter
- 視頻縮放
使用scale濾鏡實現的,關於scale的更多配置請看scale AVOptions。iw是輸入文件的寬度ih是輸入文件的高度,如果值設置為-1會根據原比例以及給定的一個寬或者高算出該值
ffmpeg -y -i 1080p.mp4 -vf "scale=iw/2:-1" -c:a copy output.mp4
- 添加固定水印
使用overlay濾鏡實現的,關於overlay的選項可以看overlay AVOptions。左上角是坐標起始位置,H表示輸入視頻的高,h表示logo文件的高,W表示輸入視頻的寬,w表示logo文件的寬
# 左上角
ffmpeg -y -i 1080p.mp4 -i logo.jpg -filter_complex "overlay=0:0" output.mp4
# 左下角
ffmpeg -y -i 1080p.mp4 -i logo.jpg -filter_complex "overlay=0:H-h" output.mp4
# 右下角
ffmpeg -y -i 1080p.mp4 -i logo.jpg -filter_complex "overlay=W-w:H-h" output.mp4
# 右上角
ffmpeg -y -i 1080p.mp4 -i logo.jpg -filter_complex "overlay=W-w:0" output.mp4
# x偏移50,y坐標偏移50
ffmpeg -y -i 1080p.mp4 -i logo.jpg -filter_complex "overlay=50:50" output.mp4
- 添加時間水印
- 字體文件fontfile:/System/Library/Fonts/PingFang.ttc
- 字體大小fontsize:36
- 字體顏色fontcolor:Black
- 偏移:x=100,y=0
- 內容text:使用pts函數生成時間格式,使用localtime獲取時間內容,localtime參數設置為
date "+%s"(獲取當前時間的秒數),詳細信息需要閱讀源碼libavfilter/vf_drawtext.c
ffmpeg -y -i 1080p.mp4 -vf "drawtext=fontfile=/System/Library/Fonts/PingFang.ttc:fontsize=36:fontcolor=Black:x=100:y=0:text='%{pts\:localtime\:`date "+%s"`\:%H-%M-%S}'" output.mp4
$ ffmpeg -y -i bugua.mp3 -filter_complex showvolume output.mp4
$ ffmpeg -i bugua.mp3 -filter "atempo=2.0" output.mp3
概念
SAR DAR PAR
我們通過ffmpeg -i 1080p.mp4的時候會看到顯示的信息中有SAR和DAR,這兩個是什么簡稱呢?
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 2986 kb/s, 24 fps, 24 tbr, 90k tbn, 48 tbc (default)
- SAR(sample aspect ratio)存儲長寬比是以像素為單位的圖像寬度與高度的比率,例如采集分辨率是1920x1080,我的采樣分辨率是1920x1080,那么SAR是1:1。如果我的采樣分辨率是1280x720,那么SAR仍舊是1:1,因為寬高比沒有變化。如果采樣的分辨率是200x200,那么SAR就是16:9。如果采樣的分辨率是200x500,那么SAR就是40:9。計算方式就是:(采集長 / 采集寬) / (采樣長 / 采樣寬)
- DAR(display aspect ratio)顯示設備(畫布)寬高比,比如我們的分辨率是200x200,DAR是16:9,那么我們的顯示分辨率應該是355x200,這樣我們的視頻比例才正常
- PAR(pixel aspect ratio)像素長寬比,是描述數位影像的像素的寬和高之間的比率
- 他們三個的關系:PAR x SAR = DAR,所以已知兩者可以計算第三者參數
像素長寬比 2:1

像素長寬比 1:1
