15.图像处理

虽然FFmpeg工具的主要用途与音频和视频有关,但ffmpeg可以对各种图像格式进行解码和编码,并且许多图像相关任务可以快速完成。 在网络服务器上使用ffmpeg可创建Web图像编辑器,支持FFmpeg的网络主机相信信息位于Web视频一章。

支持的图像格式

表格中列出了FFmpeg支持的图像格式及其特征后缀。 除LJPEG(无损JPEG)以外的所有这些文件类型都可以解码,除EXR,PIC和PTX之外都可以编码。

FFmpeg支持的图像格式

扩展名 编码 解码 描述
.Y.U.V X X 每个组件的一行文件
BMP X X 微软BMP图像
DPX X X 数码照片交换
EXR X OpenEXR
GIF X X 动画gif是未压缩的
JPG X X 不支持渐进式JPEG
JP2 X X JPEG 2000
JLS X X JPEG-LS
LJPG X 无损的JPEG
PAM X X PAM是带有alpha支持的PNM扩展
PBM X X 便携式位图图像
PCX X X PC画笔
PGM X X 便携式GrayMap形象
PGMYUV X X PGM与U和V的分量在YUV 4:2 0
PIC X Pictor/PC Paint
PNG X X 便携式网络图形
PPM X X 便携式PixelMap形象
PTX X V.Flash PTX格式
SGI X X SGI RGB图像格式
RAS X X Sun Rasterfile图像格式
TIFF X X YUV, JPEG和一些扩展还没有被支持
TGA X X Truevision Targa 图像格式
XBM X X X位图图像格式
XFace X X XFace图像格式
XWD X X X窗口转储图像格式

创建图像

从视频截图

为了将一个视频帧从指定的时刻保存到图像中,使用-ss(从start开始)选项来指定从开始的延迟。在时间t中截图的语法

  1. ffmpeg -i input -ss t image.type

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -ss 20 /Users/zhangfangtao/Desktop/image.jpg

结果生成了第二十秒的一张图片:

15.图像处理 - 图1

背后的视频正好处在20秒钟的位置

-ss选项也可以在输入文件之前使用,但结果不太准确。例如,从文件视频中截取1小时23分45秒的截图。avi,我们可以使用命令:

  1. ffmpeg -i videoclip.avi -ss 01:23:45 image.jpg

从视频动画gif

视频文件是从可以保存到GIF动画帧的帧中创建的,这是一种经常在web上以条幅和动画形式使用的图像类型。因为帧是没有压缩的,所以只有在较短的视频中才有用,否则GIF动画文件的文件大小就会非常大。例如,要将一个短的SWF文件转换为GIF动画,以便为没有Flash插件的用户创建一个替代文件,我们可以使用该命令(必须将像素格式设置为rgb24):

  1. ffmpeg -i promotion.swf -pix_fmt rgb24 promotion.gif

我的测试命令:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -pix_fmt rgb24 /Users/zhangfangtao/Desktop/test.gif

  • 结果就是生成了一个gif图

来自FFmpeg视频源的图像

另一个创建图像的选项是使用内置的视频源,在表中描述:

15.图像处理 - 图2

名称 描述 图片
color 提供以其名称或十六进制格式指定的任何颜色,例如颜色=c=##87cefa 15.图像处理 - 图3
mptestsrc 不同的测试模式,详细的描述都在章节的调试和测试中 15.图像处理 - 图4
rgbtestsrc 红绿蓝颜色模式 15.图像处理 - 图5
smptebars 彩色条纹图案来自于电影和电视工程师协会,工程指南(1-1990) 15.图像处理 - 图6
testsrc 带有滚动渐变和时间戳的视频测试模式 15.图像处理 - 图7

mptestsrc视频源的默认分辨率为512x512像素,其他列出的源分辨率为320x240像素。最通用的是能够生成任何颜色和任何大小的图像的彩色图像源,例如为一个标题大小的728x90像素创建一个teal背景,我们可以使用这个命令。

  1. ffmpeg -f lavfi -i color=c=##008080:s=728x90 leaderboard.jpg

15.图像处理 - 图8

15.图像处理 - 图9

我的测试命令:

  1. ffmpeg -f lavfi -i color=c=##008080:s=728x90 /Users/zhangfangtao/Desktop/timer2.jpg

*生成的图片:

15.图像处理 - 图10

描述 提供一种颜色为320x240的矩形,并带有指定的颜色
语法 color[=c=clr[:d=time[:r=fps[:sar=value[:s=resolution]]]]] 所有参数都是可选的 斜体中的项目将被替换为实际值
参数描述
color, c 源的颜色、颜色的名称(不区分大小写的匹配)或0xRRGGBB[AA]序列,可能后跟一个alpha说明符,默认值为黑色
duration, d 源视频的持续时间,被接受的句法是:[-]HH[:]]]或[-]S +[m…],如果未指定,或表示持续时间为负,则视频将永远生成
rate, r 源视频的帧速率,每秒生成的帧数,它可以是format frame_rate_factor / frame_rate_denumator,一个整数或浮点数,或者一个有效的视频帧率缩写,默认值是25
sar 样本纵横比的源视频
size, s 源视频的大小、窗体宽度的字符串或相应的缩写,默认值为320x240

视频转换为图像

视频文件是由可以通过一个命令保存到图像文件的帧组成的,结果图像的数量是视频帧速率的产物,它的持续时间为秒。例如,如果剪辑。avi文件的持续时间为1分钟,帧率为25 fps,下面的命令将产生60x25=1500张图片,每秒25张:

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

输出目录将包含1500个文件,名为frame1.jpg、frame2.jpg等。为了保持所有文件名的长度相同,我们在%符号后指定附加数字的数目:

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

现在该目录包含名为frame0001.jpg、frame0002.jpg的文件…,frame1500.jpg。

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 /Users/zhangfangtao/Desktop/Images/frame%03d.jpg
  • 效果:

15.图像处理 - 图11

image.png

调整大小,裁剪和填充图像

图像可以以类似视频的方式调整大小,例如,彩色视频源的输出分辨率为320x240像素,可以通过两种方式放大到VGA分辨率:

  • 使用彩色视频源的s或大小参数。

  • 使用-s选项来输出

    例如,接下来的两个命令具有相同的结果,CIF(352x288)大小的橙色矩形:

  1. ffmpeg -f lavfi -i color=c=orange:s=cif orange_rect1.png
  2. ffmpeg -f lavfi -i color=c=orange -s cif orange_rect2.png

15.图像处理 - 图12

当过滤链内的输入应该具有特定的分辨率时,带参数的大小规格对过滤链很有用,因此大小不能被指定为选项。 一个常见的例子是使用颜色源作为叠加层的输入之一。

裁剪图像与使用作物过滤器的视频是一样的,下一个示例的结果是rgbtestsrc视频源中心的150x150像素的正方形:

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

15.图像处理 - 图13

图像可以像使用pad过滤器的视频一样进行padd,例如下一个命令为smptebars视频源创建一个橙色框架:

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

15.图像处理 - 图14

翻转,旋转和叠加图像

翻转图像的镜像版本与由hflip和vflip过滤器提供的翻转视频类似,例如,接下来的两个命令会翻转输入图像,第一个是水平的,第二个是垂直的:

  1. ffmpeg -i orange.jpg -vf hflip orange_hflip.jpg
  2. ffmpeg -i orange.jpg -vf vflip orange_vflip.jpg

15.图像处理 - 图15

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf hflip /Users/zhangfangtao/Desktop/002.jpg
  2. ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf vflip /Users/zhangfangtao/Desktop/003.jpg

15.图像处理 - 图16

旋转的图像也类似于旋转的视频,使用的转置滤波器有四个可能的值:

  • 值0逆时针旋转90度,垂直翻转。
  • 数值1按顺时针方向旋转90度。
  • 数值2逆时针旋转90度。
  • 值3顺时针旋转90度,然后垂直翻转。

例如,把图像顺时针旋转90°我们可以使用命令:

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

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf transpose=1 /Users/zhangfangtao/Desktop/004.jpg
  • 生成的图像:

![](https://upload-images.jianshu.io/upload_images/661949-f7482e78c1628bd3.jpg“ data-original-width=”250” data-original-height=”250” data-original-format=”image/jpeg” data-original-filesize=”2743”/>

004旋转90度之后的照片.jpg

类似于视频叠加,图像可以通过叠加过滤器放置在另一个图像上。例如,要将smptebars包含到rgbtestsrc视频源中,我们可以使用以下命令:

  1. ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb.png
  2. ffmpeg -f lavfi -i smptebars smpte.png
  3. ffmpeg -i rgb.png -i smpte.png -filter_complex overlay=(W-w)/2:(H-h)/2 ^ rgb_smpte.png

15.图像处理 - 图17

我的测试命令:

  1. ffmpeg -f lavfi -i rgbtestsrc -s 400x300 /Users/zhangfangtao/Desktop/005.png
  2. ffmpeg -f lavfi -i smptebars /Users/zhangfangtao/Desktop/006.png
  3. ffmpeg -i /Users/zhangfangtao/Desktop/005.png -i /Users/zhangfangtao/Desktop/006.png -filter_complex overlay=\(W-w\)/2:\(H-h\)/2 /Users/zhangfangtao/Desktop/007.png
  • 生成的效果图(从左到右依次是005,006,007):

15.图像处理 - 图18

图像类型之间的转换

几乎所有支持的图像类型都可以转换为另一个,异常是EXR、LJPEG、PIC和PTX文件类型,只能进行解码。转换的语法是:

  1. ffmpeg -i image.type1 image.type2

例如,要将PNG图像转换为JPG图像格式,我们可以使用以下命令:

  1. ffmpeg -i illustration.png illustration.jpg

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg /Users/zhangfangtao/Desktop/001.png

创建视频图像

视频来自一个图像

将静态图像转换为视频很容易,可以用来创建幻灯片,从图像(添加文本)的短视频连接到一起,连接视频在第23章中有描述。例如,在photo.jpg文件中创建一个10秒的视频,我们在命令中包含一个值true或1的-loop boolean选项:

  1. ffmpeg -loop 1 -i photo.jpg -t 10 photo.mp4

我的测试命令:

  1. ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg /Users/zhangfangtao/Desktop/001.png
  • 显示的效果:

15.图像处理 - 图19

视频来自多个图像

要从多个图像创建视频,它们的文件名必须以数字结束,这些数字与图像编码到视频文件的顺序一致。在这种情况下,媒体格式是在输入之前指定的,它是一个image2格式。例如,来自img1.jpg、img2.jpg的100幅图片。,img100.jpg可以使用以下命令创建一个4秒视频,帧率为25 fps。

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

如果图像编号以0开头,例如img001.jpg、img002.jpg等,以提供相同的文件名长度,则命令为:

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

%符号后的数字必须与图像文件名中的位数相同。

我的测试命令:

ffmpeg -f image2 -i /Users/zhangfangtao/Desktop/Images/frame%3d.jpg /Users/zhangfangtao/Desktop/001.mp4

  • 结果就是生成了一个没有声音的视频,视频里面的图片就是我刚才从test.mp4里面解析出来的图片