《FFmpeg Basics》中文版-04-调整和伸缩视频
写在前面如果您对音视频技术感兴趣,可以订阅我的专题:音视频专辑也可以关注我的简书账户:张芳涛,我后期会发布更多的音视频以及图像处理方面的文章。正文在FFmpeg中调整视频的大小意味着可以通过一个选项改变其宽度和高度,而缩放则意味着使用一个具有高级功能的scale filter来改变帧的大小。调整视频输出视频的宽度和高度可以在输出文件名之前设置-s选项。视频分辨率以wxh格式输入,其中w为像素宽度,h为像素高度。例如,要将初始分辨率的输入调整为320x240,我们可以使用以下命令:ffmpeg -i input_file -s 320x240 output_file给大家看看我的测试命令行:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -s 320x480 /Users/zhangfangtao/Desktop/newtest.mp4原来的视频信息如下图:
重新编码之后如下图:确实发生了改变。预定义的视频帧大小FFmpeg工具没有输入视频宽度和高度的精确数字,而是提供了在下一页的表中列出的预定义视频大小。下面两个命令的结果相同:ffmpeg -i input.avi -s 640x480 output.aviffmpeg -i input.avi -s vga output.avi输入vga参数之后显示的如下图:(确实是640:480)FFmpeg中视频大小的缩写大小缩写典型用法128x96sqcif手机160x120qqvga手机176x144qcif手机320x200cga旧的CRT显示器320x240qvga手机、摄像头352x288cif手机640x350ega旧的CRT显示器640x480vga显示器,摄像头704x5764cif官方数字视频大小的电视。800x600svga显示器852x480hd480, wvga摄像机1024x768xga显示器,摄像头1280x720hd720高清电视,摄像机1280 x1024sxga显示器1366x768wxga显示器1408x115216cif设备使用CIF1600x1024wsxga显示器1600x1200uxga显示器,摄像机1920x1080hd1080高清电视,摄像机1920x1200wuxga宽屏显示器2048x1536qxga显示器2560x1600woxga显示器2560x2048qsxga显示器3200x2048wqsxga显示器3840x2400wquxga显示器5120x4096hsxga显示,显微镜相机6400x4096whsxga显示器7680x4800whuxga显示器调整大小时的注意事项-奈奎斯特采样定理。视频通常被调整为比来源更小的分辨率,这被称为下采样,主要用于便携式设备,通过互联网流媒体等。重要的是要考虑,在较小的尺寸中,一些细节将会丢失,这一事实解释了奈奎斯特 -Shannon采样定理。 它的一般形式与任何信号有关,并告知为了完全重构采样信号,我们必须使用比信源频率高至少2倍的频率。 这意味着要将小细节保留在缩小的视频中,它们的原始尺寸必须高于缩放比例除以2。例如,800x600(SVGA)分辨率的视频包含2像素宽的细节。 当缩放到640x480(VGA)分辨率时,缩放比率为0.8,并且2像素再缩放为2像素:640 pixels / 800 pixels = 0.82 pixels * 0.8 = 1.6 ≈ 2 pixels但是当这个视频被缩放到160x120 (QQVGA)分辨率时,细节就丢失了:160 pixels / 800 pixels = 0.22 pixels * 0.2 = 0.4 ≈ 0 pixels这意味着在向下采样后,可见的只有输入大小至少3个像素的细节。(采用的是四舍五入的向下取整的方式)专业的扩大滤波器将视频调整为更大的帧大小比较少见,因为该功能几乎可以提供所有媒体播放器,但由此产生的图像有时并不清晰,特别是当源解析度非常小时。 用于平滑放大的源的特殊滤波器是super2xsai滤波器:视频过滤器:super2xsai视频过滤器:super2xsai描述在不减少锐度的情况下,使用像素艺术缩放算法放大源帧的大小2倍。“2xSaI”的意思是“2倍尺度和插值”。Syntax-vf super2xsai例如,将128x96视频从移动电话放大到分辨率256x192像素,可以使用下一个命令:ffmpeg -i phone_video.3gp -vf super2xsai output.mp4给大家看一下我的测试指令:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf super2xsai /Users/zhangfangtao/Desktop/newTest.mp4原始的视频信息如下图:重新编码之后的视频信息:高级缩放技能当使用-s选项更改视频帧大小时,会在相关滤镜图片的末尾插入缩放视频滤镜。 要管理缩放过程开始的位置,可以直接使用缩放过滤器。视频过滤器:缩放描述通过更改输出样本宽高比来缩放源,显示宽高比保持不变。语法scale=width:height[:interl={1|-1}]**********变量表示宽度和高度参数。iw or in_w输入的宽度ih or in_h输入的高度ow or out_w输出的宽度oh or out_h输出的高度a纵横比,与iw/ih相同。sar输入样本纵横比,与dar/a相同。dar输入显示纵横比,与*sar相同。hsub水平色度子样本值,为yuv422p像素格式为2。vsub垂直色度子样本值,为yuv422p像素格式为1。**********可选的interl参数的可用值。1应用交错感知扩展。-1如果源被标记为交错的,应用是交错的意识扩展。例如,下面两个命令的结果相同:ffmpeg -i input.mpg -s 320x240 output.mp4ffmpeg -i input.mpg -vf scale=320:240 output.mp4scale filter的优点是,对于框架设置,可以使用上面表中描述的其他参数。按比例缩放视频输入如果不知道输入框的大小,可以使用scale filter的ih和iw参数相应地改变其分辨率,例如创建一个半大小的视频,我们可以使用下一个命令:ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4我的测试指令:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf scale=iw/2:ih/2 /Users/zhangfangtao/Desktop/newTest.mp4转换之前的视频信息:转换之后的视频信息:90%大小的视频命令:ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4这个就不需要测试了吧。用黄金比例缩放输入值= 1.61803398874989484820…用PHI来表示这个数值:ffmpeg -i input.mpg -vf scale=iw/PHI:ih/PHI output.mp4扩展到预定义的宽度或高度。当输出视频应该有一定的宽度或一定的高度时,输入视频的大小和纵横比都是未知的,第二个维度可以通过一个方面参数来指定,比如下面的例子。要将输出宽度设置为400像素,高度按比例设置,我们可以使用以下命令:ffmpeg -i input.avi -vf scale=400:400/a我的测试指令:宽度确实成为了400.高度是等比缩放的,300ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf scale=400:400/a /Users/zhangfangtao/Desktop/newTest.mp4输出文件的视频信息:若要将输出高度更改为300像素,宽度按比例改变,命令可以是:(注意到了么,如果需要指定高度,需要用*,不是/,我试了一下,貌似用除号不行,因为那个参数a意思是纵横比,下面我有说明)ffmpeg -i input.avi -vf scale=300*a:300看看我的测试指令:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf scale=300*a:300 /Users/zhangfangtao/Desktop/newTest.mp4输出视频信息:如果指令里面这样写:ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf scale=300/a:300 /Users/zhangfangtao/Desktop/newTest.mp4会报下面的错误: