FFmpeg 入门

2021-06-27 21:25:27 浏览数 (1)

本文主要参考 ffmpeg 官方文档 和 ffmpeg basics

FFmpeg 简介

FFmpeg命令行工具

命令行工具

语法

说明

ffmpeg

ffmpeg [global_options] {[input_file_options] -i INPUT_FILE} ... {[output_file_options] OUTPUT_FILE}...

快速音频和视频编码器/解码器

ffplay

ffplay [options] [input_file] options: 几乎所有可用于 ffmpeg 的选项适用于ffplay; input_file: 输入可以是文件/管道/网络流/设备

媒体播放器

ffprobe

ffprobe [options] [input_file] options: 几乎所有可用于 ffmpeg 的选项适用于ffplay; input_file: 输入可以是文件/管道/网络流/设备; 其他附加选项: -bitexact; -count_frames; -count_packets 等,具体用 ffprobe -h 看

显示媒体文件的信息

ffserver

ffserver [options] 支持-f configfile 设置配置,默认为 /etc/ffserver.conf

使用HTTP和RTSP协议进行多媒体流的广播服务器

  • ffplay 播放的时候还有一些快捷键操作,比如快进 ->
  • ffplay -showmode 默认是 video, 还可以选 rdft(逆实数离散傅立叶变换)和waves(来自滤波器显示波的音频波
代码语言:txt复制
ffplay -f lavfi -i testsrc -vf pad='400:300:(ow-iw)/2:(oh-ih)/2:orange'

FFmpeg软件库

软件库

说明

libavcodec

用于解码和编码多媒体的编解码器库

libavdevice

是一个特殊的设备复用/解复用库,是libavformat库的补充

libavfilter

过滤器库,它为FFmpeg和客户端库或应用程序提供媒体过滤层

libavformat

音频/视频容器格式的解复用和复用的库

libavutil

用于FFmpeg的不同部分的例程的辅助库, 如转义,计算音频通道等

libpostproc

用于后期处理的软件库

libswresample

用于音频重采样的软件库

libswscale

视频图像缩放的库

  • FFmpeg库被纳入Chrome,以支持HTML5音频和视频元素。 其他使用FFmpeg的浏览器还包括Chromium和Orygin网络浏览器

常见 ffmepg 中的名词/缩写

  • d/e/a/v/s: decoder【解码器】/encoder【编码器】/audio【音频】/video【视频】/subtitle【字幕】
  • dar/sar/par: 图像和视频的纵横比/ 图像或视频帧的长宽比,取决于视频源 / 像素宽度与其高度之比, 一般是 1:1, DAR = PAR x SAR
  • iw/ow/ih/oh: input/ouput width/height
  • 【todo 添加更多,持续更新】

ffmpeg 命令

代码语言:txt复制
ffmpeg [global_options] {[input_file_options] -i INPUT_FILE} ... {[output_file_options] OUTPUT_FILE}...

// 比如: 
ffmpeg [参数1]global_options [参数2]input_file_options -i [参数3]INPUT_FILE [参数4]output_file_options [参数5]OUTPUT_FILE
  • 调试请参考这里, 比如使用 -debug, -fdebug, -debug_ts, 设置 -loglevel

命令的一些说明

  • ffmpeg 是一个非常快的视频/音频转换器,也可以抓取音频/视频源,并在任意采样率、尺寸之间调整视频,以及提供多种高品质的过滤 filter 系统。
  • ffmpeg 从任意数量/形式的输入文件中进行读取(可以是普通文件,管道,网络流,设备源等等),通过输入文件选项对输入文件进行设定,通过 -i 进行标记,并写入到任意数量/形式的输出文件中,任何在命令行中不能被解释为选项的字符串信息(当然也不是被-i指定为输入文件的信息)都被作为一个输出文件
  • 原则上每个输入或输出文件都可包含数量不同的数据流(视频/音频/字幕/附件/数据….),具体文件中包含的数量和/或数据类型是文件的容器格式限定的,具体选择那些流从输入文件到输出文件则可能是自动或者依据 -map 选项来指定,【学会使用 stream specifiler 对于学习 ffmpeg 命令很重要】。
  • 作为一般规则,选项用于指定紧接着的文件,因此命令中顺序很重要,你可以在命令中多次重复相同的选项,每次都可以应用于紧接着的下一个输入或者输出文件。例外的是全局选项(例如过程信息输出详细程度的选项),这些选项必须首先进行指定,会全局使用。
  • 为了明确指定输入文件,你必须采用从 0 开始的数字索引法,即第1个输入文件由0索引,第2个则是1。同样的,在一个文件中指定数据流也是通过同样规则的索引法,即2:3表示第3个输入文件的第4个数据流。
  • ffmpeg 调用 libavformat 库(包含 demuxer)读取输入文件,分离出各类编码的数据包(流),当有多个输入文件时,ffmpeg 试图跟踪最低时间戳实现任意输入流同步。编码数据包(除非是指定为流式拷贝,相关内容请参考特性描述对流式拷贝的说明)通过解码器解码出非压缩的数据帧(raw视频/PCM格式音频…),这些数据帧可以被滤镜进一步处理。经过滤镜处理的数据被重新编码为新的数据包(流),然后经过混合器混合(例如按一定顺序和比例把音频数据包和视频数据包交叉组合),写入到输出文件,具体处理流程见下面的图。
  • ffmpeg 的 help 输出比较复杂,某些字母的存在意味着该选项适用于编码(E)、解码(D)、视频(V)、音频(A)或字幕(S)
  • 可以在 FFmpeg 中使用的 SI 前缀:指的是再 ffmepg 里面制定数字可以使用这样的形式: 1500000 => 1500K => 1.5M => 0.0015G
  • 在FFmpeg的命令中可以使用大量的变量,不同的命令可以使用的变量不同,比如 filter crop 里面的 x, y 位置:x的默认值为(iw - ow)/2, y的默认值为(ih - oh)/2,除了 iw,ih ,ow, oh 还可以使用变量: a, sal 等
代码语言:txt复制
 _______              ______________
|       |            |              |
| input |  demuxer   | encoded data |   decoder
| file  | ---------> | packets      | ----- 
|_______|            |______________|      |
                                           v
                                       _________
                                      |         |
                                      | decoded |
                                      | frames  |
                                      |_________|
 ________             ______________       |
|        |           |              |      |
| output | <-------- | encoded data | <---- 
| file   |   muxer   | packets      |   encoder
|________|           |______________|

显示输出预览

  • FFplay媒体播放器预览: ffplay -i input_file ... test_options
  • 使用SDL输出设备预览: ffmpeg -f lavfi -i rgbtestsrc -pix_fmt yuv420p -f sdl Example

Filters, filterchains,filtergraphs

  • 在多媒体处理中,术语过滤器是指在编码到输出之前修改输入的软件工具。过滤器分为音频和视频过滤器。FFmpeg内置了许多多媒体过滤器,可以通过多种方式组合它们。FFmpeg的过滤API(应用程序编程接口)是 libavfilter 软件库,它允许过滤器有多个输入和输出。过滤器包括在输入和输出之间使用 -vf 选项的视频过滤器-af 选项音频过滤器
代码语言:txt复制
# 顺时针旋转 90°:使用转置过滤器
ffplay -f lavfi -i testsrc -vf transpose=1

# 使用atempo音频过滤器将输入音频的速度降低到80%:
ffmpeg -i input.mp3 -af atempo=0.8 output.mp3
  • 在编码前,ffmpeg可以对raw(真实/原)音频和视频使用libavfilter库中的滤镜进行处理。在ffmpeg看来只有2种滤镜:简单过滤器,复合过滤器.
    • 简单滤镜filter filtergraph就是只有1个输入和输出的滤镜,滤镜两边的数据都是同一类型的,可以理解为在非压缩数据帧到再次编码前简单附加了一步
    • 复合滤镜-filter_complex filtergraph是那些不能简单描述为一个线性处理过程应用到一个流的情况,例如当过程中有多个输入和/或输出,或者输出流类型不同于输入时.
    • 复合过滤器通常使用 -lavfi 或者 -filter_complex, 两者是等价的. 【这里有个容易混淆的 fflay -f lavfi 给 virtual device 提供输入】
    • filter_complex 有一些规则:
      • input 用 [file_index:stream_specifier] 表示 label, 可以在 -map 中引用;如果 stream_specifier 匹配多个 stream,使用第一个
      • 没有 label 的input 会自动使用第一个没有被使用的 stream; 如果输出没有 label 会自动输出到第一个 output
      • 详细的语法参考这里
代码语言:txt复制
 _________                        ______________
|         |                      |              |
| decoded |                      | encoded data |
| frames  |                   _ | packets      |
|_________|                   /||______________|
                   __________   /
  simple     _||          | /  encoder
  filtergraph   | filtered |/
                | frames   |
                |__________|
                
 _________
|         |
| input 0 |                    __________
|_________|                   |          |
                _________    /| output 0 |
               |         |  / |__________|
 _________     | complex | /
|         |     |         |/
| input 1 |---->| filter  |
|_________|     |         |    __________
               /| graph   |   |          |
              / |         |   | output 1 |
 _________   /  |_________|    |__________|
|         | /
| input 2 |/
|_________|
  • 过滤器通常用于 filterchains(逗号分隔的过滤器序列) 和 filtergraphs(分号分隔的filterchains序列)。在filtergraphs中,可以使用表示所选filterchain输出的链接标签,并可以在以下的filtergraphs中使用。例如,我们希望将输入视频与hqdn3d过滤器输出的输出进行比较。如果没有filtergraphs,我们必须至少使用两个命令,例如:
代码语言:txt复制
# -vf <=> -filter:v
ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw output.mp4
ffmpeg -i output.mp4 -i input.mpg -filter_complex overlay=w compare.mp4

使用带有链接标签的filtergraph,就只有一个命令:

代码语言:txt复制
# 分割过滤器将输入分为2个输出标签[a]和[b],然后将[a]链接用作第二个filterchain的输入,它为标记[a]的比较创建了一个pad。[b]链接被用作第三个filterchain的输入,它创建一个标记为[b]的输出。最后一个filterchain使用[A]和[B]标签作为覆盖过滤器的输入,从而产生最终的比较。
ffplay -i i.mpg -vf 'split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w'

下图是另一个例子: ffplay -f lavfi -i rgbtestsrc -vf "split[a][b];[a]pad=2*iw[1];[b]vflip[2];[1][2]overlay=w"

选择媒体流

  • 默认情况下,ffmpeg把输入文件每种类型(视频、音频和字幕)仅仅采用一个流转换输出到输出文件中,就是把最好效果的流进行输出:对于视频就是质量最高的流,对于音频就是包含最多声道的,对于字幕则是第一个字幕轨道,如果有多个同型同率(同样类型,码率相同)则选用索引号最小的流。可以禁用默认设置,而采用-vn/-an/-sn/-dn 选项进行专门的指定排除,如果要进行完全的手动控制,则是以-map选项,它将禁止默认值而选用指定的配置. -map 选项的参数格式为 -map [-]input_file_id[:stream_specifier][?][,sync_file_id[:stream_specifier]] | [linklabel] (output), 举例:
    • -map 0选择所有类型的所有流。
    • -map i:v从文件中选择所有的视频流,用i (index), -map i:a选择所有的音频流,-map i:s选择所有字幕流,等等
    • 特殊选项- - -vn, -sn分别排除所有音频、视频或字幕流
  • 一般来说流的选择和流的处理无关【字幕除外】【codec 用于指定流的处理,如果没有指定,ffmepg 会选择默认的】,如果字幕 encoder 被指定了,第一个字幕流会被 include.
  • 除了特定的-map选项,流指定符还与许多其他选项一起使用:

流的形式说明符

说明符形式

描述

stream_index

选择该索引的流(编号)

stream_type[:stream_index]

stream_type为字母a(音频)、d(数据)、s(字幕)、t(附件)或v(视频);如果添加了stream_index,它将选择该类型的流并使用给定的索引,否则它将选择该类型的所有流

p:program_id[:stream_index]

如果添加了stream_index,那么使用给定的program_id在程序中选择带有stream_index的流,否则将选择该程序中的所有流

stream_id

按格式指定的ID选择流

  • -codec:a:1 ac3a:1 使用 ac3 codec, -codec: copy 或者 -codec copy 则对所有 stream 使用 codec copy
  • 为了设置音频和视频的使用-b选项的比特率,我们可以使用命令: ffmpeg -i input.mpg -b:a 128k -b:v 1500k output.mp4
代码语言:txt复制
# 下面这个命令中 out1.mkv out2.wav 将包含 A.avi, B.mp4 中最佳的 video/audio 和第一个 subtitle
#  而 out3.mov 只会有 B.mp4 中的 audio, 而且不会处理,只是 copy
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

# 下面的命令中 out1.mkv 只会有 audio/video 因为默认的字幕 encoder 是 Matroska muxer 是 text-based,但是 C.mkv 里面的的字幕是 image-based
#  所以字幕不会被选择;而 out2.mkv 只有 video/subtitle 因为 audio 被 -an 操作排除了
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv

# 下面这个命令中 overlay 需要两个输入,但是没有指定,所以自动选择 A.avi 和 C.mkv 中的 video 生成 out1.mp4, 同时 out1.mp4 会有 A,C 中最佳
#  audio, 但是不会有字幕,因为 mp4 没有默认字幕 encoder,又没主动设置。out2.srt 将选择 A,C 中第一个 text-based 字幕流
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt


# 下面的命令使用 labeled filtergraph, 这里要注意, 对于 label outv1, outv2 都要**有且仅有一次的使用**,如果没有 label 默认输出到第一个输出
#   outv1, overlay, aresample 都会输出到 out1.mp4, -an 不会抑制 filtergraphs 的输出;out2.mkv 由 automatic stream selection 决定输出
#   out3.mkv 输入内容为 hue filter 的一份输出   B.mp4 的第一个 audio
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

Lavfi虚拟设备

Lavfi通常用于显示测试模式,例如带有命令的SMPTE条:

代码语言:txt复制
ffplay -f lavfi -i smptebars
  • 这里 -f 的意思是强制输入输出格式,一般是通过后缀可以推断 其他经常使用的源是可以用命令显示的颜色源:
代码语言:txt复制
ffplay -f lavfi -i color=c=blue

颜色名称

  • 一些视频过滤器和源有一个颜色参数,需要指定需要的颜色,并且有4种颜色规范的方法(默认值为黑色):

显示帮助和功能

  • FFmpeg工具有一个很大的控制台帮助,可以完整显示或关于特定元素 - 解码器,编码器等。ffmpeg -? or ffmpeg -h; ffmpeg -h long or ffmpeg -h full; ffmpeg –? topic or ffmpeg -h topic

例如,要显示关于FLV解码器的信息,我们可以使用以下命令:

代码语言:txt复制
ffmpeg -h decoder=flv
  • 其他帮助

帮助项目

命令

可用的比特流过滤器

ffmpeg -bsfs

可用的解码器

ffmpeg -codecs

可用的编码器

ffmpeg -encoders

可用的过滤器

ffmpeg -filters

可用的格式

ffmpeg -formats

可用的音频通道布局

ffmpeg -layouts

可用的像素格式

ffmpeg -pix_fmts

可用的协议

ffmpeg -protocols

可用的音频样本格式

ffmpeg -sample_fmts

比特率/帧率/文件大小

帧率(频率)的介绍

  • 帧速率是编码成视频文件的每秒帧数(FPS或fps),人眼需要至少约15 fps来观看连续运动。 帧率也称为帧频,其单位是赫兹(Hz),LCD显示器通常具有60 Hz的频率。
  • 有两种帧速率 - 隔行(在FPS编号后表示为i)和逐行(在FPS编号后表示为p)。在电视中使用隔行帧率

常见的视频帧率

描述

24p or 23.976

从20世纪20年代开始,电影行业的标准帧速率,所有的电影都是以这个频率拍摄的。 当这些电影被采用到NTSC电视广播时,帧速率降低到24×1000/1001 = 23.976值,但是对于PAL / SECAM电视,电影的帧速率增加到25帧/秒。

25p

由于25个逐行扫描视频可轻松转换为50个隔行扫描电视场,因此电影频率为50赫兹(PAL和SECAM标准)的国家中的电影和电视的标准帧频。

30p

常见的视频帧速率,常用于数码相机和摄像机。 它可用于60赫兹(NTSC)隔行场的电视广播。

50i

PAL和SECAM电视的标准场率(隔行帧率)。

60ior 59.94

NTSC电视的标准场频率,在彩电发明之后,帧速率被降低到60 * 1000/1001 = 59.94的值,以防止色度副载波和声音载波之间的干扰。

50p/60p

HDTV(高清晰度电视)的通用帧频。

48p

提议的帧速率,目前经过测试了

72p

提议的帧速率,目前经过测试了

120p

为UHDTV(超高清晰度电视)标准化的渐进式格式,计划成为UHDTV的单一全球“双精度”帧速率(而不是使用PAL标准的100 Hz和NTSC标准的119.88 Hz)

帧率设置

  • 要设置视频帧速率,我们在输出文件之前使用-r选项,语法是: ffmpeg -i input -r fps output
  • 另一种设置帧速率的方法是使用fps过滤器,这在过滤链中尤其有用. 语法为: fps=fps=number_of_frames
  • 除了数值,设置帧率的两种方法都接受下一个预定义的文本值:

缩写

精确值

相应的FPS(相应的帧)

ntsc-film

24000/1001

23.97

film

24/1

24

pal, qpal, spal

25/1

25

ntsc, qntsc, sntsc

30000/1001

29.97

代码语言:txt复制
# 改变视频的帧率。avi文件从25到30 fps
ffmpeg -i input.avi -r 30 output.mp4

# 要更改剪辑的输入帧速率。mpg文件到值25
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm

# 设置帧速率为29.97 fps
ffmpeg -i input.avi -r ntsc output.mpg

比特率

比特率是决定整体音频或视频质量的参数。 它规定了每时间单位处理的位数,在FFmpeg中,比特率以每秒位数表示。

  • 比特率决定了存储1秒编码流的位数,它使用-b选项设置, -b【encoding,audio/video】, -ba 【encoding,audio】, -bt 【encoding,video】
  • 比特率的类型:

类型

缩写

描述

平均比特率

ABR

平均每秒处理的位数,该值也用于VBR编码,需要时是输出的某个文件大小

恒定比特率

CBR

每秒处理的比特数是恒定的,这对于存储是不实际的,因为具有快速运动的部分需要比静态比特更多的比特,CBR主要用于多媒体流

可变比特率

VBR

每秒处理的比特数是可变的,复杂的场景或声音被编码更多的数据并与CBR进行比较,相同尺寸的文件的VBR质量比CBR更好(VBR编码比CBR需要更多的时间和CPU功率 ,但最近的媒体播放器可以充分解码VBR。)相关option: -qmax -qmin

  • 可以设置输出文件大小为一个值,自动计算比特率: ffmpeg -i input.avi -fs 10MB output.mp4
  • 根据比特率大概可以算出文件大小(不包括muxing开销和文件元数据等): file_size = (video_bitrate audio_bitrate) * time_in_seconds / 8

调整和伸缩视频

调整视频

  • 输出视频的宽度和高度可以在输出文件名之前设置 -s 选项【等价于在 最后加了一个 filter scale】。视频分辨率以WxH格式输入,其中w为像素宽度,h为像素高度
  • -s 如果设置在输入之前,= video_size
  • 视频帧大小也有一些预设值,比如 vga == 640x480, hd720=1280x720, sxga=1280x1024, hd1080=1920x1080
  • 视频通常被调整为比来源更小的分辨率,这被称为下采样。在较小的尺寸中,一些细节将会丢失,这一事实解释了奈奎斯特-Shannon采样定理:为了完全重构采样信号,我们必须使用比信源频率高至少2倍的频率。 这意味着要将小细节保留在缩小的视频中,它们的原始尺寸必须高于缩放比例除以2。
  • 另一个相关的命令为 -aspect 调整横纵比
代码语言:txt复制
# 下面两个命令等价
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi
代码语言:txt复制
#例如,800x600(SVGA)分辨率的视频包含2像素宽的细节。 当缩放到640x480(VGA)分辨率时,缩放比率为0.8,并且2像素再缩放为2像素:
640 pixels / 800 pixels = 0.8
2 pixels * 0.8 = 1.6 ≈ 2 pixels
# 但是当这个视频被缩放到160x120 (QQVGA)分辨率时,细节就丢失了:
160 pixels / 800 pixels = 0.2
2 pixels * 0.2 = 0.4 ≈ 0 pixels

扩大滤波器

  • 将视频调整为更大的帧大小比较少见, 用于平滑放大的源的特殊滤波器是super2xsai滤波器:
代码语言:txt复制
# 将128x96视频话放大到分辨率256x192像素
ffmpeg -i phone_video.3gp -vf super2xsai output.mp4

高级缩放技能

  • 要管理缩放过程开始的位置,可以直接使用缩放过滤器。scale=width:height[:interl={1|-1}]; 有一些变量可用,比如:
    • iw or in_w: 输入的宽度; ih or in_h: 输入的高度
    • a: 纵横比,与iw/ih相同。
    • sar: 输入样本纵横比,与dar/a相同;dar:输入显示纵横比,与*sar相同。
代码语言:txt复制
# 按比例缩放视频输入
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4

# 扩展到预定义的宽度或高度: 等比缩放
ffmpeg -i input.avi -vf scale=400:400/a

裁剪视频

  • 使用 video filter crop, 语法: crop=ow[:oh[:x[:y[:keep_aspect]]]]; 可用变量:
    • x, y: 对x的计算值(从左上角水平方向的像素个数)和y(垂直像素的数量),对每个帧进行评估,x的默认值为(iw - ow)/2, y的默认值为(ih - oh)/2
    • in_w, iw: 输入的宽度; in_h, ih: 输入的高度
    • out_w, ow: 输出(裁剪)宽度,默认值= iw; out_h, oh: 输出(裁剪)高度,默认值= ih
    • a: 纵横比,与iw/ih相同; sar: 输入样本比例; dar: 输入显示宽比,等于表达式a*sar
    • hsub, vsub: 水平和垂直的色度子样本值,对于像素格式yuv422p, hsub的值为2,vsub为1
    • n: 输入框的数目,从0开始
    • pos: 位置在输入框的文件中,如果不知道NAN
    • t: 时间戳以秒表示,如果输入时间戳未知
  • 裁剪框中心:按照上面的命令说明,可以看出如果不设置 x.y 那么会自动设置中心进行剪裁,比如 ffmpeg -i input_file -vf crop=w:h output_file 会剪裁中间的 w:h 区域
  • 自动检测裁剪区域: 使用 cropdetect 过滤器,语法为:cropdetect[=limit[:round[:reset]]], limit 参数表示对灰度值 < limit 的进行剪裁

填充视频

  • 使用 filter pad, 语法为 pad=width[:height[:x[:y[:color]]]]

例子

代码语言:txt复制
ffplay -f lavfi -i testsrc  -vf pad=380:360:30:30:pink -t 50

# 从4:3到16:9的填充视频
ffmpeg -i input -vf pad=ih*16/9:ih:(ow-iw)/2:0:color output

# 从16:9到4:3的填充视频
ffmpeg -i input -vf pad=iw:iw*3/4:0:(oh-ih)/2:color output

翻转和旋转视频

  • 水平翻转, 使用 filter hflip, 语法: -vf hflip
  • 垂直翻转, 使用 filter vlfip, 语法: -vf vflip
  • 旋转, 使用 filter transpose, 语法: transpose={0, 1, 2, 3}, 参数含义见下面的 例子中的 help

例子

代码语言:txt复制
ffplay -f lavfi -i testsrc -vf hflip

# 一个看 help 的例子
> ffmpeg -h filter=transpose

Filter transpose
  Transpose input video.
    slice threading supported
    Inputs:
       #0: default (video)
    Outputs:
       #0: default (video)
transpose AVOptions:
  dir               <int>        ..FV....... set transpose direction (from 0 to 7) (default cclock_flip)
     cclock_flip     0            ..FV....... rotate counter-clockwise with vertical flip
     clock           1            ..FV....... rotate clockwise
     cclock          2            ..FV....... rotate counter-clockwise
     clock_flip      3            ..FV....... rotate clockwise with vertical flip
  passthrough       <int>        ..FV....... do not apply transposition if the input matches the specified geometry (from 0 to INT_MAX) (default none)
     none            0            ..FV....... always apply transposition
     portrait        2            ..FV....... preserve portrait geometry
     landscape       1            ..FV....... preserve landscape geometry

模糊,锐化和去噪

  • 模糊使用 filter boxblur, 语法: boxblur=luma_r:luma_p[:chroma_r:chroma_p[:alpha_r:alpha_p]] filter expects 2 or 4 or 6 parameters, r =半径, p = 权重,程度,功率
  • 另一个模糊 filter 为 smartblur, 语法: smartblur=luma_r:luma_s:luma_t[:chroma_r:chroma_s:chroma_t] r = radius, p = power, t = threshold
  • 锐化使用 filterm, 语法: l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount all parameters are optional, if not set, the default is 5:5:1.0:5:5:0.0
  • 降噪 可以使用过滤器 denoise3d, 它是mp过滤器的一部分, 语法: mp=denoise3d[=luma_spatial[:chroma_spatial[:luma_tmp[:chroma_tmp]]]]
  • 另一个降噪过滤器: hqdn3d, 他是 denoise3d过滤器的高级版本,语法为 hqdn3d=[luma_spatial[:chroma_spatial[:luma_tmp[:chroma_tmp]]]]
  • 使用 nr 选项也可以降噪,它的值是一个从0到100000的整数,其中0是默认值, 比如 ffplay -i input.avi -nr 500

overlay

  • overlay 使用 fliter overlay, 语法为 overlay[=x:y[[:rgb={0, 1}]] 参数x和y是可选的,其默认值为0 rgb参数是可选的,其值为0或1;这个 filter 的意思是在指定位置上覆盖第一个输入. 比如 ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output
  • 注意,不是使用-vf选项,而是使用-filter_complex选项, 因为此时有两个输入
  • 如果希望 overlay 显示在某个时刻,可以使用 itsoffset: ffmpeg -i video_with_timer.mp4 -itsoffset 5 -i logo.png -filter_complex overlay timer_with_logo.mp4
代码语言:txt复制
# overlay 里面重要等变量为:
# main_w or W	主要输入宽度;   main_h or H	主要输入高度
# overlay_w or w	overlay输入宽度; overlay_h or h	overlay输入高度
# 下面这个命令会把 overlay 放在右上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4

为视频添加文字

  • 添加文字使用 filter drawtext, 从文本文件或字符串在视频中添加文本,并使用各种参数进行修改。 文本从文本文件参数指定的文件中加载,或直接使用文本参数输入。 其他必需参数是指定选定字体的字体文件。 文本位置由x和y参数设置。语法为:drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[...]]] p3,p4 ...表示参数#3,参数#4等; 这个 filter 的参数比较多,可以用 ffmpeg -h filter=drawtext 查看
  • 位置中使用 t 变量,就可以制造出运动的文字效果
代码语言:txt复制
ffplay -f lavfi -i color=white -vf drawtext=fontfile=/Library/Fonts/Baskerville.ttc:text=Welcome
# 横向运动的文字
ffmpeg -f lavfi -i color=orange -vf drawtext="text=hello:x=w-t*50:y=h-th:fontcolor=blue:fontsize=30" -t 50 test.mp4

编码解码

  • 编解码的功能比较复杂,主要是编解码器的种类繁多,参数繁多;首先要了解文件格式 和 编解码器 的区别
  • 文件格式 对应于 多媒体容器,是一种包装格式,使用 fmpeg -formats 可以看到所有支持的文件格式(容器),比如 mp4, mp3 等等
  • 编解码器是编解码的算法类型,使用 ffmpeg -codecs 可以看到所有的编解码器,命令行上的编解码器是由-c或-codec选项指定的,语法是:-codec[:stream_specifier] codec_name
  • 如果只更改容器并保留编解码器,我们可以使用-c copy或-c:a copy或-c:v copy选项:ffmpeg -i input.avi -q 1 -c copy output.mov
  • 可以为输入和输出文件指定编解码器,如果输出包含多个流,则每个流可以使用不同的编解码器。 如果我们在没有编解码器的情况下指定输出格式,则ffmpeg会选择默认编解码器,比如 .avi 格式的默认编解码器为 mpeg4, .mkv/mov/mp4 格式的编解码器为 h264
  • 参数非常多,用 ffmpeg -h encoder={name} 和 ffmpeg-formats 文档 来查看帮助
代码语言:txt复制
# 语法如下,用在 input 前面就是 decoder, 用在 output 前面就是 encoder
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)

# 一个 stream 前面可能应用了很多 codec, 以 last matching c option 为准
#  比如下面这个命令会 用 libx264 encode 第一个 video, libvorbis encode 第 137 个 audio, 其他 stream copy 
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

时间操作

  • 一般时间都接受两种参数风格: [-]HH:MM:SS[.m…][-]S [.m…], 其中,HH 表示小时,MM 表示分钟,SS 或 S 表示秒数,m 表示毫秒.
  • 如果要设置视频的时长【裁剪后面的】,可以使用 -t 参数控制时间或者 -frames 【-aframes <=> -frames:a 适用于 audio 同理有 -dframes/ -vframes】 参数控制帧数
  • 想要从某个时间点开始记录输入文件 【裁剪前面的】,可以使用 -ss (seek from start)参数, 注意组合使用 -ss 和 -t 表示从 ss 开始输入 t 时间
  • 输入流做延迟,使用 -itsoffset -map
  • 使用 -timestamp 选项可以在视频中记录时间戳
  • 时间戳和时间基
  • 音频视频速度修改: 视频速度修改使用 setpts filter (set presentation timestamp), 语法为 setpts=expression; 音频速度改变使用 filter atempo
  • asyncts audio filter 可以使用时间戳来同步音频数据
代码语言:txt复制
ffmpeg -i music.mp3 -t 180 music_3_minutes.mp3
ffmpeg -i video.avi -vframes 15000 video_10_minnutes.avi
ffmpeg -i input.avi -ss 10 output.mp4
# 从 video.mpg 中保存第5分钟的部分
ffmpeg -i video.mpg -ss 240 -t 60 clip_5th_minute.mpg
# 音频比视频要快了 1.5 秒 做同步, 这里 -c 表示 -codec[:stream_specifier] codec  <=> -c[:stream_specifier] codec (input/output,per-stream)
ffmpeg -i input.mpv -map 0:v -map 0:a -itsoffset 1.5 -c:a copy -c:v copy output.mov
# 视频快了 5 秒 做同步 
ffmpeg -i input.mov -map 0:v -itsoffset 5 -map 0:a -c:a copy -c:v copy output.mov
# 两个文件,将音频流延迟 3 秒
ffmpeg -i v.mpg -itsoffset 3 -i a.mp3 -map 0:v:0 -map 1:a:0 output.mp4
# 3 倍速来观看视频
ffplay  -f lavfi  -i testsrc -vf setpts=PTS/3
# 2 倍速来播放输入音频
ffplay -i speech.mp3 -af atempo=2
# 使用时间戳来同步 music.mpg 文件中的数据
ffmpeg -i music.mpg -af asyncts=compensate=1 -f mpegts music.ts

数学函数

  • 许多FFmpeg选项都需要数值作为参数,其中一些可以是表达式形式,可以包含算术运算符、常量和各种数学函数。函数通常用于音频和视频过滤器和源, 比如 aevalsrc【音频源】,boxblur/overlay/crop/drawtext/scale【视频过滤器】等等; 还可以使用一些内置多数学函数,比如: abs, asin(x), eq(x, y), gte(x, y), if(expr1, expr2), min(x, y), while(cond, expr) 等等
代码语言:txt复制
# 产生频率为523.251 Hz的C5音调(中音高C)的音调

ffplay -f lavfi -i aevalsrc='sin(523.251*2*PI*t)'

元数据和字幕

  • 媒体文件中的元数据包含艺术家,作者,日期,流派,发布者,标题等附加信息,不会显示在视频帧中。而字幕是文本数据,显示在视频帧底部附近,通常包含在单独的文件中,尽管一些容器文件格式(如VOB)支持包含字幕文件。
  • 查看元数据: 使用 ffprobe, 或者 ffplay 的时候都会显示元数据
  • 创建元数据: 使用 -metadata k1=v1 -metadata k2=v2
  • 保存元数据到文件:-f ffmetadata; 加载文件元数据到文件 -i x -i y
  • 删除元数据: -map_metadata -1
  • 字幕:字幕也有很多格式,比如 ass, srt 等等,使用后缀可以识别出对应的编解码器 ssa/srt 进行编解码
  • 一部分 filter 支持将字幕编码到视频流中,语法为 subtitles=filename[:original_size], 例子: ffmpeg -i video.avi -vf subtitles=titles.srt video.mp4
代码语言:txt复制
# 查看一个 mp3 文件的元数据
> ffprobe '~/Downloads/Jack Johnson - Imagine.mp3'

... 省略部分内容
Input #0, mp3, from '~/Downloads/Jack Johnson - Imagine.mp3':
  Metadata:
    encoder         : Lavf56.4.101
    disc            : 1
    track           : 11
    artist          : Jack Johnson
    comment         : 163 key(Don't modify):L64FU3W4YxX3ZFTmbZ 8/UnVjCnqpKdEibASol9of8KaPX//btdBYF VVRkXkEDD/iGR355GeUXxh0IUGR/GwBNi9G4ezN6Z7cPYKcJ3G01aqRPkU1umKYjjZLXvNFMCMLrmf5mGqVQo hTaZlpidWU9kf8oTXfXHN4cj2PKPLh7HFCdJ/oKzLj3tB/BKqQJjZ1moy59PXmgevX6IGXydNfGHhxwts 3ZlZ/1FBko
    title           : Imagine
    album           : The Mango Tree
    
# 新建元数据
ffmpeg -i '~/Downloads/Jack Johnson - Imagine.mp3' -metadata "k1=v1" -metadata "k2=v2"  -y  ~/Downloads/test.mp3

# 保存元数据到文件
ffmpeg -i ~/Downloads/test.mp3 -f ffmetadata ~/Downloads/test.txt
# 加载文件元数据到文件 
ffmpeg -i ~/Downloads/test.txt -i ~/Downloads/test.mp3  ~/Downloads/test2.mp3
# 删除元数据
ffmpeg -i input.avi -map_metadata -1 output.mp4

下图不一定准确,可以参考一下常见的 predefined metadata 有哪些 key

图像处理

虽然FFmpeg工具的主要用途与音频和视频有关,但ffmpeg可以对各种图像格式进行解码和编码,并且许多图像相关任务可以快速完成

  • 支持的格式包括: Y.U.V, BMP, GIF, JPG ....略
  • 创建图像:
    • 从视频截图:ffmpeg -i input -ss t image.type ss 表示从哪开始, t 表示 时刻,这是 ffmpeg 一致的参数
    • 从视频截 gif: 直接转 .gif【todo 补充更多实用例子】
    • 使用内置的视频源创建图像: color/ mptestsrc/ rgbtestsrc/ smptebars/ testsrc, 比如 color,使用的参数为 color[=c=clr[:d=time[:r=fps[:sar=value[:s=resolution]]]]]
    • 抽帧: ffmpeg -i clip.avi frameM.jpg 【todo 补充更多实用例子】
  • 调整大小,裁剪和填充图像: 和视频类似
  • 翻转,旋转和叠加图像 和视频类似
  • 图像类型之间的转换:ffmpeg -i image.type1 image.type2
  • 从图像创建视频:
    • 来自一个图片:ffmpeg -loop 1 -i photo.jpg -t 10 photo.mp4
    • 来自多个图片:ffmpeg -f image2 -i img%d.jpg -r 25 video.mp4
代码语言:txt复制
# 截图
ffmpeg -i in1.mp4 -ss 3 -frames:v 1  snap.jpg
# gif 
ffmpeg -i in1.mp4  -pix_fmt rgb24 in1.gif
# 从内置视频源生成图片,比如生成一个单色的图片
ffmpeg -f lavfi -i color=c=#008080:s=728x90 -frames:v 1  leaderboard.jpg

数字音频

数字音频是一种技术,用于捕获、记录、编辑、编码和复制声音,这些声音通常由脉冲编码调制(PCM)进行编码。FFmpeg支持许多音频格式,包括AAC、MP3、Vorbis、WAV、WMA等

音频基础

  • 音频量化: 由于人类听觉系统的生理限制,压力波的连续值可以用有限的一系列值代替, 使用二进制存储音频的位数称为 音频位深度, 量化常见的位深度有:
    • 8 bit: 用于电话,旧设备
    • 12 bit: DV(数字视频)的标准,用于数码相机等
    • 14 bit: 用于NICAM压缩,电视立体声,等等
    • 16 bit: 标准音频CD和DAT(数字音频磁带)
    • 20 bit: 附加标准的超级音频CD和DVD音频
    • 24 bit/32 bit: 略
  • 音频采样:量化是纵坐标的表示,横坐标就是采样,采样常见的频率有:
    • 8000 Hz: 用于电话、无线网络和麦克风等
    • 11025/16000/22050/32000 HZ: 略
    • 44100 HZ:音频CD标准,用于MPEG-1, PAL电视等
    • 48000 HZ:专业使用标准费率,为消费者提供DV、DVD、数字电视等
    • 96000 HZ: 标准的DVD-音频,蓝光光盘,HD DVD等
    • 192000/352800 HZ:略
  • 音频文件格式:分几类:
    • 未压缩: ALAC/AU/BWF/PCM (raw, without header)/WAV (PCM)
    • 无损压缩: AIFF (PCM)/ALS/ATRAC/FLAC/WavPack/WMA
    • 有损压缩: AAC/AC-3/ AMR/ MP2, MP3/ Musepack/Speex/Vorbis (OGG)

音频操作

  • 声音合成: 可以用内置的 音频源 aevalsrc 来创建声音, 语法为 aevalsrc=exprs[::options] exprs:是一个冒号分隔的表达式列表,每个新表达式都指定了新通道; options:键=值对的冒号分隔列表;
    • exprs 中可用: n: 评估样本的数量; t: 以秒为单位的时间,从0开始; s: 采样率;
    • options 重可用: c or channel_layout: 通道布局,通道数量必须等于表达式的数量; d or duration: max 持续时间,如果没有指定,或者是负数,音频将生成直到程序停止; n or nb_samples: 每个通道每个输出帧的样本数量,默认为1024个样本; s or sample_rate: 采样率,默认值为44100 Hz
    • 使用-layout选项可以创建多声道声音
    • 立体声的特殊类型是双耳音(节拍) - 两个频率差约30Hz或更小的音,两个音的频率必须低于1000Hz
  • 音量设置: 使用 -vol [0-256], 如果值<1, 那么 output_volume = vol * input_volume, 如果有后缀 dB, output_volume = 10 ^(卷/ 20)* input_volume
  • 混合多个声音: 使用语法 amix=inputs=ins[:duration=dur[:dropout_transition=dt]]
  • 将立体声调至单声道,环绕立体声:使用 pan=layout:channel_def[:channel_def[:channel_def...]]
  • 音频分析: 使用 filter ashowinfo, 可以对每一个音频帧显示参数信息
  • 调整耳机听音: 使用 filter earwax
  • -map_channel 选项可以更改各种音频参数,其语法为: -map_channel [in_file_id.stream_spec.channel_id|-1][:out_file_id.stream_spec]
  • 将两个音频流合并到一个多通道流: 使用 filter amerge
  • 音频流转发与缓冲buffet order控制: 使用 filter astreamsync
代码语言:txt复制
# 产生音符A4,音高的调优标准,将tone_height设置为440 Hz:
ffplay -f lavfi -i aevalsrc='sin(440*2*PI*t)' -t 2
# 多声道【立体声】
ffplay -f lavfi -i aevalsrc='sin(495*2*PI*t)|cos(505*2*PI*t):c=FL FR'
# 音频分析
ffmpeg -report -i ~/Downloads/test.mp3 -af ashowinfo -f null /dev/null

预设编解码器

  • 作用是预设一些编解码器选项的默认值,简化 ffmpeg 的使用【选项实在太多了】
  • 预设文件的格式见下面的例子,请查看文档,使用方式为: ffmpeg -i input -fpre mpeg2.ffpreset -q 1 MPEG2_video.mpg
  • 还有一个 -target 命令,比如 -target vcd 会自动为输出设置 bitrate, codecs, buffer sizes 等参数
代码语言:txt复制
vcodec=flv	# 视频编解码器, 必填唯一
b:v=300k	# 视频比特率
g=160		# 图片组大小
mbd=2	# macroblock决策算法
flags= aic mv0 mv4	# aic - h263高级内部编码;总是尝试使用mv=<0,0>;mv4 -使用macroblock的4运动矢量
trellis=1	# rate失真优化量化
ac=1	# 声道数
ar=22050	# 音频采样率
b:a=56k	# 音频比特率

隔行视频

隔行视频标准

  • 隔行扫描是在单色模拟电视开发过程中发明的技术,可以消除旧CRT显示器的闪烁。 视频帧被水平划分为规则线,然后划分为2个场,其中第一个场包含奇数行,第二个场包含偶数行。
  • NTSC, PAL和SECAM电视标准 见下表

功能

NTSC

PAL, SECAM

扫描的行数

525

625

可见扫描行

483

576

每秒帧数

30

25

每秒场数

60

50

隔行视频操作

略,参考 https://www.jianshu.com/p/fb051e1457c2

麦克风和摄像头

略, https://www.jianshu.com/p/95012f6696e0

颜色修正

略,https://www.jianshu.com/p/f2a94de1c26a

高级

  • 使用 filter concat 连接视频/音频,其中所有片段必须具有相同数量的每种类型的流,例如1个音频和1个视频,或2个音频和1个视频,等等,语法:concat=a=a_streams:v=v_streams:n=segments[:unsafe]
  • 使用 filter delogo 移除 logo, 它通过对周围像素的简单插值来隐藏一个电视台的标志。用户设置一个覆盖该徽标的矩形,它通常会消失(但在某些情况下,标识更明显)。语法: delogo=x=0:y=0:w=width:h=height[:t=band:show={0,1}]
  • 使用 filter deshake 修正视频的抖动,语法: deshake=x:y:w:h:rx:ry:edge:blocksize:contrast:search:filename
  • 使用 filter aselect/select 选择指定的帧进行输出,语法: select=expression
  • 使用 filter setdar/setsar 来设置纵横比,语法: setdar[=r=aspect_ratio[:max=number]]; setdar[=aspect_ratio[:number]]
  • 使用 filtergraph

常用参数和例子

代码语言:txt复制
-f fmt (input/output) :指定输入或者输出文件格式。常规可省略而使用依据扩展名的自动指定
-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。

-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
为特定的文件选择编/解码模式,对于输出文件就是编码器,对于输入或者某个流就是解码器。选项参数(后面的那个)中codec是编解码器的名字,或者是copy(仅对输出文件)则意味着流数据直接复制而不再编码

// 在输出文件中第2视频流按libx264编码,第138音频流按libvorbis编码,其余都直接复制输出
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

-t duration (input/output):限制输入/输出的时间。如果是在-i前面,就是限定从输入中读取多少时间的数据;如果是用于限定输出文件,则表示写入多少时间数据后就停止
-ss position (input/output): 当在-i前时,表示定位输入文件到position指定的位置。注意可能一些格式是不支持精确定位的,所以ffmpeg可能是定位到最接近position(在之前)的可定位点。当用于输出文件时,会解码丢弃position对应时间码前的输入文件数据
-dn (input/output)
As an input option, blocks all data streams of a file from being filtered or being automatically selected or mapped for any output. See -discard option to disable streams individually.
As an output option, disables data recording i.e. automatic selection or mapping of any data stream. For full manual control see the -map option.
-dframes number (output):设定指定number数据帧到输出文件,这是-frames:d的别名。
frames[:stream_specifier] framecount (output,per-stream):在指定计数帧后停止写入数据。
-q[:stream_specifier] q (output,per-stream)
-qscale[:stream_specifier] q (output,per-stream)
使用固定的质量品质(VBR)。用于指定q|qscale编码依赖。如果qscale没有跟stream_specifier则只适用于视频。其中值q取值在0.01-255,越小质量越好
-filter[:stream_specifier] filtergraph (output,per-stream):创建一个由filtergraph指定的滤镜,并应用于指定流。

// 视频(video)选项
-vframes number (output):设置输出文件的帧数,是-frames:v的别名
-r[:stream_specifier] fps (input/output,per-stream):设置帧率(一种Hz值,缩写或者分数值)
-s[:stream_specifier] size (input/output,per-stream):设置帧的尺寸。
-aspect[:stream_specifier] aspect (output,per-stream):指定视频的纵横比(长宽显示比例)
-vn (output):禁止输出视频
-vcodec codec (output):设置视频编码器,这是-codec:v的一个别名

// OPTIONS FOR SETTING QUALITY
-b:v or -b:a to set bitrate // e.g., -b:v 1000K = 1000 kbit/s, -b:v 8M = 8 Mbit/s
-q:v or -q:a to set fixed-quality parameter //e.g., -q:a 2 for native AAC encoder
// Examples of encoder-specific options:
-crf to set Constant Rate Factor for libx264/libx265
-vbr to set constant quality for FDK-AAC encoder

// Different kinds of rate control
CBR/VBR/CQP..... //Rate depends on content characteristics


// 音频选项
-aframes number (output):设置number音频帧输出,是-frames:a的别名
-ar[:stream_specifier] freq (input/output,per-stream):设置音频采样率。默认是输出同于输入。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。对于输出则可以强制设置音频量化的采用率。
-aq q (output):设置音频品质(编码指定为VBR),它是-q:a的别名。
-ac[:stream_specifier] channels (input/output,per-stream):设置音频通道数。默认输出会有输入相同的音频通道。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。
-an (output):禁止输出音频
-acode codec (input/output):设置音频解码/编码的编/解码器,是-codec:a的别名


// 字幕选项
-scodec codec (input/output):设置字幕解码器,是-codec:s的别名。

例子

代码语言:txt复制
// Transcoding from one codec to another (e.g. H.264 using libx264):
ffmpeg -i <input> -c:v libx264 output.mp4

// Transmuxing from one container/format to another – without re-encoding:
ffmpeg -i input.mp4 -c copy output.mkv


// Cut a video from timestamp <start> for <duration>, or until <end>:
ffmpeg -ss 00:01:50 -i <input> -t 10.5 -c copy <output>
ffmpeg -ss 2.5 -i <input> -to 10 -c copy <output>


// 使用 SPEED/QUALITY PRESETS IN X264 预置 preset
ffmpeg -i <input> -c:v libx264 -crf 23 -preset ultrafast -an output.mkv
ffmpeg -i <input> -c:v libx264 -crf 23 -preset medium -an output.mkv
ffmpeg -i <input> -c:v libx264 -crf 23 -preset veryslow -an output.mkv

// map input streams to output, e.g. to add audio to a video:
ffmpeg -i input.mp4 -i input.m4a -c copy -map 0:v:0 -map 1:a:0 output.mp4

// scale - Scale to 320×240:
ffmpeg -i <input> -vf "scale=w=320:h=240" <output>

// padding
ffmpeg -i <input> -vf "pad=1920:1080:(ow-iw)/2:(oh-ih)/2" <output>

// Simple fade-in and fade-out at a specific time for a specific duration.
ffmpeg -i <input> -filter:v "fade=t=in:st=0:d=5,fade=t=out:st=30:d=5" <output>

// Complex system for printing text on video
ffmpeg -i <input> -vf 
drawtext="text='Test Text':x=100:y=50:
fontsize=24:fontcolor=yellow:box=1:boxcolor=red" 
<output>

// Decode three video/audio streams and append to one another:
ffmpeg -i <input1> -i <input2> -i <input3> -filter_complex 
    "[0:0][0:1][1:0][1:1][2:0][2:1]concat=n=3:v=1:a=1[outv][outa]" 
    -map "[outv]" -map "[outa]" <output>
    
// Show a watermark in the top left corner between seconds 1 and 2 only
ffmpeg -i <video> -i <watermark> -filter_complex 
    "[0:v][1:v]overlay=10:10:enable='between(t,1,2)'[outv]" 
    -map "[outv]" <output>

参考:

  • https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html
  • http://slhck.info/ffmpeg-encoding-course/#/

0 人点赞