写在前面
如果您对音视频技术感兴趣,可以订阅我的专题:音视频专辑
也可以关注我的账户: 张芳涛,我后期会发布更多的音视频以及图像处理方面的文章。
正文
虽然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中截图的语法
ffmpeg -i input -ss t image.type
我的测试命令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -ss 20 /Users/zhangfangtao/Desktop/image.jpg
结果生成了第二十秒的一张图片:
-ss选项也可以在输入文件之前使用,但结果不太准确。例如,从文件视频中截取1小时23分45秒的截图。avi,我们可以使用命令:
ffmpeg -i videoclip.avi -ss 01:23:45 image.jpg
从视频动画gif
视频文件是从可以保存到GIF动画帧的帧中创建的,这是一种经常在web上以条幅和动画形式使用的图像类型。因为帧是没有压缩的,所以只有在较短的视频中才有用,否则GIF动画文件的文件大小就会非常大。例如,要将一个短的SWF文件转换为GIF动画,以便为没有Flash插件的用户创建一个替代文件,我们可以使用该命令(必须将像素格式设置为rgb24):
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视频源的图像
另一个创建图像的选项是使用内置的视频源,在表中描述:
名称 | 描述 | 图片 |
---|---|---|
color | 提供以其名称或十六进制格式指定的任何颜色,例如颜色=c=#87cefa | |
mptestsrc | 不同的测试模式,详细的描述都在章节的调试和测试中 | |
rgbtestsrc | 红绿蓝颜色模式 | |
smptebars | 彩色条纹图案来自于电影和电视工程师协会,工程指南(1-1990) | |
testsrc | 带有滚动渐变和时间戳的视频测试模式 |
mptestsrc视频源的默认分辨率为512x512像素,其他列出的源分辨率为320x240像素。最通用的是能够生成任何颜色和任何大小的图像的彩色图像源,例如为一个标题大小的728x90像素创建一个teal背景,我们可以使用这个命令。
ffmpeg -f lavfi -i color=c=#008080:s=728x90 leaderboard.jpg
我的测试命令:
ffmpeg -f lavfi -i color=c=#008080:s=728x90 /Users/zhangfangtao/Desktop/timer2.jpg
*生成的图片:
描述 | 提供一种颜色为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张:
ffmpeg -i clip.avi frame%d.jpg
输出目录将包含1500个文件,名为frame1.jpg、frame2.jpg等。为了保持所有文件名的长度相同,我们在%符号后指定附加数字的数目:
ffmpeg -i clip.avi frame%4d.jpg
现在该目录包含名为frame0001.jpg、frame0002.jpg的文件…,frame1500.jpg。
我的测试命令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 /Users/zhangfangtao/Desktop/Images/frame%03d.jpg
- 效果:
调整大小,裁剪和填充图像
图像可以以类似视频的方式调整大小,例如,彩色视频源的输出分辨率为320x240像素,可以通过两种方式放大到VGA分辨率:
使用彩色视频源的s或大小参数。
-
使用
-s
选项来输出
例如,接下来的两个命令具有相同的结果,CIF(352x288)大小的橙色矩形:ffmpeg -f lavfi -i color=c=orange:s=cif orange_rect1.png ffmpeg -f lavfi -i color=c=orange -s cif orange_rect2.png
当过滤链内的输入应该具有特定的分辨率时,带参数的大小规格对过滤链很有用,因此大小不能被指定为选项。 一个常见的例子是使用颜色源作为叠加层的输入之一。
裁剪图像与使用作物过滤器的视频是一样的,下一个示例的结果是rgbtestsrc视频源中心的150x150像素的正方形:
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rgb.png
图像可以像使用pad过滤器的视频一样进行padd,例如下一个命令为smptebars视频源创建一个橙色框架:
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
翻转,旋转和叠加图像
翻转图像的镜像版本与由hflip和vflip过滤器提供的翻转视频类似,例如,接下来的两个命令会翻转输入图像,第一个是水平的,第二个是垂直的:
ffmpeg -i orange.jpg -vf hflip orange_hflip.jpg
ffmpeg -i orange.jpg -vf vflip orange_vflip.jpg
我的测试命令:
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf hflip /Users/zhangfangtao/Desktop/002.jpg
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf vflip /Users/zhangfangtao/Desktop/003.jpg
旋转的图像也类似于旋转的视频,使用的转置滤波器有四个可能的值:
- 值0逆时针旋转90度,垂直翻转。
- 数值1按顺时针方向旋转90度。
- 数值2逆时针旋转90度。
- 值3顺时针旋转90度,然后垂直翻转。
例如,把图像顺时针旋转90°我们可以使用命令:
ffmpeg -i image.png -vf transpose=1 image_rotated.png
我的测试命令:
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf transpose=1 /Users/zhangfangtao/Desktop/004.jpg
- 生成的图像:
类似于视频叠加,图像可以通过叠加过滤器放置在另一个图像上。例如,要将smptebars包含到rgbtestsrc视频源中,我们可以使用以下命令:
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 -f lavfi -i rgbtestsrc -s 400x300 /Users/zhangfangtao/Desktop/005.png
ffmpeg -f lavfi -i smptebars /Users/zhangfangtao/Desktop/006.png
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):
图像类型之间的转换
几乎所有支持的图像类型都可以转换为另一个,异常是EXR、LJPEG、PIC和PTX文件类型,只能进行解码。转换的语法是:
ffmpeg -i image.type1 image.type2
例如,要将PNG图像转换为JPG图像格式,我们可以使用以下命令:
ffmpeg -i illustration.png illustration.jpg
我的测试命令:
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg /Users/zhangfangtao/Desktop/001.png
创建视频图像
视频来自一个图像
将静态图像转换为视频很容易,可以用来创建幻灯片,从图像(添加文本)的短视频连接到一起,连接视频在第23章中有描述。例如,在photo.jpg文件中创建一个10秒的视频,我们在命令中包含一个值true或1的-loop boolean选项:
ffmpeg -loop 1 -i photo.jpg -t 10 photo.mp4
我的测试命令:
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg /Users/zhangfangtao/Desktop/001.png
- 显示的效果:
视频来自多个图像
要从多个图像创建视频,它们的文件名必须以数字结束,这些数字与图像编码到视频文件的顺序一致。在这种情况下,媒体格式是在输入之前指定的,它是一个image2格式。例如,来自img1.jpg、img2.jpg的100幅图片。,img100.jpg可以使用以下命令创建一个4秒视频,帧率为25 fps。
ffmpeg -f image2 -i img%d.jpg -r 25 video.mp4
如果图像编号以0开头,例如img001.jpg、img002.jpg等,以提供相同的文件名长度,则命令为:
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里面解析出来的图片