ffmpeg的基本用法

Posted 加班猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg的基本用法相关的知识,希望对你有一定的参考价值。

title: ffmpeg的基本用法
categories:[ffmpeg]
tags:[音视频编程]
date: 2021/11/18

作者:hackett 微信公众号:加班猿

一、ffmpeg的安装

1.Centos安装

FFmpeg 在默认的CentOS 8 源仓库中没有提供。你可以选择通过源文件编译安装 FFmpeg,或者使用dnf工具从Negativo17源仓库中安装。我们将会使用第二个选项。

完成下面的步骤,在 CentOS 8 上安装 FFmpeg:

1.Negativo17软件源依赖EPEL 和 PowerTools 软件源。以 root 或者其他有 sudo 权限的用户身份运行下面的命令,启用必须的软件源:

sudo dnf install epel-release
sudo yum config-manager --set-enabled PowerTools
sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo

2.一旦软件源被启用,安装FFmpeg:

sudo dnf install ffmpeg

3.通过检测版本号,验证FFmpeg安装:

ffmpeg -version

4.Negativo17 软件源中的ffmpeg当前版本是4.2.5

ffmpeg version 4.2.5 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 8 (GCC)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librsvg --enable-libsrt --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-libmfx --enable-runtime-cpudetect
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100
libpostproc    55.  5.100 / 55.  5.100

2.Windows安装

官网地址:http://ffmpeg.org/download.html

选择Windows的版本,跳转到GitHub下载地址:https://github.com/BtbN/FFmpeg-Builds/releases

下载最新的带share版本的,就是已经编译好了的,不用自己再编译 ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4.zip

解压出来放到安装软件的盘符,添加环境变量即可 D:\\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\\bin

不重启使Windows环境变量生效,cmd,输入 set path = D:\\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\\bin

重启命令提示符终端,测试效果: cmd,输入 ffmpeg -version得到如下效果即为成功安装

二、ffmpeg主要组成部分

1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;
2、libavcodec:用于各种类型声音/图像编解码;
3、libavutil:包含一些公共的工具函数;
4、libswscale:用于视频场景比例缩放、色彩映射转换;
5、libpostproc:用于后期效果处理;
6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;
7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;
8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

在这组成部分中,需要熟悉基础概念有

容器(Container)
容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
流(Stream)
是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
帧(Frame)
帧代表一幅静止的图像,分为I帧,P帧,B帧。
编解码器(Codec)
是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
复用/解复用(mux/demux)
把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

查看帮助

可用的bit流 :ffmpeg –bsfs
可用的编解码器:ffmpeg –codecs
可用的解码器:ffmpeg –decoders
可用的编码器:ffmpeg –encoders
可用的过滤器:ffmpeg –filters
可用的视频格式:ffmpeg –formats
可用的声道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的协议:ffmpeg -protocals

三、ffmpeg常用命令

使用 ffmpeg 命令基本形式是:

usage: ffmpeg [options] [[infile options] -i infile]... [outfile options] outfile...
usage: ffmpeg [全局参数] [输入文件参数] -i 输入文件地址 ... [输出文件参数] 输出文件地址 ...

主要全局参数:

-i 设定输入流 
-f 设定输出格式 
-ss 开始时间 

输出视频文件参数:

-b 设定视频流量(码率),默认为200Kbit/s 
-r 设定帧速率,默认为25 
-s 设定画面的宽与高 
-aspect 设定画面的比例 
-vn 不处理视频 
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器 
-qscale 0 保留原始的视频质量

输出音频文件参数:

-ar 设定采样率 
-ac 设定声音的Channel数 
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 
-an 不处理音频

1.获取媒体文件信息

ffmpeg -i file_name
ffmpeg -i video_file.mp4
ffmpeg -i audio_file.mp3
ffmpeg -i video_file.mp4 -hide_banner #hide_banner 来隐藏掉ffmpeg本身的信息
ffmpeg -i audio_file.mp3 -hide_banner

2.转换媒体文件

ffmpeg 最让人称道常用的恐怕就是你轻而易举的在不同媒体格式之间进行自由转换了。你是要指明输入和输出文件名就行了, ffmpeg 会从后缀名猜测格式,这个方法同时适用于视频和音频文件

下面是一些例子:

ffmpeg -i video_input.mp4 video_output.avi 
ffmpeg -i video_input.webm video_output.flv 
ffmpeg -i audio_input.mp3 audio_output.ogg 
ffmpeg -i audio_input.wav audio_output.flac

你也可以同时指定多个输出后缀:

ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg

这样会同时输出多个文件.

想看支持的格式,可以用:

ffmpeg -formats

同样的,你可以使用 -hide_banner 来省略一些程序信息。

你可以在输出文件前使用 -qscale 0 来保留原始的视频质量:

ffmpeg -i video_input.wav -qscale 0 video_output.mp4

3. 从视频中抽取音频

为了从视频文件中抽取音频,直接加一个 -vn 参数就可以了

ffmpeg -i video.mp4 -vn audio.mp3

这会让命令复用原有文件的比特率,一般来说,使用 -ab (音频比特率)来指定编码比特率是比较好的:

ffmpeg -i video.mp4 -vn -ab 128k audio.mp3

一些常见的比特率有 96k, 128k, 192k, 256k, 320k (mp3也可以使用最高的比特率)。

其他的一些常用的参数比如 -ar (采样率: 22050, 441000, 48000), -ac (声道数), -f (音频格式, 通常会自动识别的). -ab 也可以使用 -b:a 来替代. 比如:

ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3

4. 从视频中抽取视频(让视频静音)

和之前的要求类似,我们可以使用 -an 来获得纯视频(之前是 -vn)

ffmpeg -i video_input.mp4 -an -video_output.mp4
ffmpeg -i input.mp4 -vcodec copy -an output.mp4

Note: 这个 -an 标记会让所有的音频参数无效,因为最后没有音频会产生。

5. 从视频中提取图片

这个功能可能对很多人都挺有用,比如你可能有一些幻灯片,你想从里面提取所有的图片,那么下面这个命令就能帮你:

ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png

我们来解释一下这个命令:

-r 代表了帧率(一秒内导出多少张图像,默认25), -f 代表了输出格式(image2 实际上上 image2 序列的意思)。

最后一个参数 (输出文件) 有一个有趣的命名:它使用 %3d 来指示输出的图片有三位数字 (000, 001, 等等.)。你也可以用 %2d (两位数字) 或者 %4d (4位数字) ,只要你愿意,你可以随便实验 一下可以怎么写!

Note: 同样也有将图片转变为视频/幻灯片的方式,下面的高级应用中会讲到。

6. 更改视频分辨率或长宽比

ffmpeg 来说又是个简单的任务,你只需要使用 -s 参数来缩放视频就行了:

ffmpeg -i video_input.mov -s 1024x576 video_output.mp4

同时,你可能需要使用 -c:a 来保证音频编码是正确的:

ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov

你也可是使用**-aspect** 来更改长宽比:

ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4

Note: 在高级应用中还会提到更强大的方法

7. 为音频增加封面图片

有个很棒的方法把音频变成视频,全程使用一张图片(比如专辑封面)。当你想往某个网站上传音频,但那个网站又仅接受视频(比如YouTube, Facebook等)的情况下会非常有用。

下面是例子:

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4

只要改一下编码设置 (-c:v 是 视频编码, -c:a 是音频编码) 和文件的名称就能用了。

Note: 如果你使用一个较新的ffmpeg版本(4.x),你就可以不指定 -strict experimental

8. 为视频增加字幕

另一个常见又很容易实现的要求是给视频增加字母,比如一部外文电源,使用下面的命令:

ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4

当然,你可以指定自己的编码器和任何其他的音频视频参数。你可以阅读这篇文章来了解字幕相关内容 editing subtitles in Linux

9. 压缩媒体文件

压缩文件可以极大减少文件的体积,节约存储空间,这对于文件传输尤为重要。通过ffmepg,有好几个方法来压缩文件体积。

Note: 文件压缩的太厉害会让文件质量显著降低。

首先,对于音频文件,可以通过降低比特率(使用 -b:a-ab):

ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3
ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3

再次重申,一些常用的比特率有: 96k, 112k, 128k, 160k, 192k, 256k, 320k.值越大,文件所需要的体积就越大。

对于视频文件,选项就多了,一个简单的方法是通过降低视频比特率 (通过 -b:v):

ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4

Note: 视频的比特率和音频是不同的(一般要大得多)。

你也可以使用 -crf 参数 (恒定质量因子). 较小的crf 意味着较大的码率。同时使用 libx264 编码器也有助于减小文件体积。这里有个例子,压缩的不错,质量也不会显著变化:

ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4

crf 设置为20 到 30 是最常见的,不过您也可以尝试一些其他的值。

降低帧率在有些情况下也能有效(不过这往往让视频看起来很卡):

ffmpeg -i video_input.mp4 -r 24 video_output.mp4

-r 指示了帧率 (这里是 24)。

你还可以通过压缩音频来降低视频文件的体积,比如设置为立体声或者降低比特率:

ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4

Note: -strict -2-ac 2 是来处理立体声部分的。

10. 裁剪媒体文件(基础)

想要从开头开始剪辑一部分,使用T -t 参数来指定一个时间:

ffmpeg -i input_video.mp4 -t 5 output_video.mp4 
ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav

这个参数对音频和视频都适用,上面两个命令做了类似的事情:保存一段5s的输出文件(文件开头开始算)。上面使用了两种不同的表示时间的方式,一个单纯的数字(描述)或者 HH:MM:SS (小时, 分钟, 秒). 第二种方式实际上指示了结束时间。

也可以通过 -ss 给出一个开始时间,-to 给出结束时间:

ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav 
ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264 
ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg

可以看到 开始时间 (-ss HH:MM:SS), 持续秒数 (-t duration), 结束时间 (-to HH:MM:SS), 和开始秒数 (-s duration)的用法.

你可以在媒体文件的任何部分使用这些命令。

11.输出YUV420原始数据

对于一下做底层编解码的人来说,有时候常要提取视频的YUV原始数据。 怎么坐?很简答: ffmpeg -i input.mp4 output.yuv怎么样,是不是太简单啦?!!!哈哈(如果你想问yuv的数据,如何播放,我不会告诉你,RawPlayer挺好用的!!)

那如果我只想要抽取某一帧YUV呢? 简单,你先用上面的方法,先抽出jpeg图片,然后把jpeg转为YUV。 比如: 你先抽取10帧图片。 ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
结果:

-rw-rw-r-- 1 hackett hackett    296254  720 16:08 pic-001.jpeg
-rw-rw-r-- 1 hackett hackett    300975  720 16:08 pic-002.jpeg
-rw-rw-r-- 1 hackett hackett    310130  720 16:08 pic-003.jpeg
-rw-rw-r-- 1 hackett hackett    268694  720 16:08 pic-004.jpeg
-rw-rw-r-- 1 hackett hackett    301056  720 16:08 pic-005.jpeg
-rw-rw-r-- 1 hackett hackett    293927  720 16:08 pic-006.jpeg
-rw-rw-r-- 1 hackett hackett    340295  720 16:08 pic-007.jpeg
-rw-rw-r-- 1 hackett hackett    430787  720 16:08 pic-008.jpeg
-rw-rw-r-- 1 hackett hackett    404552  720 16:08 pic-009.jpeg
-rw-rw-r-- 1 hackett hackett    412691  720 16:08 pic-010.jpeg

然后,你就随便挑一张,转为YUV: ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv如果-s参数不写,则输出大小与输入一样。当然了,YUV还有yuv422p啥的,你在-pix_fmt 换成yuv422p就行啦!

12.视频添加logo

ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4

13.提取视频ES数据

ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264

14.视频编码格式转换

比如一个视频的编码是MPEG4,想用H264编码,咋办?

ffmpeg -i input.mp4 -vcodec h264 output.mp4

相反也一样

ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

15.添加字幕

语法 –vf subtitles=file

ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4

ffmpeg: 高级使用

现在该开始讲述一些高级的特性了(比如截屏等),让我们开始吧。

1. 分割媒体文件

前面已经讲述了如何裁剪文件,那么如何分割媒体文件呢?只需要为每个输出文件分别指定开始时间、结束或者持续时间就可以了。

看下面这个例子:

ffmpeg -i video.mp4 -t 00:00:30 video_1.mp4 -ss 00:00:30 video_2.mp4

语法很简单,为第一个文件指定了 -t 00:00:30 作为持续时间(第一个部分是原始文件的前30秒内容),然后指定接下来的所有内容作为第二个文件(从第一部分的结束时间开始,也就是 00:00:30)。

你可以任意指定多少个部分,尝试一下吧,这个功能真的很厉害,同时它也适用用音频文件。

2. 拼接媒体文件

ffmpeg 也可以进行相反的动作:把多个文件合在一起。

为了实现这一点,你得用自己顺手的编辑器来创建一个文本文件。

因为我喜欢使用终端,所以这里我用了 touchvim. 文件名无关紧要,这里我用 touch 命令创建 video_to_join.txt 文件:

touch videos_to_join.txt

现在,使用 vim 编辑它:

vim videos_to_join.txt

你可以使用任何你喜欢的工具,比如nano,gedit等等。

在文件内容中, 输入您想拼接的文件的完整路径(文件会按照顺序拼合在一起),一行一个文件。确保他们拥有相同的后缀名。下面是我的例子:

/home/ubuntu/Desktop/video_1.mp4
/home/ubuntu/Desktop/video_2.mp4
/home/ubuntu/Desktop/video_3.mp4

保存这个文件,同样这个方法适用与任何音频或者视频文件。

然后使用下面的命令:

ffmpeg -f concat -i join.txt output.mp4

Note: 使用的输出文件的名称是 output.mp4, 因为我的输入文件都是mp4的 。

这样,你 videos_to_join.txt 里的所有文件都会被拼接成一个独立的文件了。

3. 将图片转变为视频

这会告诉你如何将图片变成幻灯片秀,同时也会告诉你如何加上音频。

首先我建议您将所有的图片放到一个文件夹下面,我把它们放到了 my_photos 里,同时图片的后缀名最好是 .png 或者 .jpg, 不管选那个,他们应该是同一个后缀名,否则ffmpeg可能会工作的不正常,您可以很方便的把 .png 转变为 .jpg (或者倒过来也行)。

我们这次转换的格式 (-f) 应该被设置为 image2pipe. 你必须使用使用连词符()来指明输入。 image2pipe 允许你使用管道 (在命令间使用 |)的结果而不是文件作为ffmpeg的输入。命令结果便是将所有图片的内容逐个输出,还要注意指明视频编码器是 copy (-c:v copy) 以正确使用图片输入:

cat my_photos/* | ffmpeg -f image2pipe -i - -c:v copy video.mkv

如果你播放这个文件,你可能会觉得只有一部分图片被加入了,事实上所有的图片都在,但是ffmpeg 播放它们的时候太快了,默认是23fps,一秒播放了23张图片。

你应该指定帧率 (-framerate) :

cat my_photos/* | ffmpeg -framerate 1 -f image2pipe -i - -c:v copy video.mkv 

在这个例子里,把帧率设置为1,也就是每帧(每张图)会显示1秒。

为了加一些声音,可以使用音频文件作为输入 (-i audo_file) 并且设定copy音频编码 (-c:a copy). 你可以同时为音频和视频设定编码器,在输出文件前设置就可以了。你要计算一下音频文件的长度和图片张数,已确定合适的帧率。比如我的音频文件是22秒,图片有9张,那么帧率应该是 9 / 22 大约0.4,所以我这么输入命令:

cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv

4. 录制屏幕

通过 ffmpeg 录制屏幕同样没有困难的,将格式(-f) 设定为x11grab. 他就会抓取你的XSERVER. 输入的话可以这是屏幕编号(一般都是0:0). 抓取是从左上角开始计算的,可以指定屏幕分辨率 (-s). 我的屏幕是 1920×1080. 注意屏幕分辨率硬在输入之前指定t:

ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4

q 或者 CTRL+C 以结束录制屏幕。

小技巧:你可以通过命令获得真实的分辨率而不是写死一个固定的大小

-s $(xdpyinfo | grep dimensions | awk 'print $2;')

完整的命令这么写:

ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk 'print $2;') -i :0.0 output.mp4

5. 录制摄像头

从摄像头录制就更简单了,linux上设备都是在/dev中的,比如 /dev/video0, /dev/video1, etc.:

ffmpeg -i /dev/video0 output.mkv

同样, q 或者 CTRL+C 来结束录制。

6. 录制声音

Linux上同时是使用 ALSApulseaudio 来处理声音的。 ffmpeg 可以录制两者,不过我要特别说明 pulseaudio, 因为 Debian 系列的发行版默认用了它。命令如下:

pulseaudio, 你必须强制指定(-f) alsa 然后指定 default 作为输入t (-i default):

ffmpeg -f alsa -i default output.mp3

Note: 在你系统音频设置里,应该能看到默认的录音设备。

我经常玩吉他,我平时使用一个专业音频设备才能录制声音,当我发现ffmpeg也可以很轻松的录制的时候颇为惊讶。

录制小贴士

对于录制任务来说,通常都需要指定编码器以及帧率,之前讲过的参数当然也可以用到这里来!

ffmpeg -i /dev/video0 -f alsa -i default -c:v libx264 -c:a flac -r 30 output.mkv

有时候不直接录音,而是在录屏/录像的时候给一个音频文件,那么可以这么做:

ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk 'print $2;') -i :0.0 -i audio.wav -c:a copy output.mp4

Note: ffmpeg 使用片段录取,所有有时候非常短的录制可能不会保存文件。我建议录地可以稍微长一些(然后后期裁剪),已保证录制的文件成功写到磁盘上。

7.截图

每隔一秒截一张图

 ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png

每隔20秒截一张图

 ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png

ffmpeg中的过滤器的基本使用

过滤器ffmpeg 中最为强大的功能。在ffmepg中有数不甚数的过滤器存在,可以满足各种编辑需要。因为过滤器实在太多了,这里只会简单讲述几个常用的。

使用 过滤的基本结构是:

ffmpeg -i input.mp4 -vf "filter=setting_1=value_1:setting_2=value_2,etc" output.mp4
ffmpeg -i input.wav -af "filter=setting_1=value_1:setting_2=value_2,etc" output.wav

可以指定视频过滤器 (-vf, -filter:v的简写) 和 音频过滤器 (-af, -filter:a的简写). 过滤器的内容写到双引号里面 () 并且可以使用逗号(,)连接。你可以使用任意数量的过滤器(我写了个etc代表更多的,这不是做一个真实的过滤器)。

过滤器设定的通常格式是:

filter=setting_2=value_2:setting_2=value_2

过滤器不同的值使用冒号分割。

你甚至可以在值里面使用进行数学符号计算。

Note: 参考 ***ffmpeg 过滤器手册****.*查看更多高级用法

这里举几个例子来说明视频和音频的过滤器。

1. 视频缩放

这是个简单过滤器,设定里只有 widthheight:

ffmpeg -i input.mp4 -vf "scale=w=800:h=600" output.mp4

我说过你可以使用数学运算来给值:

ffmpeg -i input.mkv -vf "scale=w=1/2*in_w:h=1/2*in_h" output.mkv

很明显,这个命令让输入的尺寸变成了输入尺寸(in_w, in_h)的1/2.

2. 视频裁剪

类似缩放,这个设定也有 widthheight ,另外可以指定裁剪的原点(默认是视频的中心)

ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4 
ffmpeg -i input.mkv -vf "crop=w=400:h=400" output.mkv

第二个命令裁剪原点是视频的中心点(因为我没有给x和y坐标),第一个命令会从左上角开始裁剪 (x=0:y=0).

这里也有一个使用数学计算的例子:

ffmpeg -i input.mkv -vf "crop=w=3/4*in_w:h=3/4*in_h" output.mkv

这会把视频裁剪剩下原大小的3/4/。

3. 视频旋转

你可以指定一个弧度,顺时针旋转视频。为了让计算简单一些,你可以给角度然后乘以 PI/180:

ffmpeg -i input.avi -vf "rotate=90*PI/180" 
ffmpeg -i input.mp4 -vf "rotate=PI"

第一个命令将视频顺时针旋转90°,第二个则是上下颠倒了视频(翻转了180°)。

4. 音频声道重映射

有的时候,你的音频只有右耳可以听到声音,那么这个功能就很有用了。你可以让声音同时在左右声道出现:

ffmpeg -i input.mp3 -af "channelmap=1-0|1-1" output.mp3

这将右声道(1)同时映射到左(0)右(1)两个声道(左边的数字是输入,右边的数字是输出)。

5. 更改音量

你可以将音量大小乘以一个实数(可以是整数也可以不是),你只需要给出那个数大小就行了。

ffmpeg -i input.wav -af "volume=1.5" output.wav 
ffmpeg -i input.ogg -af "volume=0.75" output.ogg

第一个将音量变为1.5倍,第二个则让音量变成了原来的1/4那么安静。

技巧:更改播放速度

这里会介绍视频(不影响音频)和音频的过滤器。

  1. 视频

视频过滤器是 setpts (PTS = presentation time stamp). 这个参数以一种有趣的方式工作,因为我们修改的是PTS,所以较大的数值意味着较慢的播放速度,反之亦然:

ffmpeg -i input.mkv -vf "setpts=0.5*PTS" output.mkv 
ffmpeg -i input.mp4 -vf "setpts=2*PTS" output,mp4

第一个命令让播放速度加倍了,第二个则是让播放速度降低了一半。

2. 音频

这里的过滤器是 atempo. 这里有个限制,它只接受 0.5(半速) 到 2 (倍速)之间的值。为了越过这个限制,你可以链式使用这个过滤器:

ffmpeg -i input.wav -af "atempo=0.75" output.wav 
ffmpeg -i input.mp3 -af "atempo=2.0,atempo=2.0" ouutput.mp3

第一个命令让音频速度慢了1/4,第二个则是加速到原来的4(2*2)倍。

Note: 如果想在同一个命令中同时修改视频和音频的速度,你得查看一下 filtergraphs.

如果你觉得文章还不错,可以给个"三连"

我是加班猿,我们下期见

ffmpeg基本用法

FFmpeg

FFmpeg 基本用法

本课要解决的问题

1.FFmpeg的转码流程是什么?

2.常见的视频格式包含哪些内容吗?

3.如何把这些内容从视频文件中抽取出来?

4.如何从一种格式转换为另一种格式?

5.如何放大和缩小视频?

6.如何旋转,翻转,填充,裁剪,模糊,锐化视频?

7.如何给视频加logo,删除logo?

8.如何给视频加文本,动态文本?

9.如何处理图片?

10.如何录像,添加动态logo,截图,马赛克视频?

第一部分

基础

术语

容器(Container)

容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。

流(Stream)

是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。

帧(Frame)

帧代表一幅静止的图像,分为I帧,P帧,B帧。

编解码器(Codec)

是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)

复用/解复用(mux/demux)

把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)

把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

 

 

简介

 

FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。

 

FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。

组成

1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;

2、libavcodec:用于各种类型声音/图像编解码;

3、libavutil:包含一些公共的工具函数;

4、libswscale:用于视频场景比例缩放、色彩映射转换;

5、libpostproc:用于后期效果处理;

6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;

7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;

8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

 

FFmpeg处理流程

过滤器(Filter)

在多媒体处理中,filter的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。

语法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…

过滤器图link label :是标记过滤器的输入或输出的名称

1.视频过滤器 -vf

如testsrc视频按顺时针方向旋转90度

ffplay -f lavfi -i testsrc -vf transpose=1

如testsrc视频水平翻转(左右翻转)

ffplay -f lavfi -i testsrc -vf hflip

2.音频过滤器 -af

实现慢速播放,声音速度是原始速度的50%

ffplay p629100.mp3 -af atempo=0.5

 

如何实现顺时针旋转90度并水平翻转? 

过滤器链(Filterchain)

基本语法

Filterchain = 逗号分隔的一组filter

语法:“filter1,filter2,filter3,…filterN-2,filterN-1,filterN”

顺时针旋转90度并水平翻转

ffplay -f lavfi -i testsrc -vf transpose=1,hflip

 

 

 

 

如何实现水平翻转视频和源视频进行比较? 看过滤器链是如何实现的。

 

 

 

 

 

 

过滤器链(Filterchain)

第一步: 源视频宽度扩大两倍。

ffmpeg -i jidu.mp4 -t 10 -vf pad=2*iw output.mp4

第二步:源视频水平翻转

ffmpeg -i jidu.mp4 -t 10 -vf hflip output2.mp4

第三步:水平翻转视频覆盖output.mp4

ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4

是不是很复杂?

用带有链接标记的过滤器图(Filtergraph)只需一条命令。

过滤器图(Filtergraph)

基本语法

Filtergraph = 分号分隔的一组filterchain

“filterchain1;filterchain2;…filterchainN-1;filterchainN”

 

 

Filtergraph的分类

1、简单(simple) 一对一

2、复杂(complex)多对一, 多对多

过滤器图(Filtergraph)

简单过滤器图处理流程:

 

 

复杂过滤器图处理流程:

 

 

 

从图中可以发现复杂过滤器图比简单过滤器图少2个步骤,效率比简单高,ffmpeg建议尽量使用复杂过滤器图。

回答上面提的问题,实现水平翻转视频和源视频进行比较

 

过滤器图(Filtergraph)

用ffplay直接观看结果:

ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w

 

 

 

 

F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]

F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].

F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].

F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.

 

 

选择媒体流

一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流,如何从容器中抽取各种流呢?

语法:

-map file_number:stream_type[:stream_number]

 

这有一些特别流符号的说明:

1、-map 0 选择第一个文件的所有流

2、-map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等。

3、特殊参数-an,-vn,-sn分别排除所有的音频,视频,字幕流。

 

注意:文件序号和流序号从0开始计数。

选择媒体流

第二部分

查看帮助

帮助

FFmpeg工具有一个巨大的控制台帮助。下表描述了可用的一些选项,斜体字表示要被替换的项,ffplay和ffprobe也有一些类似的选项。

 

帮助

可用的bit流 :ffmpeg –bsfs

可用的编解码器:ffmpeg –codecs

可用的解码器:ffmpeg –decoders

可用的编码器:ffmpeg –encoders

可用的过滤器:ffmpeg –filters

可用的视频格式:ffmpeg –formats

可用的声道布局:ffmpeg –layouts

可用的license:ffmpeg –L

可用的像素格式:ffmpeg –pix_fmts

可用的协议:ffmpeg -protocals

 

第三部分

码率、帧率和文件大小

概述

        码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。

 

帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。

码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。

帧率

1、用 -r 参数设置帧率

ffmpeg –i input –r fps output

2、用fps filter设置帧率

ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm

帧率的预定义值:

 

 

 

 

 

例如设置码率为29.97fps,下面三种方式具有相同的结果:

ffmpeg -i input.avi -r 29.97 output.mpg

ffmpeg -i input.avi -r 30000/1001 output.mpg

ffmpeg -i input.avi -r netsc output.mpg

 

码率、文件大小

设置码率 –b 参数

-b 

ffmpeg -i film.avi -b 1.5M film.mp4

 

音频:-b:a     视频: - b:v

设置视频码率为1500kbps

ffmpeg -i input.avi -b:v 1500k output.mp4

 

控制输出文件大小

-fs (file size首字母缩写) 

ffmpeg -i input.avi -fs 1024K output.mp4

计算输出文件大小

(视频码率+音频码率) * 时长 /8 = 文件大小K

 

 

第四部分

调整视频分辨率

调整视频分辨率

1、用-s参数设置视频分辨率,参数值wxh,w宽度单位是像素,h高度单位是像素

ffmpeg -i input_file -s 320x240 output_file

 

2、预定义的视频尺寸

下面两条命令有相同效果

ffmpeg -i input.avi -s 640x480 output.avi

ffmpeg -i input.avi -s vga output.avi

 

下表列出了所有的预定义尺寸

 

 

 

 

Scale filter调整分辨率

Scale filter的优点是可以使用一些额外的参数

语法:

Scale=width:height[:interl={1|-1}]

下表列出了常用的额外参数

举例

下面两条命令有相同效果

ffmpeg -i input.mpg -s 320x240 output.mp4 

ffmpeg -i input.mpg -vf scale=320:240 output.mp4

 

对输入视频成比例缩放

改变为源视频一半大小

ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4

改变为原视频的90%大小:

ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4

 

举例

在未知视频的分辨率时,保证调整的分辨率与源视频有相同的横纵比。

宽度固定400,高度成比例:

ffmpeg -i input.avi -vf scale=400:400/a

ffmpeg -i input.avi -vf scale=400:-1

 

相反地,高度固定300,宽度成比例:

ffmpeg -i input.avi -vf scale=-1:300

ffmpeg -i input.avi -vf scale=300*a:300

 

第五部分

裁剪/填充视频

裁剪视频crop filter

从输入文件中选取你想要的矩形区域到输出文件中,常见用来去视频黑边。

语法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]

 

举例

裁剪输入视频的左三分之一,中间三分之一,右三分之一:

ffmpeg -i input -vf crop=iw/3:ih :0:0 output 

ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output 

ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output

裁剪帧的中心

当我们想裁剪区域在帧的中间时,裁剪filter可以跳过输入x和y值,他们的默认值是

Xdefault  = ( input width - output width)/2 

Ydefault  = ( input height - output height)/2

ffmpeg -i input_file -v crop=w:h output_file

裁剪中间一半区域:

ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi

 

举例

比较裁剪后的视频和源视频比较

ffplay -i jidu.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2*iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w*2.4:40

 

 

自动检测裁剪区域

cropdetect  filter 自动检测黑边区域

ffplay jidu.mp4 -vf cropdetect

 

 

 

 

然后用检测到的值来裁剪视频

ffplay jidu.mp4 –vf crop=672:272:0:54

 

 

填充视频(pad)

在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比

语法:pad=width[:height:[:x[:y:[:color]]]]

 

 

举例

创建一个30个像素的粉色宽度来包围一个SVGA尺寸的图片:

ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg

?

 

 

 

同理可以制作testsrc视频用30个像素粉色包围视频

ffplay  -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink

 

4:3到16:9

一些设备只能播放16:9的横纵比,4:3的横纵比必须在水平方向的两边填充成16:9,

 

高度被保持,宽度等于高度乘以16/9,x(输入文件水平位移)值由表达式(output_width - input_width)/2来计算。

 

4:3到16:9的通用命令是:

ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output

 

举例

ffplay  -f lavfi -i testsrc -vf pad=ih*16/9:ih:(ow-iw)/2:0:pink

 

16:9到4:3

为了用4:3的横纵比来显示16:9的横纵比,填充输入文件的垂直两边,宽度保持不变,高度是宽度的3/4,y值(输入文件的垂直偏移量)是由一个表达式(output_height-input_height)/2计算出来的。

 

16:9到4:3的通用命令:

ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output

 

举例

ffplay  -f lavfi -i testsrc=size=320x180 -vf pad=iw:iw*3/4:0:(oh-ih)/2:pink

 

 

第六部分

翻转和旋转

翻转

水平翻转语法: -vf hflip

ffplay -f lavfi -i testsrc -vf hflip

 

 

 

 

垂直翻转语法:-vf vflip

ffplay -f lavfi -i testsrc -vf vflip

 

旋转

语法:transpose={0,1,2,3}

0:逆时针旋转90°然后垂直翻转

1:顺时针旋转90°

2:逆时针旋转90°

3:顺时针旋转90°然后水平翻转

第七部分

模糊,锐化

模糊

语法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]

ffplay -f lavfi -i testsrc -vf  boxblur=1:10:4:10

注意:luma_r和alpha_r半径取值范围是0~min(w,h)/2, chroma_r半径的取值范围是0~min(cw/ch)/2

锐化

语法:-vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount

所有的参数是可选的,默认值是5:5:1.0:5:5:0.0

l_msize_x:水平亮度矩阵,取值范围3-13,默认值为5

l_msize_y:垂直亮度矩阵,取值范围3-13,默认值为5

l_amount:亮度强度,取值范围-2.0-5.0,负数为模糊效果,默认值1.0

c_msize_x:水平色彩矩阵,取值范围3-13,默认值5

c_msize_y:垂直色彩矩阵,取值范围3-13,默认值5

c_amount:色彩强度,取值范围-2.0-5.0,负数为模糊效果,默认值0.0

举例

使用默认值,亮度矩阵为5x5和亮度值为1.0

ffmpeg -i input -vf unsharp output.mp4

高斯模糊效果(比较强的模糊):

ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2

 

第八部分

覆盖(画中画)

覆盖

语法:overlay[=x[:y]

所有的参数都是可选,默认值都是0

 

举例

Logo在左上角

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

 

举例

右上角:

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w  pair2.mp4

左下角:

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h  pair2.mp4

右下角:

ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h  pair2.mp4

 

删除logo

语法:-vf delogo=x:y:w:h[:t[:show]]

x:y 离左上角的坐标

w:h  logo的宽和高

t: 矩形边缘的厚度默认值4

show:若设置为1有一个绿色的矩形,默认值0.

ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0

第九部分

添加文本

添加文本

语法:

drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]

常用的参数值

x:离左上角的横坐标

y: 离左上角的纵坐标

fontcolor:字体颜色

fontsize:字体大小

text:文本内容

textfile:文本文件

t:时间戳,单位秒

n:帧数开始位置为0

draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数

简单用法

1、在左上角添加Welcome文字

ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom

2、在中央添加Good day

ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text=‘Goodday‘:x=(w-tw)/2:y=(h-th)/2"

3、设置字体颜色和大小

ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text=‘Happy Holidays‘:x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"

 

动态文本

用 t (时间秒)变量实现动态文本

1、顶部水平滚动

ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text=‘Dynamic RTL text‘:x=w-t*50:fontcolor=darkorange:fontsize=30"

2、底部水平滚动

ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"

3、垂直从下往上滚动

ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“

想实现右上角显示当前时间?

 

 

动态文本

在右上角显示当前时间 localtime

ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=‘%{localtime\:%H\\\:%M\\\:%S}‘“

 

每隔3秒显示一次当前时间

ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=‘%{localtime\:%H\\\:%M\\\:%S}‘:enable=lt(mod(t\,3)\,1)"

 

第十部分

图片处理

图片支持

FFmpeg支持绝大多数图片处理, 除LJPEG(无损JPEG)之外,其他都能被解码,除了EXR,PIC,PTX之外,所有的都能被编码。

截取一张图片使用 –ss(seek from start)参数.

ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg

从视频中生成GIF图片

ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif

转换视频为图片(每帧一张图)

ffmpeg -i clip.avi frame%4d.jpg

图片转换为视频

ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4

 

裁剪、填充

和视频一样,图片也可以被裁剪和填充

裁剪

ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png

填充

ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg

 

翻转,旋转,覆盖

和视频一样图片同样能翻转,旋转和覆盖

翻转

ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg

ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg

旋转

ffmpeg -i image.png -vf transpose=1 image_rotated.png

覆盖

ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png 

ffmpeg -f lavfi -i smptebars smpte.png 

ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2  rgb_smpte.png

 

第十一部分

其他高级技巧

屏幕录像

显示设备名称

ffmpeg -list_devices 1 -f dshow -i dummy

调用摄像头

ffplay -f dshow  -i video="Integrated Camera"

保存为文件

ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4

 

添加字幕subtitles

语法 –vf subtitles=file

 

ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4

视频颤抖、色彩平衡

视频颤抖

ffplay –i jidu.mp4 -vf 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)

 

色彩平衡

ffplay -i jidu.mp4 -vf curves=vintage

色彩变幻

ffplay -i jidu.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1“

彩色转换黑白

ffplay -i jidu.mp4 -vf lutyuv="u=128:v=128"

设置音频视频播放速度

3倍视频播放视频

ffplay -i jidu.mp4 -vf setpts=PTS/3

?速度播放视频

ffplay -i jidu.mp4  -vf setpts=PTS/(3/4)

2倍速度播放音频

ffplay -i speech.mp3 -af atempo=2

 

问题:视频和音频同时3/4慢速播放

截图

每隔一秒截一张图

ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png

每隔20秒截一张图

ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png

 

注意:ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一张图。

多张截图合并到一个文件里(2x3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图

ffmpeg? -i jidu.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png

 

马赛克视频

马赛克视频

用多个输入文件创建一个马赛克视频:

ffmpeg -i jidu.mp4 -i jidu.flv -i "Day By Day SBS.mp4" -i "Dangerous.mp4" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv

 

Logo动态移动

1、2秒后logo从左到右移动:

ffplay -i jidu.mp4  -vf movie=logo.png[logo];[in][logo]overlay=x=‘if(gte(t\,2)\,((t-2)*80)-w\,NAN)‘:y=0

 

2、2秒后logo从左到右移动后停止在左上角

ffplay -i jidu.mp4  -vf movie=logo.png[logo];[in][logo]overlay=x=‘if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)‘:y=0

3、每隔10秒交替出现logo。

ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4

 

资料

FFmpeg官网: http://www.ffmpeg.org

FFmpeg doc : http://www.ffmpeg.org/documentation.html

FFmpeg wiki : https://trac.ffmpeg.org/wiki

FAQ

Thanks!

以上是关于ffmpeg的基本用法的主要内容,如果未能解决你的问题,请参考以下文章

FFMPEG 音频封装编码

音频 MP2 编码和解码产生半数据 C++ 和 FFMPEG

FFmpeg解封装解码音频和视频(分别使用OpenGL和OpenAL播放)

FFmpeg学习1:视频解码

ffmpeg

FFMPEG 音频解码和绘制波形