- 要什么要使用命令行呢?
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:a: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
ffmpeg -i 1080p.mp4 -vframes 100 -pix_fmt yuv444p output.yuv
ffmpeg -i 1080p.mp4 -vframes 100 -pix_fmt bgr555le output.rgb
ffmpeg -i 1080p.mp4 -f h264 -c copy output.264
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
ffmpeg -y -i 1080p.mp4 -b:v 256KB output.mp4
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
选择 |
说明 |
-vcodec |
设置视频编码格式,copy 表示保留原格式 |
-acodec |
设置音频编码格式,copy 表示保留原格式 |
-bsf:v |
设置视频流模式bitstream filters ,比如h264_mp4toannexb |
-f |
强制输入或者输出格式,比如分段格式segment |
-segment_list |
设置分段列表名字 |
-segment_time |
设置分段时长,单位是秒,这个不是精准的,根据关键帧间隔而定 |
ffmpeg -i 1080p.mp4 -vcodec copy -acodec copy -bsf:v h264_mp4toannexb -f segment -segment_list index.m3u8 -segment_time 20 ouput%03d.ts
音频
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
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