FFmpegiOS音视频开发音视频专辑

《FFmpeg Basics》中文版-04-调整和伸缩视频

2018-04-10  本文已影响117人  张芳涛

写在前面

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

正文

在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

会报下面的错误:


上一篇下一篇

猜你喜欢

热点阅读