FFmpeg
定义
程序 | 功能 |
---|---|
libavformat | 用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers 和muxer 库; |
libavcodec | 用于各种类型声音/图像编解码; |
libavutil | 包含一些公共的工具函数; |
libswscale | 用于视频场景比例缩放、色彩映射转换; |
libpostproc | 用于后期效果处理; |
ffmpeg | 是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码; |
ffsever | 是一个HTTP多媒体实时广播流服务器,支持时光平移; |
ffplay | 是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示; |
程序 | 功能 |
---|---|
容器 (Container) | 容器就是一种文件格式,比如.flv ,.mkv 等。包含下面5种流以及文件头信息。 |
流 (Stream) | 是一种视频数据信息的传输方式,包括音频 (audio),视频 (video),字幕 (subtitle),附件 (attachment),数据 (data)。 |
帧 (Frame) | 帧代表一幅静止的图像,分为I帧 ,P帧 ,B帧 。 |
编解码器 (Codec) | 是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode (解码) |
复用/解复用 (mux/demux) | 把不同的流按照某种容器的规则放入容器,这种行为叫做复用 (mux) ;把不同的流从某种容器中解析出来,这种行为叫做解复用 (demux) . |
视频转换
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts
.avi文件想转为.mp4,或者.mp4想转为.ts。
ffmpeg -i input.avi -vcodec libx264 output.mp4
指定解码方式,[编码/格式转换
ffmpeg -i "http://www.***.com/input.avi" -y -vcodec libx264 output.mp4
获取在线视频,自动下载并且转码并保存
该方式需要带上-y
(按顺序读取)
编码/格式转换
ffmpeg -i input.mp4 -vcodec h264 output.mp4
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
视频编码是MPEG4或H264转换成 H264 或 MPEG4 编码
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
或者用外部编码器 x265 或者 x264 来编码
提取音频
ffmpeg -i test.mp4 -acodec copy -vn output.aac
变量名 | 含义 |
---|---|
copy | 保留输入格式 |
默认输出.mp4的Audio Codec是.aac,如果不是,可以转为最常见的.aac
ffmpeg -i test.mp4 -acodec aac -vn output.aac
提取视频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
提取视频ES信息
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
截取视频/图像
截存图片
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic.jpg
将input.mp4间隔 每1秒截取1帧
变量名 | 含义 |
---|---|
-r | 帧率(/秒),效果和-vf fps 一样 |
-q:v | 表示存储.jpg的图像质量,一般2是高质量。 |
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-1.jpg
从input.mp4的 第20秒开始 接下来10秒,间隔 每1秒截取1帧
变量名 | 含义 |
---|---|
-ss | 开始时间(/秒) |
-t | 持续时间(/秒) |
ffmpeg -i input.mp4 output.%d.jpg
截取视频文件所有帧,导出成以数字编号命名的jpg
图片(序列帧)转视频
ffmpeg -i input.mp3 -i input.%3d.jpg -s 1920x1080 -vcodec mpeg4 output.avi
把以 数字编号 结尾的 序列帧 和 音频文件 利用 MPEG4编码 合成 HD分辨率 视频文件。(注:图片要放在同一个文件夹下)
变量名 | 含义 |
---|---|
%3d | 匹配数字 |
-s | 分辨率 (Scale) |
-author | 作者署名? |
截取片段
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
从 第15秒开始,截取5秒钟 。
-vcodec copy -acodec copy
写成-c:v copy -c:a copy
也可以?
合并视频
ffmpeg -i input.mp4 -i input.srt -c copy -c:s mov_text output.mp4
合并 视频input.mp4 和 字幕input.srt 为 文件output.mp4
变量名 | 含义 |
---|---|
-i | 输入文件 (Input) |
-c copy
-c:s mov_text
的顺序不可以改变,
或者使用完整表达-c:v copy
-c:a copy
-c:s mov_text
合并为.mkv文件
使用上述命令合并为Matroska格式 (.mkv)的文件会出现Subtitle codec 94213 is not supported
的报错,改为
ffmpeg -i input.mkv -i input.srt -c copy -c:s srt output.mkv
ffmpeg -i "input.mp4" -lavfi "subtitles=input.srt:force_style=''" -crf 1 -c:a copy "output.mp4"
变量名 | 含义 |
---|---|
Name | 风格 (Style) 的名称。区分大小写。不能包含逗号 |
Fontname | 使用的字体名称,区分大小写 |
Fontsize | 字体的字号 |
PrimaryColour | 设置(字体)主要颜色 (BBGGRR )。 |
SecondaryColour | 设置次要颜色 (BBGGRR )。注:在卡拉OK效果 中由次要颜色 变为主要颜色 |
OutlineColour | 设置轮廓颜色 (BBGGRR ) |
BackColour | 设置阴影颜色 (BBGGRR )。ASS的这些字段还包含了Alpha通道 信息。(AABBGGRR ),注:ASS的颜色代码要在前面加上&H |
Bold | -1 : 粗体;0 : 常规 |
Italic | -1 : 斜体;0 : 常规 |
Underline | -1 : 下划线;0 : 常规 |
Strikeout | -1 : 中划线;0 : 删除线 |
ScaleX | 修改文字的宽度 (%) |
ScaleY | 修改文字的高度 (%) |
Spacing | 文字间的额外间隙 (pixel) |
Angle | 按Z轴 进行旋转的度数,由Alignment 进行了定义原点 |
BorderStyle | 1 : 边框+阴影;3 : 纯色背景。当BorderStyle =3 时,文字下方为轮廓颜色的背景,最下方为阴影颜色背景 |
Outline | 当BorderStyle =1 时,该值定义文字轮廓宽度,为像素数,常见有0,1,2,3,4 |
Shadow | 当BorderStyle =1 时,该值定义阴影的深度,为像素数,常见有0,1,2,3,4 |
Alignment | 定义字幕的位置 |
MarginL | ←字幕可出现区域与左边缘的水平距离 (pixel) |
MarginR | 字幕可出现区域与右边缘的水平距离 (pixel)→ |
MarginV | 字幕可出现区域与下边缘的垂直距离 (pixel)↓ |
使用过滤器
在处理中,过滤器 (Filter)的意思是被编码到输出文件之前用来修改输入文件内容的工具。如:视频翻转,旋转,缩放等。
[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…
过滤器图 (Link Label)
变量名 | 含义 |
---|---|
过滤器图 (Link Label) | 标记过滤器的输入或输出的名称 |
-vf | 视频过滤器 |
-af | 音频过滤器 |
视频过滤器
变量名 | 含义 |
---|---|
transpose | 旋转,当transpose =1 时,按顺时针方向旋转90° |
hflip | 左右翻转 |
音频过滤器
变量名 | 含义 |
---|---|
atempo | 音频播放倍数,>1 时加速,<1 时倍速,比如:0.5 时是原始速度的50% |
过滤器链 (Filterchain)
filter
1
, filter2
, filter3
, …filterN-2
, filterN-1
, filterN
逗号隔开
过滤器图 (Filtergraph)
filterchain
1
;filterchain2
;…filterchainN-1
;filterchainN
实例
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w
split
过滤器创建两个输入文件的拷贝并标记为[a]
,[b]
[a]
作为pad
过滤器的输入,pad过滤器产生2倍宽度并输出到[1][b]
作为hflip
过滤器的输入,vflip过滤器水平翻转视频并输出到[2]- 用
overlay
过滤器把[2]
覆盖到[1]
的旁边
分号隔开
选择媒体流
-map file_number:stream_type[:stream_number]
变量名 | 含义 |
---|---|
-map 0 | 选择第一个文件的所有流 |
-map i:v | 从文件序号i (Index) 中获取(所有)视频流 |
-map i:a | 获取(所有)音频流 |
-map i:s | 获取(所有)字幕流 |
-an | 排除所有音频流 |
-vn | 排除所有视频流 |
-sn | 排除所有字幕流 |
- | - |
---|---|
第1个视频流 | 0:v:0 |
第1个音频流 | 0:a:0 |
第1个字幕流 | 0:s:0 |
缩减文件体积
ffmpeg -i input.mp4 -fs 1024K output.mp4
输出大小 1M 的视频
变量名 | 含义 |
---|---|
-fs | 控制文件体积 (File Size)(/Kb) |
计算公式
文件体积 (Kb)
=(视频码率
+音频码率
)×时长
÷8
视频码率
是视频数据(视频色彩量、亮度量、像素量)每秒输出的位数。一般用的单位是kbps。
动态设置分辨率
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
将 HD 分辨率缩小到 SD 输出
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
-1为动态判断,输出时保持原始的宽高比
设置帧率
变量名 | 含义 |
---|---|
-r | 帧率 (Frame Rate)(/秒) |
-vf fps=fps= | fps (Frames Per Second) |
-r 29.97
-r 30000/1001
-r netsc
具有相同效果
设置码率
计算公式
码率Bitrate
=文件体积File Size
÷时长Duration
变量名 | 含义 |
---|---|
-b | 码率 |
-b:a | 音频平均码率 |
-b:v | 视频平均码率 |
-bufsize | 设置码率控制缓冲器 |
-minrate | 控制最低码率 |
-maxrate | 控制最高码率 |
ffmpeg -i input.mp4 -b:v 2500k output.mp4
输出 平均码率2500k 的视频
ffmpeg -i input.mp4 -b:v 2500k -bufsize 2500k output.mp4
官方文档建议设置-b:v
时,同时加上-bufsize
让整体码率更趋近于指定值,减少波动。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
希望码率波动不要超过阈值,比如:码率最大值不要超过2500k
添加/去除图片
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
为视频添加图片
变量名 | 含义 |
---|---|
overlay | 图片位置,以左上角为坐标原点 |
w:h | 图片的宽和高 |
W:H | 视频的宽和高 |
overlay=W-w | 图片位于右上角↗ |
overlay=0:H-h | 图片位于左下角↙ |
overlay=W-w:H-h | 图片位于右下角↘ |
去除图片
简单来说就是在图标上面盖一张图片
-vf delogo=x:y:w:h[:t[:show]]
变量名 | 含义 |
---|---|
x:y | 以左上角为原点的坐标 |
w:h | 图片的宽和高 |
t | 矩形边缘的厚度,默认值4 |
show | 若设置为1有一个绿色的矩形,默认值0 |
m3u8切片
ffmpeg -i input.ts -c copy -map 0 -f segment -segment_list index.m3u8 -segment_time 5 title-%03d.ts
ffmpeg -i input.mp4 -c copy hls_list_size 0 hls_time 5 output.m3u8
变量名 | 含义 |
---|---|
-segment_time | 切片 (Segment),进行文件切片操作间隔时间(/秒) |
hls_list_size | 目录文件index中需要播放的文件数量,0表示整个视频 |
hls_time | 每个切片文件持续时间 |
其他
名称 | 视频大小 | 分辨率 |
---|---|---|
UHD (4K) | 2160p | 3840×2160 pixels |
2K | 1440p | 2560×1440 pixels |
HD | 1080p | 1920×1080 pixels |
SD | 720p | 1280×720 pixels |
480p | 720×480 pixels |
-Help
变量名 | 含义 |
---|---|
-h | – print basic options |
-h long | – print more options |
-h full | – print all options (including all format and codec specific options, very long) |
-h type=name | – print all options for the named decoder/encoder/demuxer/muxer/filter/bsf |
See man ffmpeg for detailed description of the options.
Print help / information / capabilities:
变量名 | 含义 |
---|---|
-L | show license |
-h topic | show help |
-? topic | show help |
-help topic | show help |
–help topic | show help |
-version | show version |
-buildconf | show build configuration |
-formats | show available formats |
-muxers | show available muxers |
-demuxers | show available demuxers |
-devices | show available devices |
-codecs | show available codecs |
-decoders | show available decoders |
-encoders | show available encoders |
-bsfs | show available bit stream filters |
-protocols | show available protocols |
-filters | show available filters |
-pix_fmts | show available pixel formats |
-layouts | show standard channel layouts |
-sample_fmts | show available audio sample formats |
-colors | show available color names |
-sources device | list sources of the input device |
-sinks device | list sinks of the output device |
-hwaccels | show available HW acceleration methods |
Global options (affect whole program instead of just one file:
变量名 | 含义 |
---|---|
-loglevel loglevel | set logging level |
-v loglevel | set logging level |
-report | generate a report |
-max_alloc bytes | set maximum size of a single allocated block |
-y | overwrite output files |
-n | never overwrite output files |
-ignore_unknown | Ignore unknown stream types |
-filter_threads | number of non-complex filter threads |
-filter_complex_threads | number of threads for -filter_complex |
-stats | print progress report during encoding |
-max_error_rate maximum error rate | ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success. |
-bits_per_raw_sample number | set the number of bits per raw sample |
-vol volume | change audio volume (256=normal) |
Per-file main options:
变量名 | 含义 |
---|---|
-f | fmt |
-c | codec |
-codec | codec |
-pre | preset |
-map_metadata | outfile[,metadata]:infile[,metadata] |
-t duration | record or transcode “duration” seconds of audio/video |
-to time_stop | record or transcode stop time |
-fs limit_size | set the limit file size in bytes |
-ss time_off | set the start time offset |
-sseof time_off | set the start time offset relative to EOF |
-seek_timestamp | enable/disable seeking by timestamp with -ss |
-timestamp time | set the recording timestamp (‘now’ to set the current time) |
-metadata string=string | add metadata |
-program title=string:st=number… | add program with specified streams |
-target type | specify target file type (“vcd”, “svcd”, “dvd”, “dv” or “dv50” with optional prefixes “pal-”, “ntsc-” or “film-”) |
-apad | audio pad |
-frames number | set the number of frames to output |
-filter filter_graph | set stream filtergraph |
-filter_script filename | read stream filtergraph description from a file |
-reinit_filter | reinit filtergraph on input parameter changes |
-discard | discard |
-disposition | disposition |
Video options:
变量名 | 含义 |
---|---|
-vframes number | set the number of video frames to output |
-r rate | set frame rate (Hz value, fraction or abbreviation) |
-s size | set frame size (WxH or abbreviation) |
-aspect aspect | set aspect ratio (4:3, 16:9 or 1.3333, 1.7777) |
-bits_per_raw_sample number | set the number of bits per raw sample |
-vn | disable video |
-vcodec codec | force video codec (‘copy’ to copy stream) |
-timecode hh:mm:ss[:;.]ff | set initial TimeCode value. |
-pass n | select the pass number (1 to 3) |
-vf filter_graph | set video filters |
-ab bitrate | audio bitrate (please use -b:a) |
-b bitrate | video bitrate (please use -b:v) |
-dn | disable data |
Audio options:
变量名 | 含义 |
---|---|
-aframes number | set the number of audio frames to output |
-aq quality | set audio quality (codec-specific) |
-ar rate | set audio sampling rate (in Hz) |
-ac channels | set number of audio channels |
-an | disable audio |
-acodec codec | force audio codec (‘copy’ to copy stream) |
-vol volume | change audio volume (256=normal) |
-af filter_graph | set audio filters |
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 |