美文网首页FFmpeg音视频专辑iOS音视频开发
《FFmpeg Basics》中文版-15-图像处理

《FFmpeg Basics》中文版-15-图像处理

作者: 张芳涛 | 来源:发表于2018-04-12 16:44 被阅读56次

    写在前面

    如果您对音视频技术感兴趣,可以订阅我的专题:音视频专辑
    也可以关注我的简书账户: 张芳涛,我后期会发布更多的音视频以及图像处理方面的文章。

    正文

    虽然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
    

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


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

    -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
    
    • 效果:
    image.png

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

    图像可以以类似视频的方式调整大小,例如,彩色视频源的输出分辨率为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 
    
    • 生成的图像:
    004旋转90度之后的照片.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里面解析出来的图片

    相关文章

      网友评论

        本文标题:《FFmpeg Basics》中文版-15-图像处理

        本文链接:https://www.haomeiwen.com/subject/unxfkftx.html