ffmpeg的使用

ffmpeg的命令行参数非常多,可以分为5部分

$ ffmpeg {1} {2} -i {3} {4} {5}

上面命令中,五个部分的参数依次如下。

  1. 全局参数
  2. 输入文件参数
  3. 输入文件
  4. 输出文件参数
  5. 输出文件

举例

$ ffmpeg \
-y \#全局参数
-c:a libfdk_aac -c:v libx264 \#输入文件参数
-i input.mp4 \#输入文件
-c:v libvpx-vp9 -c:a libvorbis \输出文件参数
output.webm #输出文件

上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 Vorbis。

如果不指明编码格式,FFmpeg 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子。

$ ffmpeg  -i input.mp4 output.webm
ffmpeg 命令参数说明
-formats 查看ffmpeg支持的容器格式

视频文件本身其实是一个容器(container),里面包括了视频和音频,也可能有字幕等其他内容。

常见的容器格式有以下几种。一般来说,视频文件的后缀名反映了它的容器格式。

MP4
MKV
WebM
AVI
-codecs 查看ffmpeg支持的编码格式

视频和音频都需要经过编码,才能保存成文件。不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。

常用的视频编码格式如下。

H.262
H.264
H.265

上面的编码格式都是有版权的,但是可以免费使用。此外,还有几种无版权的视频编码格式。

- VP8
- VP9
- AV1

常用的音频编码格式如下。

- MP3
- AAC

上面所有这些都是有损的编码格式,编码后会损失一些细节,以换取压缩后较小的文件体积。

-encoders 查看ffmpeg已安装的编码器

编码器(encoders)是实现某种编码格式的库文件。只有安装了某种格式的编码器,才能实现该格式视频/音频的编码和解码。

以下是一些 FFmpeg 内置的视频编码器。

> - libx264:最流行的开源 H.264 编码器
> - NVENC:基于 NVIDIA GPU 的 H.264 编码器
> - libx265:开源的 HEVC 编码器
> - libvpx:谷歌的 VP8 和 VP9 编码器
> - libaom:AV1 编码器

音频编码器如下。

- libfdk-aac
- aac
-f fmt(input/output) 强制设置输入或输出文件的格式
-c 指定编码器
-c copy 直接复制,不经过重新编码(这样比较快)
-c:v 指定视频编码器
ffmpeg -i out.mp4 -c:v libx264 out1.mp4 //输出视频以h264进行编码
ffmpeg -i out.mp4 -c:v libx265 out2.mp4 //输出视频以h265进行编码
-c:a 指定音频编码器
-i url(input) 设置输入文件的url
-an 去除音频流
-vn 去除视频流

可用于从视频中提取音频,可以像下面这样写

$ ffmpeg \
-i input.mp4 \
-vn -c:a copy \
output.aac

# 将视频中音频去掉,只保留视频
$ ffmpeg \
-i out.mp4 \
-an -c:a copy \
outvideo.mp4

-c:a copy表示不改变音频编码,直接拷贝。

添加音轨 将外部音频加入视频,比如添加背景音乐或旁白。

$ ffmpeg -i out.aac -i outvideo.mp4 output.mp4

上面例子中,将之前提取的音频和视频两个输入文件,使用FFmpeg 将它们合成为一个文件。

-y (global) 强制覆盖输出文件
-preset 指定输出的视频质量

会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。

-stream_loop number (input) 设置输入流循环的次数。

0表示没有循环,-1表示无限循环。

-t duration (input/output)

当用在作为输入文件 -i 参数 前,用于限制视频的的时长。
当用在作为输出参数(放在输出文件的前面),到达设定的时长后停止写入,也就是截断视频(视频的时长)
duration 必须是一个符合时间规范的数值,
时间间隔的格式有以下两种格式:
①、以时分秒的格式,中间用:隔开

[-][HH:]MM:SS[.m...] 

? HH expresses the number of hours, MM the number of minutes for a maximum of 2 digits, and SS the number of seconds for a maximum of 2 digits. The m at the end expresses decimal value for SS.
? ②、以秒、毫秒、微妙的格式

[-]S+[.m...][s|ms|us]

? S expresses the number of seconds, with the optional decimal part m. The optional literal suffixes ‘s’, ‘ms’ or ‘us’ indicate to interpret the value as seconds, milliseconds or microseconds, respectively.

Examples:

‘55’
55 seconds

‘0.2’
0.2 seconds

‘200ms’
200 milliseconds, that’s 0.2s

‘200000us’
200000 microseconds, that’s 0.2s

‘12:03:45’
12 hours, 03 minutes and 45 seconds

‘23.189’
23.189 seconds
-to position (input/output)

postion也是传一个time格式的值,和-t相互排斥,相当于到哪里结束。如果同时添加-t 和-to 两个参数,-t参数优先

Stop writing the output or reading the input at position. position must be a time duration specification,

-fs limit_size (output) 设置文件大小限制,以字节表示。

超过限制后,将不再写入更多的字节块。输出文件的大小略大于请求的文件大小。

-ss position (input/output)

当作为输入选项使用时(在-i 参数前) ,在这个输入文件中寻找位置。请注意,在大多数格式中,不可能精确地查找,因此 ffmpeg 将在位置之前查找最近的查找点。当启用代码转换和-accurate _ seek (默认值)时,寻道点和位置之间的这个额外段将被解码并丢弃。当执行流复制或使用 -noaccurate _ seek 时,它将被保存。

当作为输出选项使用时(在输出 文件 之前) ,到指定位置开始写入。

ffmpeg -i out.mp4 -ss 15:00 out1.mp4
-sseof position (input)

类似于-ss 选项,但是相对于“文件结束”。也就是说,保留文件的时长,开始时间为总时长减去设置需要保留的时长,0在 EOF,这个参数只能使用负数,否则会报错。

ffmpeg -sseof -15:00  -i out.mp4 out1.mp4
-itsoffset offset (input)

设置输入时间偏移量。偏移量被添加到输入文件的时间戳中。指定正偏移量意味着相应的流被偏移量中指定的时间长度延迟。

-itsscale scale (input,per-stream)

缩放输入时间戳。刻度应该是一个浮点数。

-timestamp date (output)

设置容器中的录制时间戳。日期必须是日期规格(附加参数,不能单独使用)

-metadata[:metadata_specifier] key**=**value (output,per-metadata)

格式是key=value这种形式 ,给视频设置元数据,比如添加标题

这是一个添加视频标题的例子

ffmpeg -i out6.mp4 -metadata title="my title" out6t.mp4

这个是给第一个音频流设置语言

ffmpeg -i out.mp4 -metadata:s:a:0 language=eng outt.mp4
-disposition[:stream_specifier]

value (output,per-stream) 设置流的配置,此选项将覆盖从输入流复制的配置。也可以通过将配置设置为0来删除该配置,可选的有以下配置

  • default
  • dub
  • original
  • comment
  • lyrics
  • karaoke
  • forced
  • hearing_impaired
  • visual_impaired
  • clean_effects
  • attached_pic
  • captions
  • descriptions
  • dependent
  • metadata

比如将第二个音频流设置为默认

ffmpeg -i out.mp4 -c copy -disposition:a:1 default out1.mp4

将第二个字幕流作为默认流,并从第一个字幕流中移除默认配置

ffmpeg -i out.mp4 -c copy -disposition:s:0 0 -disposition:s:1 default out2.mp4

给视频添加封面缩略图(替换以前的封面)

ffmpeg -i out.mp4 -i IMAGE(图片文件) -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out3.mp4 

ffmpeg -i out.mp4 -i C:\Users\Administrator\Desktop\切图(5)\切图\web\home_icon_five.png -map 0   -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out3.mp4

注意:并不是所有的 muxers 都支持嵌入式缩略图,而那些支持嵌入式缩略图的 muxers 只支持一些格式,比如 JPEG 或 PNG

-target type (output) 指定目标文件类型(vcd、 svcd、 dvd、 dv、 dv50)。

类型可以前缀 pal-,ntsc-或film-使用相应的标准。然后自动设置所有格式选项(比特率、编解码器、缓冲区大小)。

ffmpeg -i out.mp4 -target pal-vcd tmp\\vcd.mpg

只要您知道其他选项不与标准冲突,就可以指定其他选项

ffmpeg -i out.mp4 -target pal-vcd -bf 2 tmp\\vcd.mpg
-attach filename (output) 向输出文件添加附件。

这是支持一些格式,如 Matroska,例如字幕渲染中使用的字体。附件作为特定类型的流实现,因此此选项将向文件添加新的流。然后就可以按照通常的方式在这个流上使用每个流的选项。使用此选项创建的附件流将在所有其他流(即使用 -map 或自动映射创建的流)之后创建。

注意,对于 Matroska,你还必须设置 mimetype 元数据标签:

ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

Video Options

-vframes number (output) 设置输出文件视频帧数量,这是-frmaes:v旧的别名
ffmpeg -i out.mp4 -vframes 1000 -y tmp\\out1.mp4
**-r[:stream_specifier] **fps (input/output,per-stream) 设置帧速率(Hz 值、分数或缩写)。

作为一个输入选项,忽略文件中存储的任何时间戳,而是生成假设帧速率为常数 fps 的时间戳。这与用于 image2或 v4l2等输入格式的-framerate 选项不同(在 FFmpeg 的旧版本中曾经是相同的)。如果有疑问,使用-framerate 代替输入选项-r

作为一个输出选项,复制或删除输入帧,以实现恒定的输出帧速率 fps。

ffmpeg -i out.mp4 -r 20 -y tmp\\out2.mp4
-fpsmax[:stream_specifier] fps (output,per-stream)

设置最大帧速率(Hz 值、分数或缩写)。当输出帧速率是自动设置的并且高于这个值时候控制输出帧速率。在批处理或输入帧率被错误地检测为非常高时很有用。它不能与 -r 一起设置。在流媒体拷贝期间,它被忽略。

-s[:stream_specifier] size (input/output,per-stream)

设置帧大小,作为一个输入选项,这是 video _ size private 选项的一个快捷方式,可以被一些解析器识别出来,这些解析器的帧大小要么不存储在文件中,要么是可配置的——例如原始视频或视频采集器。

作为输出选项,它将缩放视频过滤器插入到相应的过滤器的末尾。请直接使用scale filter在开头或其他地方插入。

ffmpeg -i out.mp4 -c copy -s 1080x1920(长x宽) -y tmp\\out3.mp4
-aspect[:stream_specifier] aspect (output,per-stream)

设置视频显示长宽比。aspect可以是一个浮点数字符串,也可以是形式为 num: den 的字符串,其中 num 和 den 是长宽比的分子和分母。例如,“4:3”、“16:9”、“1.3333”和“1.7777”是有效的参数值。

如果与-vcodec copy一起使用,它将影响存储在容器级别的纵横比,但不影响存储在编码帧中的纵横比(如果存在的话)。

ffmpeg -i out.mp4 -c copy -aspect 4:3 -y tmp\\out3.mp4
-vcodec codec (output)

设置视频编解码器。这是-codec: v 的别名。

-minrate 改变编码的比特率,指定码率的最小值
-maxrate 改变编码的比特率,指定码率的最大值
-bufsize 指定缓冲区的大小

一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。

$ ffmpeg \
-i input.mp4 \
-minrate 964K -maxrate 3856K -bufsize 2000K \
output.mp4
-vf filtergraph (output)

创建由筛选图指定的筛选图,并使用它筛选流。这是-filter:v的别名,可以改变视频分辨率,加滤镜

下面的例子将视频分辨率从1080p改为480p

$ ffmpeg \
-i input.mp4 \
-vf scale=480:-1 \
output.mp4
-autorotate

根据文件元数据自动旋转视频。默认情况下是开启的,使用-noautorotate 来禁用它。

-autoscale

根据第一帧的分辨率自动缩放视频。默认情况下启用,使用-noautoscale 来禁用它。不推荐禁用

Advanced Video options

-pix_fmt[:stream_specifier] format (input/output,per-stream)

设置像素格式,用-pix_fmts显示所有支持的格式。如果无法选择所选的像素格式,ffmpeg 将打印警告并选择编码器支持的最佳像素格式。如果 pix _ fmt 前缀为 + ,则如果无法选择所请求的像素格式,并且禁用滤波器内部的自动转换,则 ffmpeg 将退出,并带有错误。如果 pix _ fmt 是单个 + ,则 ffmpeg 选择与输入(或图形输出)相同的像素格式,并禁用自动转换。

ffmpeg -i out.mp4 -c copy -pix_fmt rgb8 -y tmp\out4.mp4
-pix_fmts 显示所有支持的像素格式
ffmpeg -pix_fmts

Audio Options

-aframes number (output)

设置输出音频的帧数,这是-frames:a旧的别称

-ar[:stream_specifier] freq (input/output,per-stream)

设置音频采样频率。对于输出流,默认情况下将其设置为相应输入流的频率。对于输入流,这个选项只适用于音频采集设备和原始解除器,并映射到相应的解除器选项。

-aq q (output)

设置音频质量(特定于编解码器的 VBR)。这是-q:a别称

-ac[:stream_specifier] channels (input/output,per-stream)

设置音频频道的数量。对于输出流,默认设置为输入音频通道的数量。对于输入流,这个选项只适用于音频采集设备和原始解除器,并映射到相应的解除器选项。

-acodec codec (input/output)

设置音频编解码器。这是-codec: a 的别名。

-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)

设置音频样本格式。使用-sample _ fmts 获得支持的样本格式列表。

-sample _ fmts 获取所有音频样本支持的格式

Subtitle options

-scodec codec (input/output)

设置字幕编解码器。这是-codec: s 的别名。

Advanced options

-map [-]input_file_id[:stream_specifier][?][,sync_file_id[:stream_specifier]] | [linklabel] (output)

指定一个或多个输入流作为输出文件的源。每个输入流都由输入文件索引 input _ file _ id 和输入文件中的输入流索引 input _ stream _ id 标识。两个指数都从0开始。如果指定,sync _ file _ id: stream _ specifier 设置哪个输入流用作表示同步引用。

命令行上的第一个 map选项指定输出流0的源,第二个 map 选项指定输出流1的源,等等。

流标识符前的-字符创建一个“负”映射。它禁用与已创建映射匹配的流。

流索引后?将允许映射是可选的: 如果映射匹配没有流,映射将被忽略而不是失败。注意,如果使用了无效的输入文件索引,映射仍然会失败; 例如,如果映射引用了不存在的输入。

另一种[ linklabel ]形式将复杂的过滤器图形(参见-filter _ complex 选项)的输出映射到输出文件。链接标签必须对应于图中已定义的输出链接标签。

例如,将所有流从第一个输入文件映射到输出

ffmpeg -i INPUT -map 0 output

例子:如果在第一个输入文件中有两个音频流,这两个音频流分别用“0:0”和“0:1”标识。您可以使用 -map 来选择将哪些流放入输出文件中。

ffmpeg -i INPUT -map 0:1 out.wav

将 INPUT 中由“0:1”标识的输入流映射到 out.wav 中的(单一)输出流。

例子:从输入文件 a.mov (由标识符“0:2”指定)选择索引为2的流,从输入 b.mov (由标识符“1:6”指定)选择索引为6的流,并将它们复制到输出文件 out.mov:

ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov

从输入文件中选择所有视频和第三个音频流:

ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT

若要映射除第二个音频之外的所有流,请使用负映射

ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT

从第一个输入映射视频和音频流,使用,如果没有音频流存在于第一个输入则忽略音频映射:

ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT

选择英语音频流

ffmpeg -i INPUT -map 0:m:language:eng OUTPUT

请注意,使用-map选项将禁用此输出文件的默认映射。

-ignore_unknown

如果试图复制未知类型的输入流,则忽略该输入流,而不是失败。

-copy_unknown

如果试图复制未知类型的输入流,则允许复制该类型的输入流,而不是失败。

-map_channel [input_file_id.stream_specifier.channel_id|-1][?][:output_file_id.stream_specifier]

将音频信道从给定的输入映射到输出。如果输出 _ file _ id。如果没有设置 stream _ specifier,则音频频道将映射到所有音频流上。

使用“-1”代替输入 _ file _ id. stream _ specifier. channel _ id 将映射静音的通道。

将允许 map _ channel 是可选的: 如果 map _ channel 与 no channel 匹配,则 map _ channel 将被忽略而不是失败。

例子:假设 INPUT 是一个立体声音频文件,你可以用以下命令切换两个音频频道:

ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT

如果你想静音第一个频道,保留第二个

ffmpeg -i INPUT -map_channel -l -map_channel 0.0.1 OUTPUT

-map _ channel”选项的顺序指定输出流中通道的顺序。输出通道布局是根据映射的通道数目(如果有一个“-map _ channel”则为 mono,如果有两个则为立体声,等等)来猜测的。如果输入和输出通道布局不匹配(例如两个“-map _ channel”选项和“-ac 6”选项) ,使用“-ac”结合“-map _ channel”可以更新通道增益级别。

您还可以将输入的每个通道提取到特定的输出; 下面的命令将 INPUT 音频流(文件0,流0)的两个通道提取到各自的 OUTPUT _ ch0和 OUTPUT _ ch1输出

ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1

下面的示例将立体声输入的通道拆分为两个单独的流,并将其放入同一个输出文件中

ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg

请注意,目前每个输出流只能包含来自单个输入流的通道; 例如,您不能使用“-map _ channel”选择包含在不同流(来自相同或不同文件)中的多个输入音频通道,并将它们合并到单个输出流中。因此,目前是不可能的,例如,把两个独立的单声道流变成一个单一的立体声流。然而,分裂成两个单通道单声道流立体声流是可能的。

如果你需要这个特性,一个可能的解决方案是使用 amerge 过滤器。例如,如果你需要将一个包含两个单声道音频流的媒体(这里是 input.mkv)合并成一个单声道音频流(并保持视频流) ,你可以使用以下命令:

ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

从第一个输入映射前两个音频通道,并使用尾随?,如果第一个输入是单声道而不是立体声忽略音频通道映射

ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT
-map_metadata[:metadata_spec_out] infile**[:metadata_spec_in] (output,per-metadata)**

从 infile 设置下一个输出文件的元数据信息。注意,这些是文件索引(从零开始) ,而不是文件名。可选的 metadata _ spec _ in/out 参数指定要复制的元数据。元数据说明符可以有以下形式:

g 全局元数据,即应用于整个文件的元数据

s[:stream_spec] 每个流元数据。Stream _ spec 是一个在 Stream 说明符章节中描述的流说明符。在输入元数据说明符中,从。在输出元数据说明符中,将所有匹配的流复制到。

c:chapter_index 每章元数据。 chapter_index 是从零开始的章节索引。

p😗*program_index ** 每个程序的元数据。 program _ index 是从零开始的程序索引。

如果省略了元数据说明符,则默认为 global。相当于使用了g

默认情况下,全局元数据是从第一个输入文件复制的,每个流和每个章节的元数据与流/章节一起复制。通过创建相关类型的任何映射,这些默认映射将被禁用。否定文件索引可用于创建一个假映射,只禁用自动复制。

例如,将元数据从输入文件的第一个流复制到输出文件的全局元数据:

ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3

反过来,也就是把全局元数据复制到所有的音频流

ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

请注意,在这个示例中,简单的0也可以工作,因为默认情况下假设全局元数据。

常用用法:
查看文件信息

查看视频文件的元信息,比如编码格式和比特率,可以只使用-i参数。

$ ffmpeg -i out.mp4 

上面命令会输出很多冗余信息,加上-hide_banner参数,可以只显示元信息。

$ ffmpeg -i input.mp4 -hide_banner
转换编码格式

转换编码格式(transcoding)指的是, 将视频文件从一种编码转成另一种编码。比如转成 H.264 编码,一般使用编码器libx264,所以只需指定输出文件的视频编码器即可。

$ ffmpeg -i out.mp4 -c:v libx264 output.mp4

下面是转成 H.265 编码的写法。

$ ffmpeg -i out.mp4 -c:v libx265 output.mp4
转换容器格式

转换容器格式(transmuxing)指的是,将视频文件从一种容器转到另一种容器。下面是 mp4 转 webm 的写法。

$ ffmpeg -i out.mp4 -c copy output.webm

上面例子中,只是转一下容器,内部的编码格式不变,所以使用-c copy指定直接拷贝,不经过转码,这样比较快。

调整码率

调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。

$ ffmpeg \
-i input.mp4 \
-minrate 964K -maxrate 3856K -bufsize 2000K \
output.mp4
改变分辨率

下面是改变视频分辨率(transsizing)的例子,从 1080p 转为 480p 。

$ ffmpeg \
-i input.mp4 \
-vf scale=480:-1 \
output.mp4
提取音频

有时,需要从视频里面提取音频(demuxing),可以像下面这样写。

$ ffmpeg \
-i input.mp4 \
-vn -c:a copy \
output.aac

# 将视频中音频去掉,只保留视频
$ ffmpeg \
-i out.mp4 \
-an -c:a copy \
outvideo.mp4
添加音轨

添加音轨(muxing)指的是,将外部音频加入视频,比如添加背景音乐或旁白。

$ ffmpeg \
-i input.aac -i input.mp4 \
output.mp4

上面例子中,有音频和视频两个输入文件,FFmpeg 会将它们合成为一个文件。

截图

下面的例子是从指定时间开始,连续对1秒钟的视频进行截图。

$ ffmpeg \
-y \
-i out.mp4 \
-ss 00:01:24 -t 00:00:01 \
output_%3d.jpg

截图的数量根据视频的帧数来决定,比如上面这个视频10.000 fps(每秒10帧),那么就会截10张图

如果只需要截一张图,可以指定只截取一帧。

$ ffmpeg \
-ss 00:02:24 \
-i out.mp4 \
-vframes 1 -q:v 2 \
output.jpg

上面例子中,-vframes 1指定只截取一帧,-q:v 2表示输出的图片质量,一般是1到5之间(1 为质量最高)。

裁剪

裁剪(cutting)指的是,截取原始视频里面的一个片段,输出为一个新视频。可以指定开始时间(start)和持续时间(duration),也可以指定结束时间(end)。

$ ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]
$ ffmpeg -ss [start] -i [input] -to [end] -c copy [output]

下面是实际的例子。

$ ffmpeg -ss 00:01:50 -i out.mp4 -t 10.5(表示持续10.5秒)  -c copy   out11.mp4
$ ffmpeg -ss 2.5 -i out.mp4 -to 10(10s) -c copy out22.mp4

上面例子中,-c copy表示不改变音频和视频的编码格式,直接拷贝,这样会快很多。

为音频添加封面

有些视频网站只允许上传视频文件。如果要上传音频文件,必须为音频添加封面,将其转为视频,然后上传。

下面命令可以将音频文件,转为带封面的视频文件。

$ ffmpeg \
-loop 1 \ 
-i cover.jpg -i input.mp3 \
-c:v libx264 -c:a aac -b:a 192k -shortest \
output.mp4

上面命令中,有两个输入文件,一个是封面图片cover.jpg,另一个是音频文件input.mp3-loop 1参数表示图片无限循环,-b:a 参数表示转换音频码率为192k, -shortest参数表示音频文件结束,输出视频就结束。

图片或视频加滤镜
# 模糊滤镜
$ ffmpeg -y -i output.jpg -vf boxblur=7 out1.jpg  #给图片添加滤镜
$ ffmpeg -y -i out.mp4 -vf boxblue=1 out222.mp4   #给视频添加滤镜

#变色
$ ffmpeg -y -i output.jpg -vf colorbalance=rm=1 colorbalance1.jpg # 调整rgb某个维度的权重实现变色。
$ ffmpeg -y -i output.jpg -vf colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3 colorchannelmixer1.jpg # 对rgba四个通道进行重新计算,并分别给定权重比例。
$ ffmpeg -i output.jpg -vf hue=h=30:s=1 hue1.jpg # 改变色调,相当在调色板上调色
$ ffmpeg -i output.jpg -vf lutyuv="y=negval:u=negval:v=negval" lutyuv1.jpg # lutyuv用于yuv颜色空间
$ ffmpeg -i output.jpg -vf negate=0 negate1.jpg # 反转
$ ffmpeg -i output.jpg -vf swapuv swapuv1.jpg  # UV 互换
$ ffmpeg -i output.jpg -vf crop=w=200:h=300:x=500:y=800 crop1.jpg # 裁剪

boxblur参数设置添加滤镜,后面的数值7表示滤镜的程度

添加水印
$ ffmpeg -i out.mp4 -i output.jpg -filter_complex "[1:v] scale=176:144 [logo];[0:v][logo]overlay=x=0:y=0" out555.mp4 #给视频添加图片水印
$ ffmpeg -i out.mp4 -vf "drawtext=fontfile='C\:\\Windows\\fonts\\Arial.ttf':fontsize=100:fontcolor=white:alpha=0.3:text='%{localtime\:%Y\-%m\-%d %H:%M:%S}':y=h-line_h-100:x=(w-text_w)/2" output22.mp4 #添加文字水印 需要指明字体
$ ffmpeg -i out.mp4 -i output.jpg -filter_complex "[1:v] scale=176:144 [logo];[0:v][logo]overlay=x=0:y=0" out.mp4
$ ffmpeg -i out.mp4 -vf drawtext="fontsize=100:text='我是水印':fontfile='C\:\\Windows\\fonts\\Arial.ttf':fontcolor=green:enable=lt(mod(t\,3)\,1)" interval-sy.mp4
# t 时间,s
# mod(t\,2) 计算t%2
# lt(mod(t\,2)\,1) 如果mod(t\,2)<1,返回1,否则返回0
# enable=lt(mod(t\,2)\,1) 每隔1s显示一次水印,enable=lt(mod(t\,3)\,1) 每隔3s.

添加字幕
# 第一步 用you-get下载B站视频
# 第二步 用 danmaku2ass.py 转换弹幕 https://github.com/m13253/danmaku2ass
# 第三步 可以用ffmpeg转换弹幕
$ ffpmeg -i input.ass input.srt

# 第四步 给视频添加字幕或弹幕 字幕可添加多个
$ ffmpeg -i input.mp4 -vf subtitles=input.ass output.mp4
视频画中画
$ ffmpeg -re -i input.mp4 -vf "movie=output.mp4,scale = 480*320[test]; [in][test] overlay [out]" -vcodec libx264 videoInvideo.mp4
多宫格
$ ffmpeg -y -i input.mp4 -i input.mp4 \
-i input.mp4 -i input.mp4 \
-filter_complex "nullsrc=size=640x480[base]; \
[0:v]scale=320x240[topleft]; \
[1:v]scale=320x240[topright]; \
[2:v]scale=320x240[bottomleft]; \
[3:v]scale=320x240[bottomright]; \
[base][topleft]overlay=shortest=1[tmp1]; \
[tmp1][topright]overlay=shortest=1:x=320[tmp2]; \
[tmp2][bottomleft]overlay=shortest=1:y=240[tmp3]; \
[tmp3][bottomright]overlay=shortest=1:x=320:y=240" \
-vcodec libx264 9_video_filtered.flv
// nullsrc创建画布
视频压缩
$ ffmpeg -i input.mp3 -ab 128 output.mp3 // 压缩音频

$ ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4 // 压缩视频
视频直播推流
// 录制视频保存在本地
$ ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -f h264 -r 30 ~/Downloads/test.h264

// 推送已下载在文件夹的视频
ffmpeg -re -i ~/Downloads/xxx.mp4  -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/live

// 录制桌面
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:1935/rtmplive/room

// 录制桌面和麦克风
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/live/room

// 录制桌面和麦克风,并打开摄像头拍摄
ffmpeg -f avfoundation -framerate 30 -i "1:0" \-f avfoundation -framerate 30 -video_size 640x480 -i "0" \-c:v libx264 -preset ultrafast \-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:2016/rtmplive/room

参考资料:初探视频原理和FFmpeg

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值