文章目录
- 如何阅读官网命令行?
- 阅读本文的正确姿势Ctrl+F
- ffmpeg
- ffmpeg命令的语法结构
- 一般规则
- 输入参数 -i
- 流复制 Stream copy
- 流选择 Stream selection
- 自动流选择 Automatic stream selection
- 手动流选择 Manual stream selection
- -map
- 文件选择和流选择 [2:3]
- 流选择 -vn/-an/-sn/-dn
- 下面的例子说明FFmpeg的流选择方法的行为、怪癖和限制
- 自动字幕流选择 automatic subtitles selection
- 不加标签的滤镜输出 unlabeled filtergraph outputs
- 带标签的滤镜输出labeled filtergraph outputs
- 选项Options
- 流说明符 Stream specifiers
- 流索引 stream_index
- stream_type[:additional_stream_specifier]
- 通用选项 Generic options
- long
- full
- decoder=decoder_name
- encoder=encoder_name
- demuxer=demuxer_name
- muxer=muxer_name
- filter=filter_name
- bsf=bitstream_filter_name
- -version
- -formats
- -demuxers
- -muxers
- -devices
- -codecs
- -decoders
- -encoders
- -bsfs
- -protocols
- -filters
- -pix_fmts
- -sample_fmts
- -layouts
- -colors
- -sources device[,opt1=val1[,opt2=val2]...]
- -sinks device[,opt1=val1[,opt2=val2]...]
- -loglevel [flags+]loglevel | -v [flags+]loglevel
- repeat
- level
- quiet, -8
- panic, 0
- fatal, 8
- error, 16
- warning, 24
- info, 32
- verbose, 40
- debug, 48
- AVOptions
- 主要选项 Main options
- -f fmt (input/output)
- -i url (input)
- -y (global)
- -n (global)
- -stream_loop number (input)
- -c[:stream_specifier] codec (input/output,per-stream)
- -codec[:stream_specifier] codec (input/output,per-stream)
- -t duration (input/output)
- -to position (input/output)
- -fs limit_size (output)
- -ss position (input/output)
- -sseof position (input)
- -itsoffset offset (input)
- -itsscale scale (input,per-stream)
- -timestamp date (output)
- -metadata[:metadata_specifier] key=value (output,per-metadata)
- -dn (input/output)
- -frame:d
- -frames[:stream_specifier] framecount (output,per-stream)
- -filter[:stream_specifier] filtergraph (output,per-stream)
- -vf filtergraph (output)
- 表达式赋值 Expression Evaluation
- abs(x)
- acos(x)
- asin(x)
- atan(x)
- atan2(x, y)
- between(x, min, max)
- bitand(x, y)
- bitor(x, y)
- ceil(expr)
- clip(x, min, max)
- cos(x)
- cosh(x)
- eq(x, y)
- exp(x)
- floor(expr)
- gauss(x)
- gcd(x, y)
- gt(x, y)
- gte(x, y)
- hypot(x, y)
- if(x, y)
- if(x, y, z)
- ifnot(x, y)
- ifnot(x, y, z)
- isinf(x)
- isnan(x)
- ld(var)
- lerp(x, y, z)
- log(x)
- lt(x, y)
- lte(x, y)
- max(x, y)
- min(x, y)
- mod(x, y)
- not(expr)
- pow(x, y)
- print(t)
- print(t, l)
- random(x)
- round(expr)
- sgn(x)
- sin(x)
- sinh(x)
- tan(x)
- tanh(x)
- -pix_fmt
- -framerate
- -loop
- -accurate_seek (input)
- anullsrc
- pad
- 滤镜filtering
- 简单滤镜Simple filtergraphs
- 复杂滤镜Complex filtergraphs
- -filter_complex filtergraph (global)
- 覆盖 overlay
- x
- y
- format
- yuv420
- yuv422
- yuv444
- rgb
- gbrp
- auto
- main_w, W
- main_h, H
- overlay_w, w
- overlay_h, h
- overlay跑马灯效果
- 缩放 scale
- width, w
- height, h
- in_w in_h
- iw ih a
- out_w out_h ow oh
- sar
- dar
- hsub vsub
- ohsub ovsub
- drawtext
- box
- boxborderw
- boxcolor
- line_spacing
- borderw
- bordercolor
- expansion
- basetime
- fix_bounds
- fontcolor
- fontcolor_expr
- font
- fontfile
- alpha
- fontsize
- text_shaping
- ft_load_flags
- shadowcolor
- shadowx shadowy
- start_number
- tabsize
- timecode
- timecode_rate, rate, r
- tc24hmax
- text
- textfile
- reload
- x y
- dar
- sar
- hsub vsub
- line_h, lh
- main_h, h, H
- main_w, w, W
- n
- rand(min, max)
- t
- text_h, th
- text_w, tw
- x y
- pict_type
- pkt_pos
- pkt_duration
- packet概念参考ffmpeg入门教程中编解码相关文章[https://www.jianshu.com/p/042c7847bd8a](https://www.jianshu.com/p/042c7847bd8a)
- pkt_size
- drawtext举例
- setdar, setsar
- concat
- -r[:stream_specifier] fps (input/output,per-stream)
- -vcodec codec (output)
- -preset type
- crop
- force_original_aspect_ratio
- amerge
- amix
- -preset
- -crf
- H264
- -profile
- movie
- seek_point, sp
- 欢迎联系、指正、批评
如何阅读官网命令行?
http://ffmpeg.org/documentation.html
可以看到贼多命令行,比如ffmpeg-all
先看下概述,找到感觉
如何查找命令行?
Ctrl+F
阅读本文的正确姿势Ctrl+F
ffmpeg
ffmpeg是一个非常快速的视频和音频转换器,也可以从实时音频/视频源抓取信息。
ffmpeg命令的语法结构
ffmpeg [global_options] {[input_file_options] -i input_url} ...
{[output_file_options] output_url} ...
一般规则
我们规定,选项应用于下一个指定的文件。因此,顺序很重要,这样才可以在命令行上多次使用相同的选项。然后将每个选项应用于下一输入或输出文件。此规则的例外是全局选项(例如,verbosity级别),应首先指定。
不要混合输入文件和输出文件-首先指定所有输入文件,然后指定所有输出文件。也不混合属于不同文件的选项。所有选项仅用于下一个输入或输出文件,并在文件之间重置。
输入参数 -i
ffmpeg读取由 -i
选项指定的任意数量的输入“文件”(可以是常规文件、管道、网络流、设备数据流等),并写入由输出url指定的任意数量的输出“文件”。在命令行中发现的任何不能解释为选项的内容都被视为输出url。
举例如下:
#To set the video bitrate of the output file to 64 kbit/s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
#To force the frame rate of the output file to 24 fps:
ffmpeg -i input.avi -r 24 output.avi
#To force the frame rate of the input file (valid for raw formats only)
#to 1 fps and the frame rate of the output file to 24 fps:
ffmpeg -r 1 -i input.m2v -r 24 output.avi
流复制 Stream copy
流复制,需要通过向-codec
选项提供复制参数来选择。它使ffmpeg省略了对指定流的解码和编码步骤,因此它只进行解封装和封装。它对于更改容器格式或修改容器级元数据非常有用。在这种情况下,上面的图表将简化为:
_______ ______________ ________
| | | | | |
| input | demuxer | encoded data | muxer | output |
| file | ---------> | packets | -------> | file |
|_______| |______________| |________|
由于没有解码或编码,它非常快,没有质量损失。然而,由于许多因素,它在某些情况下可能行不通。显然,应用滤镜也是不可能的,因为滤镜可以处理未压缩的数据。
流选择 Stream selection
自动流选择 Automatic stream selection
如果没有任何特定输出文件的映射选项,ffmpeg将检测输出格式,以检测其中可以包含哪种类型的流,即,视频、音频和/或字幕。对于每种可接受的流类型,ffmpeg将在可用时从所有输入中选择一个流。
它根据以下标准选择流:·
- 对于视频,选择分辨率最高的流
- 对于音频,选择有最多频道的流
- 对于字幕,选择第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且只选择相同类型的字幕流。
在有几个相同类型的比特率相等的情况下,选择索引最低的流。无法自动选择数据流或附件流,只能使用-map
将其包括在内。
手动流选择 Manual stream selection
当使用-map时,该输出文件中只包含用户映射的流,当然也有例外的场景。
-map
每个输入或输出url原则上可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流数目和/或类型受容器格式的限制。选择哪些输入的哪些流进行输出,要么自动完成,要么使用-map
选项。
文件选择和流选择 [2:3]
若要引用选项中的输入文件,必须使用它们的索引(基于0的)。例如:第一输入文件为0
,第二输入文件为1
等。类似地,文件中的流由它们的索引引用。例如:2:3
指第三个输入文件中的第四个流。
流选择 -vn/-an/-sn/-dn
ffmpeg为手动控制每个输出文件中的流选择提供了-map
选项。用户可以不使用-map
,让ffmpeg执行自动流选择,
如下所述。
无论是手动映射还是自动选择,除了复杂滤波图的输出流,选项-vn/-an/-sn/-dn
可分别用于跳过包括视频、音频、字幕和数据流。
下面的例子说明FFmpeg的流选择方法的行为、怪癖和限制
input file 'A.avi'
stream 0: video 640x360
stream 1: audio 2 channels
input file 'B.mp4'
stream 0: video 1920x1080
stream 1: audio 2 channels
stream 2: subtitles (text)
stream 3: audio 5.1 channels
stream 4: subtitles (text)
input file 'C.mkv'
stream 0: video 1280x720
stream 1: audio 2 channels
stream 2: subtitles (image)
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov
指定了三个输出文件,对于前两个,无-map
选项,因此ffmpeg将自动为这两个文件选择流。
out1.mkv
是一个高清格式文件,接受视频、音频和字幕流,因此ffmpeg将尝试选择每种类型中的一种。对于视频,它将从b.mp4
中选择流0
,因为它在所有输入视频流中具有最高的分辨率。对于音频,它将从b.mp4
中选择流3
,因为它有最多的频道。对于字幕,它将从b.mp4
中选择流2
,这是a.avi
和b.mp4
中的第一个字幕流。
输出2.wav
只接受音频流,因此只选择b.mp4
中的流3
。
对于out3.mov
,由于设置了-map
选项,因此不会出现自动流选择。-map 1:a
选项将从第二个输入b.mp4
中选择所有音频流。此输出文件中不会包含其他流。
对于前两个输出,所有包含的流都将被转码。所选择的编码器将是由每种输出格式注册的默认编码器,这可能与所选输入流的编解码器不匹配。
对于第三个输出,音频流的codec
选项(-c:a)
已设置为复制,因此不会发生或可能发生解码-滤镜-编码操作。所选流的packets编码数据包从输入文件中传输,然后封装到输出文件中。
自动字幕流选择 automatic subtitles selection
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
虽然out1.mkv
是一个接受字幕流的高清格式文件,但只能选择一个视频和音频流。C.mkv
的字幕流是基于图像的,mkv
封装器的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,因此不会选择流。
但是,在out2.mkv
中,命令中指定了字幕编码器,因此,除了视频流之外,还选择了字幕流。out2.mkv
的-an
禁用音频流的选择。
不加标签的滤镜输出 unlabeled filtergraph outputs
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
这里使用-filter_complex
选项设置了一个滤镜,它由一个视频滤镜组成。overlay
滤镜需要两个视频输入,但没有指定,因此使用了前两个可用的视频流,即a.avi
和c.mkv
的视频流。滤镜的输出面板没有标签,因此被传递到第一个输出文件out1.mp4
。因此,将跳过视频流的自动选择,这将选择b.mp4
中的视频流。具有最多数量频道的音频流,即b.mp4
中的流3
,会被自动选择。但是没有选择字幕流,因为MP4
格式没有默认的字幕编码器注册,而且用户没有指定字幕编码器。
第二个输出文件out2.srt
只接受基于文本的字幕流。因此,尽管可用的第一个字幕流属于c.mkv
,但它是基于图像的,因此跳过了。选定的流,b.mp4
中的流2
,是第一个基于文本的字幕流。
带标签的滤镜输出labeled filtergraph outputs
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex
"[1:v]hue=s=0[outv];overlay;aresample" \
-map '[outv]' -an out1.mp4 \
out2.mkv \
-map '[outv]' -map 1:a:0 out3.mkv
以上命令将失败,因为标记为[outv]的输出标签已被映射两次。不处理任何输出文件。
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex
"[1:v]hue=s=0[outv];overlay;aresample" \
-an out1.mp4 \
out2.mkv \
-map 1:a:0 out3.mkv
上面的命令也会失败,因为色调滤镜输出有一个标签[outv],并且没有被映射到任何地方。
应修改为如下命令:
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex
"[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
-map '[outv1]' -an out1.mp4 \
out2.mkv \
-map '[outv2]' -map 1:a:0 out3.mkv
来自b.mp4
的视频流被发送到色调滤镜,其输出使用分割滤镜被克隆一次,并且这两个输出都有标签。然后,将每个副本映射到第一和第三输出文件。
overlay
滤镜需要两个视频输入,使用前两个未使用的视频流。这些是来自a.avi
和c.mkv
的流。overlay
输出没有标签,因此它被传递到第一个输出文件out1.mp4
,而不考虑-map
选项的存在。
aresample
滤镜被应用给第一个未使用的音频流,即a.avi
的音频流。因为这个滤镜输出也没有标签,所以它也被映射到第一个输出文件。-an
选项会抑制音频流的自动或手动选择,而不是从滤镜获取输出。这两个映射流都应在输出1.mp4
中的映射流之前排序。
映射到out2.mkv
的视频、音频和字幕流完全由自动流选择决定。
out3.mkv
由来自色调滤镜克隆的视频输出和来自b.mp4
的第一个音频流组成。
选项Options
流说明符 Stream specifiers
有些选项应用于每个流,例如比bitrate
比特率 或编解码器codec
。流说明符用于精确指定给定选项所属的流。流说明符是通常附加到选项名称并由冒号分隔的字符串。例如a:1 ac3
包含与第二音频流匹配的a:1
流说明符。因此,它将为第二音频流选择ac3
编解码器。流说明符可以匹配多个流,以便将该选项应用到所有流。例如-b:a 128K
匹配所有音频流。空的流说明符匹配所有流。例如,-codec copy
或-codec: copy
复制所有流,而无需重新编码。
流说明符的可能形式是:
流索引 stream_index
将流与索引匹配。例如:-threads:1 4
将第二流的线程数量设置为4。如果使用stream_index作为附加的流说明符(见下文),那么它将从匹配的流中选择流号stream_index
。流编号是基于libavformat
检测到的流的顺序,除非 program ID
也被指定,在这种情况下,它是基于程序中流的排序。
stream_type[:additional_stream_specifier]
stream_type是以下内容之一:v
或V
,用于视频,a
用于音频,s
用于字幕,d
用于数据,而t
用于附件。v
匹配所有视频流,V
仅匹配未连接图片、视频缩略图或封面艺术的视频流。如果使用了附加流说明符,则它匹配具有和此类型以及附加流说明符匹配的流。否则,它与指定类型的所有流匹配。
通用选项 Generic options
这些选项在ff*工具上都可使用。
-L
显示版权信息
-h
、-?
、-help
、--help[arg]
显示帮助信息。可以指定可选参数来打印有关特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。
arg的可能值包括:
long
除了基本工具选项外,还可以打印高级工具选项。
full
打印完整的选项列表,包括encoders
编码器、decoders
解码器、demuxers
解封装器、muxers
封装器、滤镜等的共享和私有选项。
decoder=decoder_name
打印指定解码器的详细信息。使用-decoders
选项打印所有解码器的列表。
encoder=encoder_name
打印指定编码器的详细信息。使用-encoders
选项打印所有编码器。
demuxer=demuxer_name
打印指定demuxer
的详细信息。使用-format
选项打印所有demuxers
和muxers
。
muxer=muxer_name
打印指定muxer
的详细信息。使用-format
选项打印所有demuxers
和muxers
。
filter=filter_name
打印指定滤镜的详细信息。使用-filters选项打印所有滤镜。
bsf=bitstream_filter_name
打印指定位流滤镜的详细信息。使用-bsfs
选项打印所有位流滤镜。
-version
显示版本信息
-formats
显示可用格式(包括设备)。
-demuxers
显示可用的demuxers解封装器
-muxers
显示可用的muxers封装器
-devices
显示可用的设备devices
-codecs
显示所有libavcodec
中已知的编解码器。
-decoders
显示可用的解码器decoders
-encoders
显示可用的编码器encoders
-bsfs
显示可用的位流滤镜bitstream filters
-protocols
显示可用的协议
-filters
显示libavfilter
中可用的滤镜
-pix_fmts
显示所有支持的像素格式
-sample_fmts
显示可用的采样格式。
-layouts
显示音频通道名称和标准音频通道布局。
-colors
显示可识别的颜色名称。
-sources device[,opt1=val1[,opt2=val2]…]
显示输入设备的自动检测源。一些设备可以提供无法自动检测的依赖于系统的源名称。返回的列表不一定总是完整的。
ffmpeg -sources pulse,server=192.168.0.4
-sinks device[,opt1=val1[,opt2=val2]…]
显示输出设备的自动检测接收器。有些设备可能提供无法自动检测到依赖于系统的接收器名称。返回的列表不一定是完整的。
ffmpeg -sinks pulse,server=192.168.0.4
-loglevel [flags+]loglevel | -v [flags+]loglevel
设置由库使用的日志级别和标志。
可选标志前缀可以由以下值组成:
repeat
Indicates that repeated log output should not be compressed to the first
line and the "Last message repeated n times" line will be omitted.
指示不应将重复日志输出压缩到第一行,并且…
level
指示日志输出应在每条消息行中添加一个[level]前缀。这可以用作日志着色,例如,当将日志转储到文件中时。
Flags can also be used alone by adding a ’+’/’-’ prefix to set/reset a single flag without affecting
other flags or changing loglevel. When setting both flags and loglevel, a ’+’ separator
is expected between the last flags value and before loglevel.
也可以通过添加+/-
前缀来单独使用标志,以设置/重置单个标志,而不影响其他标志或更改日志级别。设置“标志”和“LogLevel”时,在最后一个标志值和LogLevel之前都会有一个+
分隔符。
loglevel 是字符串或包含以下值之一的数字:
quiet, -8
不输出任何信息
panic, 0
只显示可能导致进程崩溃的致命错误,例如断言失败。目前没有用于任何地方。
fatal, 8
只显示致命的错误。这些错误出现在进程绝对不能继续下去的时候。
error, 16
显示所有错误,包括可以从其中恢复的错误。
warning, 24
显示所有警告和错误。将显示可能发生的不正确或意外事件有关的任何消息。
info, 32
在处理期间显示信息级别的消息,这是默认值。
verbose, 40
和信息级别一样,但是更冗长。
debug, 48
显示所有内容,包括调试信息。
例如,要启用重复的日志输出,添加级别前缀,并将日志级别设置为verbose
:
ffmpeg -loglevel repeat+level+verbose -i input output
在不影响级别前缀标志或日志级别的当前状态的情况下启用重复日志输出的另一个示例:
ffmpeg [...] -loglevel +repeat
默认情况下,程序记录到stderr。如果终端支持着色,则使用颜色标记错误和警告。可以禁用日志着色,设置环境变量AV_LOG_FORCE_NOCOLOR
或NO_COLOR
,也可以强制设置环境变量AV_LOG_FORCE_COLOR
。不推荐使用环境变量NO_COLOR
,并将在以后的ffmpeg版本中删除。
AVOptions
这些选项由libavformat
、libavdevice
和libavcodec
库直接提供。要查看可用的AVOptions
列表,请使用-help
选项。它们分为两类:
通用选项generic
可以为任何文件格式、编解码器或设备设置这些选项。通用选项在用于文件格式/设备的AVFormatContext
选项下,并在编解码器的AVCodecContext
上下文选项下列出。
私有选项private
这些选项特定于给定的文件格式、设备或编解码器。相应的文件格式/设备/编解码器下列出了私有选项。
例如,要将id3v2.3
头而不是默认的id3v2.4
写入mp3
文件,使用mp3 muxer的id3v2_version
私有选项:
ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有编解码器的AVOptions都是应用于每个流的,因此应该附加一个流说明符:
ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k
-ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
在上面的例子中,一个多声道音频流被映射两次以便输出。第一个实例由编码器ac3指定比特率640 k编码。第二个实例被降至2个信道,并使用编码器aac编码。使用输出流的绝对索引为它指定128 k的比特率。
注意:-nooption
语法不能用于布尔选项,请使用 -option 0/-option 1
.
注意:通过在选项名称前面加上v/a/s
来指定每个流的AVOptions
的旧的无文档化方法现在已经过时,并将很快被删除。
主要选项 Main options
-f fmt (input/output)
强制输入或输出文件格式。通常自动检测输入文件的格式,并从输出文件的文件扩展名中猜测格式,因此在大多数情况下不需要此选项。
-i url (input)
输入文件的url
-y (global)
强制覆盖输出文件
-n (global)
不要覆盖输出文件,如果指定的输出文件已经存在,则立即退出。
-stream_loop number (input)
设置输入流的循环次数。循环0表示没有循环,循环-1表示无限循环.
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用)。codec
或者c
填值解码器/编码器的名称,codec
或者c
填值copy
,表示(仅输出),以指示流不被重新编码。
举例:
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
用libx264对所有视频流进行编码,并复制所有音频流。
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
复制所有流,除了将用libx264
编码的第2
个视频流和将用libvorbis
编码的第138
个音频流。
-t duration (input/output)
-to position (input/output)
当用作输入选项(在-i
之前)时,限制从输入文件读取数据的持续时间。当用作输出选项时(在输出url
之前),在输出持续时间达到持续时间后停止写入输出。duration
必须是时间期限规范,请参阅(ffmpeg-utils)在ffmpeg-utils(1)手册中的时间duration 部分。-to
和-t
是相互排斥的,-t
有优先权。
-fs limit_size (output)
设置文件大小限制,以字节表示。超过限制后,不再写入更多的字节块。输出文件的大小略大于
请求的文件大小。
-ss position (input/output)
当用作输入选项(-i
之前)时,在此输入文件中定位位置。请注意,在大多数格式中,不可能精确地寻找,因此ffmpeg将在位置之前定位到最接近的点。当启用转码transcoding
和-精确定位-accurate_seek
(默认)时,seek point
和position
之间的这个额外段将被解码和丢弃。当做流复制或当使用 -noaccurate_seek
的寻求时,它将被保存。
当用作输出选项时(在输出url
之前),解码但丢弃输入,直到时间戳到达位置。位置必须是time duration
规范,请参阅(ffmpeg-utils)在ffmpeg-utils(1)手册中的time duration
部分。
-sseof position (input)
Like the -ss option but relative to the "end of file".
That is negative values are earlier in the file, 0 is at EOF.
与-ss
选项类似,但相对于"文件结束"。这是文件中较早的负值,0
在EOF
。
-itsoffset offset (input)
设置输入时间偏移。偏移量必须是 time duration
规范,参见FFmpeg-utils(1)手册中的 time duration
部分。将偏移添加到输入文件的时间戳中。指定正偏移意味着对应的流被延迟指定的持续时间。
-itsscale scale (input,per-stream)
重新调整输入时间戳。scale
用浮点数。
-timestamp date (output)
在文件格式容器中设置记录时间戳。日期必须是日期规格,请参阅FFmpeg-utils(1)手册中的日期部分。
-metadata[:metadata_specifier] key=value (output,per-metadata)
设置元数据 key/value
对。
可以给出可选的元数据_说明符以在流、章节或程序上设置元数据。有关详细信息,请参见
-map_metadata
文档。
此选项将覆盖带有-map_metadata
的元数据集。也可以通过使用空的值来删除元数据。
例如,用于在输出文件中设置标题:
ffmpeg -i in.avi -metadata title="my title" out.flv
要设置第一个音频流的语言,请执行以下操作:
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
-dn (input/output)
作为输入选项,阻止文件的所有数据流被过滤或被自动选择或映射到任何输出。请参见-discard
选项以单独禁用流。作为输出选项,禁用数据,即任何数据流的自动选择或映射。有关完整的手动控制,请参见-map
选项。
-frame:d
设置要输出的数据帧数。
-frames[:stream_specifier] framecount (output,per-stream)
在framecount 个帧之后停止写入流。
-filter[:stream_specifier] filtergraph (output,per-stream)
创建指定的滤镜,并使用它来过滤流。必须具有相同类型的流的单个输入和单个输出。。有关filtergraph
语法的详细信息,请参见FFmpeg-filter手册。如果要创建具有多个输入和/或输出的filtergraphs
,请参见-filter_complex
选项。
-vf filtergraph (output)
创建filtergraph
,并使用它来过滤流。这是-filter:v
的别名,请参见-filter
选项。
表达式赋值 Expression Evaluation
当计算算术表达式的值时,FFmpeg使用通过libavutil/eval.h
接口实现的内部公式求值程序。表达式可以包含一元
、二元运算符
、常量
和函数
。两个表达式expr1
和expr2
可以合并以形成另一个表达式"expr1;expr2 "
。expr1
和expr2
依次进行计算,新的表达式计算为expr2
的值。二元运算符:+、-、*、/、^
。一元运算符:+,-
。
函数:
abs(x)
计算X的绝对值。
acos(x)
计算x的反余弦
asin(x)
计算x的反正弦
atan(x)
计算X的反正切。
atan2(x, y)
Compute principal value of the arc tangent of y/x.
between(x, min, max)
如果min<=x<=max
,则返回1
,否则返回0
。
bitand(x, y)
bitor(x, y)
在X
和Y
上计算按位和/或运算。在执行按位操作之前,将X
和Y
的求值结果转换为整数。请注意,转换为整数再转换回浮点会失去精度。注意大数的意外结果(2^53
和更大)。
ceil(expr)
将表达式expr
的值向上舍入到最近的整数。例如,"ceil(1.5)
“是"2.0
”。
clip(x, min, max)
Return the value of x clipped between min and max.
cos(x)
计算X的余弦。
cosh(x)
Compute hyperbolic cosine of x.
eq(x, y)
如果X
和Y
相等,则返回1
,否则返回0
。
exp(x)
Compute exponential of x (with base e, the Euler’s number).
计算x
的指数(以e
为基数,欧拉数)。
floor(expr)
将表达式expr
的值向下舍入到最近的整数。例如,“floor(-1.5)
”为“-2.0
”。
gauss(x)
Compute Gauss function of x, corresponding to exp(-x*x/2) / sqrt(2*PI).
计算x
的高斯函数,对应于exp(-x*x/2)/sqrt(2*PI)
。
gcd(x, y)
Return the greatest common divisor of x and y. If both x and y are 0 or either
or both are less than zero then behavior is undefined.
返回x
和y
的最大公因子。如果x
和y
都是0
,或者两者都小于0
,则…。
gt(x, y)
如果x>y
,则返回1
,否则为0
。
gte(x, y)
如果x>=y
,则返回1
,否则返回0
hypot(x, y)
此函数类似于同名的c函数;它返回“sqrt(x*xy*y)”
,即直角边长度为x
和y
的直角三角形的斜边长度,或点(x,y)
与原点
的距离。
if(x, y)
Evaluate x, and if the result is non-zero return the result of the evaluation of y,
return 0 otherwise.
if(x, y, z)
Evaluate x, and if the result is non-zero return the evaluation result of y,
otherwise the evaluation result of z.
ifnot(x, y)
Evaluate x, and if the result is zero return the result of the evaluation of y,
return 0 otherwise.
ifnot(x, y, z)
Evaluate x, and if the result is zero return the evaluation result of y,
otherwise the evaluation result of z.
isinf(x)
如果x
是+/-无穷大
,则返回1.0
,否则返回0.0
。
isnan(x)
如果X
为NaN
(not a number非数字),则返回1.0
,否则为0.0
。
ld(var)
Load the value of the internal variable with number var, which was previously stored with
st(var, expr). The function returns the loaded value.
lerp(x, y, z)
Return linear interpolation between x and y by amount of z.
在x
和y
之间通过z
的量返回线性插值。
log(x)
计算x
的自然对数。
lt(x, y)
如果x<y
,则返回1
,否则为0
。
lte(x, y)
如果x<=y
,则返回1
,否则返回0
。
max(x, y)
返回x
和y
中的最大值。
min(x, y)
返回x
和y
中的最小值。
mod(x, y)
计算x%y
。
not(expr)
如果expr
为0
,则返回1.0
,否则返回0.0
。
pow(x, y)
计算x^y
print(t)
print(t, l)
用loglevel
打印表达式t
的值。如果未指定l
,则使用默认日志级别。返回打印的表达式的值。
random(x)
Return a pseudo random value between 0.0 and 1.0.
x is the index of the internal variable which will be used to save the seed/state.
返回0.0
到1.0
之间的伪随机值。
round(expr)
将表达式expr
的值四舍五入。例如,"round(1.5)
“是"2.0
”。
sgn(x)
Compute sign of x.
sin(x)
计算x
的正弦。
sinh(x)
Compute hyperbolic sine of x.
tan(x)
计算x的正切
tanh(x)
Compute hyperbolic tangent of x.
-pix_fmt
设置像素格式。如果所设置的像素格式不能被设置成功,
-framerate
设置抓取帧速率。默认为ntsc
,对应的帧速率为30000/1001
。
-loop
设置循环输出的次数。使用-1
表示不循环,使用0
表示无限循环(默认)。
-accurate_seek (input)
此选项使用-ss
选项启用或禁用输入文件中的精确查找。默认启用,所以转码时seek
准确。使用
-noaccurate_seek
禁用它,这可能很有用,例如在复制一些流
并对其他流进行转码
时。
anullsrc
空音频源返回未处理的音频帧。它主要用作模板,在分析/调试工具中使用,或者作为忽略输入数据的滤镜的来源(例如sox synth
滤镜)。
接受以下选项:
channel_layout, cl
指定频道布局,可以是表示频道布局的整数或字符串。channel_layout
的默认值是“立体声”。 检查libavutil/channel_layout.c
中的channel_layout_map
定义,了解字符串和通道布局值之间的映射。
sample_rate, r
指定采样速率,默认值为44100
。
nb_samples, n
设置每个请求帧的样本数。
duration, d
设定源音频的持续时间。有关可接受的语法,请参见ffmpeg-utils(1)
手册中的(ffmpeg-utils)
持续时间部分。 如果未指定,或者表示的持续时间为负,则音频能生成。
pad
向输入图像添加填充,并将原始输入放置在提供的x,y
坐标处。 它接受以下参数:
width, w
height, h
为添加了填充的输出图像的大小指定一个表达式。如果宽度或高度的值为0
,则相应的输入大小用于输出。 宽度表达式可以引用高度表达式设置的值,反之亦然。 宽度和高度的默认值为0
。
x
y
指定输入图像在填充区域内相对于输出图像上/左
边框的偏移量。 x
表达式可以引用y
表达式设置的值,反之亦然。 x
和y
的默认值是0
。 如果x
或y
的计算结果为负数,它们将被更改,以便输入图像在填充区域居中。
color
指定填充区域的颜色。有关此选项的语法,请查看ffmpeg-utils
手册中的(ffmpeg-utils)
“Color”一节。 颜色的默认值是“黑色”。
eval
指定何时计算宽度、高度、x和y
表达式。 它接受以下值:
‘init’
仅在滤镜初始化期间或处理命令时计算表达式一次。
‘frame’
计算每个传入帧的表达式。
默认值为“init
”。
aspect
填充到纵横比而不是分辨率。
宽度、高度、x和y选项的值是包含下列常量的表达式:
in_w
in_h
输入视频的宽度和高度。
iw
ih
和in_w,in_h
一样。
out_w
out_h
由宽度和高度
表达式指定的输出宽度和高度
(填充区域的大小)。
ow
oh
和out_w
,out_h
一样。
x
y
由x和y
表达式指定的x和y
偏移量,如果未指定,则为NAN
。
a
与iw / ih
相同
sar
input sample aspect ratio
dar
输入显示纵横比,它与(iw / ih) * sar
相同
hsub
vsub
水平和垂直色度子采样值。例如,对于像素格式“YUV 422 p
”, hsub是2
,vsub是1
。
滤镜filtering
在编码之前,ffmpeg
可以使用libavfilter
库中的滤镜处理原始音频和视频帧。几个链式滤镜形成一个滤镜集。ffmpeg
区分了两种类型的滤镜:简单的和复杂的。
简单滤镜Simple filtergraphs
简单的滤镜是那些仅有一个输入和输出的,两者都是相同类型的。它们可以简单地在解码和编码之间插入额外的步骤:
_________ ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|
简单的滤镜被配置为每流过滤器选项(分别用于视频和音频的-vf
和-af
别名)。例如,一个简单的视频滤镜图可以如下所示:
_______ _____________ _______ ________
| | | | | | | |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______| |_____________| |_______| |________|
复杂滤镜Complex filtergraphs
复杂滤镜是不能简单描述为一个应用于一个流的线性处理链的图。例如,当图形有多个输入和/或输出时,或者当输出流类型与输入不同时,就会出现这种情况。它们可以用以下图表表示:
_________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|
复杂滤镜配置为-filter_complex
选项。请注意,此选项是全局的,因为复杂的Filtergram本质上不能明确地与单个流或文件相关联。-lavfi
选项等价于-filter_complex
。复杂过滤器的一个简单例子是覆盖过滤器,它有两个视频输入和一个视频输出,其中一个视频覆盖在另一个视频上。它的音频对应是amix
滤镜。
-filter_complex filtergraph (global)
定义复杂的滤镜,即具有任意数量的输入和/或输出。对于简单滤镜,具有一个输入和一个输出,类型相同-请参阅-filter
选项。
输入链接标签必须使用[file_index:stream_specifier]
语法(即,与-map
使用相同)来引用输入流。如果stream_specifier
匹配多个流,则将使用第一个流。未标记的输入将连接到匹配类型的第一个未使用的输入流。
输出链接标签使用-map
引用.未标记的输出被添加到第一个输出文件中。请注意,使用此选项,可以只使用lavfi
源,而不需要正常的输入文件。
例如,要在视频上覆盖图像
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map'[out]' out.mkv
这里[0:v]
指的是第一输入文件中的第一视频流,其链接到overlay滤镜的第一(主)输入。类似地,第二输入中的第一视频流链接到overlay
滤镜的第二输入。
假设每个输入文件中只有一个视频流,我们可以省略输入标签,因此上面的内容相当于
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map'[out]' out.mkv
此外,我们可以省略输出标签,滤镜的单个输出将自动添加到输出文件中,因此我们可以简单地写成:
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv
使用lavfi
颜色源生成5秒纯红色视频:
ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
覆盖 overlay
将一个视频叠加在另一个视频上。它需要两个输入,并有一个输出。第一个输入主视频,第2个视频是覆盖物。、
它接受以下参数,所接受选项的描述如下:
x
y
在主视频上设置覆盖视频的x和y坐标。对于这两个表达式,默认值为“0”
。如果表达式无效,则将其设置为一个巨大的值(意味着覆盖将不会显示在输出视频的可见区域内)。
format
设置输出视频的格式。它接受以下值:
yuv420
force YUV420 output
yuv422
force YUV422 output
yuv444
force YUV444 output
rgb
force packed RGB output
gbrp
force planar RGB output
auto
automatically pick format
Default value is yuv420
.
The x, and y expressions can contain the following parameters:
main_w, W
main_h, H
主输入宽度和高度。
overlay_w, w
overlay_h, h
覆盖输入的宽度和高度。
举例:
在主视频右下角的10个像素处绘制覆盖:
overlay=main_w-overlay_w-10:main_h-overlay_h-10
使用命名选项,上面的示例如下:
overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10
在输入的左下角插入一个透明的png logo,使用ffmpeg工具的-filter_Complex选项:
ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output
使用ffmpeg工具插入2个不同的透明PNG logo(第2个logo在右下角):
ffmpeg -i input -i logo1 -i logo2 -filter_complex 'overlay=x=10:y=H-h-10,overlay=x=W-w-10:y=H-h-10' output
overlay跑马灯效果
从时间2开始,从屏幕的左侧到右顶部开始显示跑马灯效果覆盖:
overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0
缩放 scale
使用libswscale
库缩放(调整大小)输入视频。scale
滤镜通过改变输出采样宽高比,迫使输出显示宽高比与输入相同。如果输入图像格式不同于下一个滤镜所请求的格式,则scale
滤镜将输入转换为所请求的格式。
该滤镜接受以下选项,或libswscale scaler支持的任何选项。有关scaler选项的完整列表,请参见(FFmpeg-scaler)FFmpeg-scaler手册。
width, w
height, h
设置输出视频尺寸表达式。默认值是输入的尺寸。
w和h选项的值是包含以下常量的表达式:
in_w in_h
输入的宽高
iw ih a
输入的宽高
out_w out_h ow oh
指定输出的缩放后的宽高
sar
输入样本高宽比
dar
输入显示高宽比。根据(iw/ih)*sar
计算。
hsub vsub
水平和垂直输入色度子采样值。例如,对于像素格式"yuv422p"
hsub
为2,vsub
为1。
ohsub ovsub
水平和垂直输出色度子采样值。例如,对于像素格式"yuv422p"
hsub
为2,vsub
为1。
举例:
将输入视频缩放至200x100的大小
scale=w=200:h=100
这相当于:
scale=200:100
或者:
scale=200x100
指定输出大小的大小缩写:
scale=qcif
QCIF是常用的标准化图像格式,意为四分之一公共中间格式(Quarter Common Intermediate Format)。在H.323协议簇中,规定了视频采集设备的标准采集分辨率。CIF = 352×288
像素,规定了视频采集设备的标准采集分辨率。QCIF = 176×144
像素
其也可以写成:
scale=size=qcif
将输入扩大到2倍:
scale=w=2*iw:h=2*ih
如同下面:
scale=2*in_w:2*in_h
按强制隔行缩放比例缩放输入到2X:
scale=2*iw:2*ih:interl=1
将输入缩放到一半大小:
scale=w=iw/2:h=ih/2
增加宽度,并将高度设置为相同大小:
scale=3/2*iw:ow
Seek Greek harmony:
scale=iw:1/PHI*iw
scale=ih*PHI:ih
增加高度,并将宽度设置为高度的3/2:
scale=w=3/2*oh:h=3/5*ih
增大尺寸,使其尺寸成为色度子采样值的倍数:
scale="trunc(3/2*iw/hsub)*hsub:trunc(3/2*ih/vsub)*vsub"
将宽度增加到最大500像素,保持与输入相同的宽高比:
scale=w='min(500\, iw*3/2):h=-1'
通过合并scale和setsar制作像素正方形:
scale='trunc(ih*dar):ih',setsar=1/1
通过合并scale和setsar制作像素正方形,确保得到的分辨率均匀(某些编解码器需要):
scale='trunc(ih*dar/2)*2:trunc(ih/2)*2',setsar=1/1
drawtext
使用libfreetype
库从视频顶部的指定文件中绘制文本字符串或文本。要启用此滤镜的编译,需要 --enable-libfreetype
配置ffmpeg。要启用默认字体回退和字体选项,需要使用--enable-libfontconfig
配置ffmpeg。要启用text_shaping
选项,您需要使用 --enable-libfribidi
配置ffmpeg。
它接受以下参数:
box
Used to draw a box around text using the background color.
The value must be either 1 (enable) or 0 (disable). The default value of box is 0.
用于使用背景颜色绘制围绕文本的框。该值必须为1(启用)或0(禁用)。框的默认值为0。
boxborderw
Set the width of the border to be drawn around the box using boxcolor. The default value of boxborderw is 0.
设置边框的宽度。boxborderw
的默认值为0。
boxcolor
The color to be used for drawing box around text.
For the syntax of this option, check the (ffmpeg-utils)"Color" section in the ffmpeg-utils manual.
The default value of boxcolor is "white".
用于在文本周围绘制框的颜色。对于此选项的语法,请参考FFmpeg-utils手册中的(FFmpeg-utils)“Color"部分。boxcolor的默认值为"白色
”。
line_spacing
Set the line spacing in pixels of the border to be drawn around the box using box.
The default value of line_spacing is 0.
borderw
Set the width of the border to be drawn around the text using bordercolor. The default value of borderw is 0.
设置要在文本周围绘制的边框宽度。borderw的默认值为0。
bordercolor
设置用于绘制文本周围边框的颜色。有关此选项的语法,请检查ffmpeg-utils手册中的(ffmpeg-utils)“color”部分。边框颜色的默认值是“black
”。
expansion
选择文本的展开方式。可以是none
、strftime(已弃用)或normal
(默认)。有关详细信息,请参见下面的文本扩展部分。
basetime
Set a start time for the count. Value is in microseconds. Only applied in the deprecated strftime expansion mode.
To emulate in normal expansion mode use the pts function,
supplying the start time (in seconds) as the second argument.
fix_bounds
如果为true
,检查并修复text
坐标,以避免裁剪。
fontcolor
用于绘制字体的颜色。对于此选项的语法,请检查FFmpeg-utils手册中的(FFmpeg-utils)“Color"部分。fontcolor
的默认值为"black
”。
fontcolor_expr
字符串,其展开方式与文本相同,以获得动态字体颜色值。默认情况下,此选项具有空值,且未处理。设置此选项时,它将覆盖fontcolor
选项。
font
用于绘制文本的字体系列。默认情况下没有。
fontfile
要用于绘制文本的字体文件。必须包含路径。如果fontconfig
支持被禁用,此参数是必需的。
alpha
绘制应用alpha
混合的文本。值可以是介于0.0
和1.0
之间的数字。表达式也接受相同的变量x,y
。默认值为1
。请参阅fontcolor_expr
。
fontsize
用于绘制文本的字体大小。fontsize
的默认值为16
。
text_shaping
如果设置为1,则尝试在绘制文本之前对文本进行形状改变(例如,反转右到左文本的顺序并连接阿拉伯字符)。否则,只需按给定的方式绘制文本即可。默认情况下1(如果支持)。
ft_load_flags
用于加载字体的标志。这些标志映射了libfreetype支持的相应标志,它们是以下值的组合:
default
no_scale
no_hinting
render
no_bitmap
vertical_layout
force_autohint
crop_bitmap
pedantic
ignore_global_advance_width
no_recurse
ignore_transform
monochrome
linear_design
no_autohint
默认值为"default"。有关详细信息,请查阅 FT_LOAD_* libfreetype flags.的文档。
shadowcolor
绘制文本后面的阴影的颜色。对于此选项的语法,请检查FFmpeg-utils手册中的(FFmpeg-utils)“Color"部分。shadowcolor
的默认值为"black
”。
shadowx shadowy
相对于文本的位置,文本阴影位置的x
和y
偏移。它们可以是正值,也可以是负值。两者的默认值都是“0
”。
start_number
n/frame_num
变量的起始帧编号。默认值为"0
"。
tabsize
The size in number of spaces to use for rendering the tab. Default value is 4.
timecode
以“hh:mm:ss[:;.]ff
”格式设置初始时间码表示形式。它可以与文本参数一起使用,也可以不使用文本参数。必须指定timecode_rate
选项。
timecode_rate, rate, r
Set the timecode frame rate (timecode only). Value will be rounded to nearest integer.
Minimum value is "1". Drop-frame timecode is supported for frame rates 30 & 60.
设置时间码帧率(仅时间码)。值将四舍五入到最近的整数。最小值是"1
"。
tc24hmax
If set to 1, the output of the timecode option will wrap around at 24 hours. Default is 0 (disabled).
text
要绘制的文本字符串。文本必须是UTF-8
编码字符的序列。如果没有使用参数textfile
指定文件,则此参数是必需的。
textfile
包含要绘制文本的文本文件。文本必须是utf-8
编码字符的序列.如果参数text
没有指定文本字符串,则此参数是必须的。如果同时指定了text
和textfile
,则会引发错误。
reload
如果设置为1
,textfile
将在每个帧之前重新加载。确保原子地更新它,否则它可能被部分读取,甚至失败。
x y
指定将在视频帧中绘制文本的偏移量的表达式。它们相对于输出图像的上/左
边界。x
和y
的默认值为“0
”。有关接受的常量和函数的列表,请参见下面。x
和y
的参数是包含下列常量和函数的表达式:
dar
输入显示宽高比,与(w/h)*sar
相同。
sar
输入样本宽高比。
hsub vsub
水平和垂直色度子样本值。例如,对于像素格式“yuv422p
”,hsub
为2,vsub
为1。
line_h, lh
每一行文字的高度。
main_h, h, H
输入高度
main_w, w, W
输入宽度
n
输入的帧数,从0
开始
rand(min, max)
返回包含在最小值和最大值之间的随机数
t
timestamp expressed in seconds, NAN if the input timestamp is unknown
时间戳以秒表示,如果输入时间戳为unknown
,则表示为NAN
,not a number
text_h, th
文本的高度
text_w, tw
文本的宽度。
x y
绘制文本的x
和y
偏移坐标。这些参数允许x
和y
表达式相互引用,因此您可以指定y=x/dar
。
pict_type
当前帧的图片类型的一个字符描述。
pkt_pos
当前数据包packet
在输入文件或流中的位置(以字节为单位,从输入的开始)。值为-1
表示此信息不可用。
pkt_duration
当前数据包packet的持续时间,以秒为单位。
packet概念参考ffmpeg入门教程中编解码相关文章https://www.jianshu.com/p/042c7847bd8a
pkt_size
当前数据包 packet的大小(以字节为单位)。
drawtext举例
用字体FreeSerif绘制“Test Text”,使用可选参数的默认值。
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text'"
在位置x=100和y=50(从屏幕左上角开始计数)时,用FreeSerif 字体绘制“Test Text”,文本为黄色,周围有红色框。文本和框的不透明度均为20%。
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text':\
x=100: y=50: fontsize=24: fontcolor=yellow@0.2: box=1: boxcolor=red@0.2"
请注意,如果参数列表中不使用空格,则不需要双引号。在视频帧的中心显示文本:
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2"
在随机位置显示文本,每隔30秒切换到新位置:
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(t\,30)\,0)\,
rand(0\,(w-text_w))\,x):y=if(eq(mod(t\,30)\,0)\,rand(0\,(h-text_h))\,y)"
在视频帧的最后一行中显示从右向左滑动的文本行,
drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t"
从视频帧底部显示文件CREDITS 的内容并向上滚动。
drawtext="fontsize=20:fontfile=FreeSerif.ttf:textfile=CREDITS:y=h-20*t"
在输入视频的中心绘制一个绿色字母"g"。将文字基线放置在屏幕高度的一半。
drawtext="fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent"
每3秒显示文本1秒:
drawtext="fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:enable=lt(mod(t\,3)\,1):text='blink'"
使用fontconfig设置字体。请注意,冒号需要转义。
drawtext='fontfile=Linux Libertine O-40\:style=Semibold:text=FFmpeg'
打印实时编码的日期(参见strftime(3)):
drawtext='fontfile=FreeSans.ttf:text=%{localtime\:%a %b %d %Y}'
文本淡入淡出(出现/消失):
#!/bin/sh
DS=1.0 # display start
DE=10.0 # display end
FID=1.5 # fade in duration
FOD=5 # fade out duration
ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%
{eif\\\\: clip(255*(1*between(t\\, $DS + $FID\\, $DE - $FOD) + ((t - $DS)/$FID)*between(t\\, $DS\\, $DS + $FID)
+ (-(t - $DE)/$FOD)*between(t\\, $DE - $FOD\\, $DE) )\\, 0\\, 255) \\\\: x\\\\: 2 }"
水平对齐多个单独的文本。请注意,max_glyph_a和字体大小值包含在y偏移量中。
drawtext=fontfile=FreeSans.ttf:text=DOG:fontsize=24:x=10:y=20+24-max_glyph_a,
drawtext=fontfile=FreeSans.ttf:text=cow:fontsize=24:x=80:y=20+24-max_glyph_a
setdar, setsar
setdar
滤镜设置滤镜输出视频的显示纵横比。 这是通过根据以下等式改变指定的样本(又名像素)纵横比
来实现的:
DAR = HORIZONTAL_RESOLUTION / VERTICAL_RESOLUTION * SAR
请记住,setdar
滤镜不会修改视频帧的像素尺寸
。此外,由该滤镜设置的显示纵横比
可以被滤镜链中的后续滤镜改变,例如在缩放
的情况下或者如果应用了另一个“setdar”或“setsar”
滤镜。 setsar
滤镜设置滤镜输出视频的样本(即像素)纵横比
。 注意,作为应用该滤镜的结果,输出显示纵横比
将根据上面的等式而改变。 请记住,setsar
滤镜设置的样本纵横比
可能会被滤镜链中的后续滤镜更改,例如,如果应用了另一个“setsar
”或“setdar
”滤镜。 它接受以下参数:
r, ratio, dar (setdar only), sar (setsar only)
该参数可以是浮点数字符串、表达式或num:den
形式的字符串,其中num
和den
是纵横比的分子和分母。如果未指定参数,则假定值为“0
”。在使用“num:den
”形式的情况下,应该对:字符进行转义
。
max
设置最大整数值,用于在将表示的纵横比减少到有理数
时表示分子和分母。默认值为100
。
参数sar
是包含以下常数的表达式:
E, PI, PHI
这些是数学常数e
(欧拉数)、pi
(希腊圆周率)和phi
(黄金比例)的近似值。
w, h
输入宽度和高度
a
和w / h
一样。
sar
输入样本纵横比。
dar
输入显示纵横比。与(w / h) * sar
相同。
hsub, vsub
水平和垂直色度子采样值。例如,对于像素格式“YUV 422 p
”, hsub
为2,vsub
为1。
concat
连接音频和视频流,将它们一个接一个地连接在一起。
滤镜处理同步视频和音频流的片段。所有片段必须具有相同数量
的每种类型的流,这也是输出的流的数量。
该滤镜接受以下选项:
n
设置分段数。默认值为2
。
v
设置输出视频流的数量,也就是每个片段中视频流的数量。默认值为1
。
a
设置输出音频流的数量,也就是每个片段中音频流的数量。默认值为0
。
unsafe
激活不安全模式:如果段具有不同的格式,不要失败。
滤镜有v+a
输出:首先是v
视频输出,然后是a
音频输出。
如果有nx(v+a)
个输入:首先是第一段的输入,顺序与输出相同,然后是第二段的输入,依此类推。
由于包括编解码器帧大小或草率创作在内的各种原因,相关流并不总是具有完全相同的duration
。出于这个原因,相关的同步流(例如,视频及其音频轨道)应该立即连接。concat
滤镜将使用每个片段中最长流的duration
(最后一个片段除外),并且如果需要,用静音
填充较短的音频流。
为使该滤镜正常工作,所有数据段必须从时间戳0
开始。
所有相应的流在所有段中必须具有相同
的参数;滤镜将自动为视频流选择通用像素格式
,并为音频流选择通用采样格式、采样速率和通道布局
,但其他设置(如分辨率
)必须由用户明确转换。
不同的帧速率是可接受的,但是会导致输出可变帧速率;确保配置输出文件来处理它。
示例:
连接一个开头、一集和一个结尾,都是双语版本(流0中的视频,流1和2中的音频):
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \
'[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
concat=n=3:v=1:a=2 [v] [a1] [a2]' \
-map '[v]' -map '[a1]' -map '[a2]' output.mkv
连接两个部分,分别处理音频和视频,使用(a)
影片源,并调整分辨率:
movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ;
movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ;
[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]
请注意,如果音频和视频流在第一个文件中的duration
不完全相同,将会在拼接处发生去同步。
-r[:stream_specifier] fps (input/output,per-stream)
设置帧速率(Hz值、分数或缩写)。
作为输入选项,忽略文件中存储的任何时间戳,而是假设恒定帧速率fps
来生成时间戳。这与用于某些输入格式(如image2
或v4l2
)的-framerate
选项不同(在早期版本的FFmpeg中它是相同的)。如果有疑问,使用-framerate
代替输入选项-r
。
作为输出选项,复制或丢弃输入帧以实现恒定的输出帧速率fps
。
-vcodec codec (output)
设置视频编解码器。这是 -codec:v
的别名。
-preset type
配置预设。根据图像的一般类型进行一些自动设置。
none
不使用预设。
default
使用默认编码器。
picture
数码照片,如肖像,内景
photo
自然光线下的户外照片
drawing
手绘或线描,具有高对比度细节
icon
小尺寸彩色图像
text
Text-like
crop
将输入视频裁剪到给定的尺寸。 它接受以下参数:
w, out_w
输出视频的宽度。默认为iw
。该表达式仅在过滤器配置期间或发送“w
”或“out_w
”命令时计算一次。
h, out_h
输出视频的高度。默认为ih
。该表达式仅在滤波器配置期间或发送“h
”或“out_h
”命令时计算一次。
x
输出视频左边缘在输入视频中的水平位置。默认为(in_w-out_w)/2
。这个表达式是逐帧计算的。
y
输出视频顶部边缘在输入视频中的垂直位置。默认为(in_h-out_h)/2
。这个表达式是逐帧计算的。
keep_aspect
如果设置为1
,将通过更改输出样本纵横比强制输出显示纵横比与输入相同。默认为0
。
exact
启用精确裁剪。如果启用,二次抽样视频将按照指定的宽度/高度/x/y进行裁剪,并且不会四舍五入到最近的较小值。默认为0。
out_w
、out_h
、x
、y
参数是包含以下常数的表达式:
x
y
x和y的计算值。对每个新帧进行计算。
in_w
in_h
输入宽度和高度。
iw
ih
和in_w,in_h一样。
out_w
out_h
输出(裁剪后)的宽度和高度。
ow
oh
和out_w
,out_h
一样
a
与iw / ih
相同
sar
input sample aspect ratio
输入样本纵横比
dar
input display aspect ratio, it is the same as (iw / ih) * sar
输入显示纵横比,它与(iw / ih) * sar
相同
hsub
vsub
水平和垂直色度子采样值。例如,对于像素格式“YUV 422 p
”, hsub
是2
,vsub
是1
。
n
输入帧的编号,从0
开始。
pos
输入帧在文件中的位置,如果未知,则为NAN
t
以秒表示的时间戳。如果输入时间戳未知,则为NAN。
out_w
的表达式可能取决于out_h
的值,out_h
的表达式可能取决于out_w
,但它们不能取决于x
和y
,因为x
和y
是在out_w
和out_h
之后计算的。
x
和y
参数指定输出(非裁剪)区域左上角位置的表达式。对每一帧进行计算。如果评估值无效,则近似为最接近的有效值。 x
的表达式可能依赖于y
,y
的表达式可能依赖于x
。
举例
在位置(12,34)裁剪尺寸为100x100的区域。
crop=100:100:12:34
使用命名选项,上面的示例变成:
crop=w=100:h=100:x=12:y=34
以100x100的尺寸裁剪中央输入区域:
crop=100:100
将中央输入区域裁剪为输入视频的2/3大小:
crop=2/3*in_w:2/3*in_h
裁剪输入视频中心方块:
crop=out_w=in_h
crop=in_h
将矩形的左上角放置在位置100:100,右下角对应于输入图像的右下角。
crop=in_w-100:in_h-100:100:100
从左右边框裁剪10个像素,从上下边框裁剪20个像素
crop=in_w-2*10:in_h-2*20
仅保留输入图像的右下四分之一:
crop=in_w/2:in_h/2:in_w/2:in_h/2
Crop height for getting Greek harmony:
crop=in_w:1/PHI*in_w
Apply trembling effect:
crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):
(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)
根据时间戳应用不稳定的相机效果:
crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(t*10):
(in_h-out_h)/2 +((in_h-out_h)/2)*sin(t*13)"
根据y的值设置x:
crop=in_w/2:in_h/2:y:10+10*sin(n/10)
force_original_aspect_ratio
如果需要保持原始的宽高比,可以减小或增加输出视频的宽度或高度。取值如下:
‘disable’
按指定比例缩放视频,并禁用此功能。
‘decrease’
如果需要,输出视频尺寸会自动减小
。
‘increase’
如果需要,输出视频尺寸会自动增加
。
此选项的一个有用实例是,当您知道特定设备的最大允许分辨率时,您可以使用此选项将输出视频限制为该分辨率,同时保持纵横比。比如设备A允许1280x720
播放,你的视频是1920x800
。使用此选项(将其设置为decrease
)并在命令行中指定1280x720
,将产生1280x533
的输出。 请注意,这与为w或h指定-1是不同的,您仍然需要指定输出分辨率以使该选项工作。
amerge
将两个或多个音频流合并成一个多声道流。
接受以下选项:
inputs
设置输入数量。默认值为2
。
如果输入的通道布局是不相交的,因此是兼容的,则输出的通道布局将被相应地设置,并且通道将根据需要被重新排序。如果输入的通道布局不是不相交的,则输出将具有第一个输入的所有通道,然后是第二个输入的所有通道,按此顺序,输出的通道布局将是与通道总数相对应的默认值。
例如,如果第一个输入在2.1
中(FL+FR+LF
),第二个输入是FC+BL+BR
,则输出将在5.1
中,通道按以下顺序排列:a1、a2、b1、a3、b2、b3
(a1是第一个输入的第一个通道,b1是第二个输入的第一个通道)。
另一方面,如果两个输入都是立体声,输出通道将按默认顺序排列:a1、a2、b1、b2
,通道布局将任意设置为4.0
,可能是也可能不是预期值。
所有输入必须具有相同的采样速率和格式。
如果输入没有相同的duration
,输出将以最短的duration
停止。
举例:
将两个单声道文件合并成一个立体声流:
amovie=left.wav [l] ; amovie=right.mp3 [r] ; [l] [r] amerge
Multiple merges assuming 1 video stream and 6 audio streams in input.mkv:
ffmpeg -i input.mkv -filter_complex "[0:1][0:2][0:3][0:4][0:5][0:6] amerge=inputs=6"
-c:a pcm_s16le output.mkv
amix
将多个音频输入混合成一个输出。
请注意,此滤镜仅支持 float
samples(amerge
和pan
音频滤镜支持多种格式)。如果amix
输入有整数samples ,那么将自动插入一个样本来执行float
样本的转换。
举例:
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex
amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
将3个输入音频流混合成一个输出,持续时间与第一个输入相同,丢失转换时间为3
秒。
它接受以下参数:
inputs
输入的数量。如果未指定,则默认为2。
duration
如何确定流的duration
longest
最长输入的duration。(默认)
shortest
最短输入的duration
first
第一输入的duration。
dropout_transition
当输入流结束时,volume renormalization 的过渡时间(秒)。默认值为2
秒。
weights
按顺序指定每个输入音频流的权重。每一个权重都用空格隔开。默认情况下,所有输入都具有相同的权重。
normalize
始终缩放输入,而不是只对samples求和。如果禁用此选项,在此滤镜过滤之前或之后输入未被标准化,请小心heavy clipping。默认情况下是启用的。
-preset
该选项列举了从非常快(最佳速度)到非常慢(最佳质量)的一系列选择。
‘veryfast’
‘faster’
‘fast’
‘medium’
‘slow’
‘slower’
‘veryslow’
-crf
为恒定质量(无比特率目标)和受限质量(有最大比特率目标)模式设置质量/大小权衡。有效范围是0
到63
,数字越大表示质量越低,输出越小。仅在设置时使用;默认情况下,仅使用比特率目标。
H264
-profile
‘unknown’
‘baseline’
‘main’
‘high’
movie
从视频容器中读取音频和/或视频流。 它接受以下参数:
seek_point, sp
以秒
为单位指定seek点。帧将从该seek点开始输出。该参数是用av_strtod
计算的,因此该数值可能以is后缀作为后缀。默认值为“0
”。
从. avi中的AVI文件开始处跳过3.2秒
,将其覆盖在标签为“in”的输入之上:
movie=in.avi:seek_point=3.2, scale=180:-1, setpts=PTS-STARTPTS [over];
[in] setpts=PTS-STARTPTS [main];
[main][over] overlay=16:16 [out]
本文将持续更新,敬请关注
欢迎联系、指正、批评
Github:https://github.com/AnJiaoDe
CSDN:https://blog.csdn.net/confusing_awakening
OpenCV入门教程:https://blog.csdn.net/confusing_awakening/article/details/113372425
ffmpeg入门教程:https://blog.csdn.net/confusing_awakening/article/details/102007792