《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.avi
ffmpeg -i input.avi -s vga output.avi
输入vga参数之后显示的如下图:(确实是640:480)
FFmpeg中视频大小的缩写
大小 | 缩写 | 典型用法 |
---|---|---|
128x96 | sqcif | 手机 |
160x120 | qqvga | 手机 |
176x144 | qcif | 手机 |
320x200 | cga | 旧的CRT显示器 |
320x240 | qvga | 手机、摄像头 |
352x288 | cif | 手机 |
640x350 | ega | 旧的CRT显示器 |
640x480 | vga | 显示器,摄像头 |
704x576 | 4cif | 官方数字视频大小的电视。 |
800x600 | svga | 显示器 |
852x480 | hd480, wvga | 摄像机 |
1024x768 | xga | 显示器,摄像头 |
1280x720 | hd720 | 高清电视,摄像机 |
1280 x1024 | sxga | 显示器 |
1366x768 | wxga | 显示器 |
1408x1152 | 16cif | 设备使用CIF |
1600x1024 | wsxga | 显示器 |
1600x1200 | uxga | 显示器,摄像机 |
1920x1080 | hd1080 | 高清电视,摄像机 |
1920x1200 | wuxga | 宽屏显示器 |
2048x1536 | qxga | 显示器 |
2560x1600 | woxga | 显示器 |
2560x2048 | qsxga | 显示器 |
3200x2048 | wqsxga | 显示器 |
3840x2400 | wquxga | 显示器 |
5120x4096 | hsxga | 显示,显微镜相机 |
6400x4096 | whsxga | 显示器 |
7680x4800 | whuxga | 显示器 |
调整大小时的注意事项-奈奎斯特采样定理。
视频通常被调整为比来源更小的分辨率,这被称为下采样,主要用于便携式设备,通过互联网流媒体等。重要的是要考虑,在较小的尺寸中,一些细节将会丢失,这一事实解释了奈奎斯特 -Shannon采样定理。 它的一般形式与任何信号有关,并告知为了完全重构采样信号,我们必须使用比信源频率高至少2倍的频率。 这意味着要将小细节保留在缩小的视频中,它们的原始尺寸必须高于缩放比例除以2。
例如,800x600(SVGA)分辨率的视频包含2像素宽的细节。 当缩放到640x480(VGA)分辨率时,缩放比率为0.8,并且2像素再缩放为2像素:
640 pixels / 800 pixels = 0.8
2 pixels * 0.8 = 1.6 ≈ 2 pixels
但是当这个视频被缩放到160x120 (QQVGA)分辨率时,细节就丢失了:
160 pixels / 800 pixels = 0.2
2 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.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
scale 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.高度是等比缩放的,300
ffmpeg -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
会报下面的错误: