这个系列文章我们来介绍一位海外工程师如何探索 FFmpeg Basics 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 4 篇:FFmpeg 调整和伸缩视频。
—— 来自公众号“关键帧Keyframe”的分享
在FFmpeg中,调整视频的大小是指通过一个选项改变其宽度和高度,而缩放则意味着使用一个具有高级功能的scale滤镜来改变帧的大小。
1、调整视频大小
可以在输出文件名之前使用 -s 选项设置输出视频的宽度和高度。视频分辨率以wxh格式输入,其中w为像素宽度,h为像素高度。例如,要将输入的初始分辨率调整为320×240,可以使用以下命令:
ffmpeg -i input_file -s 320x240 output_file
2、预定义的视频帧大小
FFmpeg工具不需要输入视频宽度和高度的精确数字,而是提供了下表中列出的预定义视频大小。下面两个命令的结果相同:
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi

FFmpeg中视频大小的缩写:
| 大小 | 缩写 | 典型用法 |
|---|---|---|
| 128×96 | sqcif | 手机 |
| 160×120 | qqvga | 手机 |
| 176×144 | qcif | 手机 |
| 320×200 | cga | 旧的CRT显示器 |
| 320×240 | qvga | 手机、摄像头 |
| 352×288 | cif | 手机 |
| 640×350 | ega | 旧的CRT显示器 |
| 640×480 | vga | 显示器、摄像头 |
| 704×576 | 4cif | 电视的官方数字视频大小 |
| 800×600 | svga | 显示器 |
| 852×480 | hd480、wvga | 摄像机 |
| 1024×768 | xga | 显示器、摄像头 |
| 1280×720 | hd720 | 高清电视、摄像机 |
| 1280×1024 | sxga | 显示器 |
| 1366×768 | wxga | 显示器 |
| 1408×1152 | 16cif | 使用CIF的设备 |
| 1600×1024 | wsxga | 显示器 |
| 1600×1200 | uxga | 显示器、摄像机 |
| 1920×1080 | hd1080 | 高清电视、摄像机 |
| 1920×1200 | wuxga | 宽屏显示器 |
| 2048×1536 | qxga | 显示器 |
| 2560×1600 | woxga | 显示器 |
| 2560×2048 | qsxga | 显示器 |
| 3200×2048 | wqsxga | 显示器 |
| 3840×2400 | wquxga | 显示器 |
| 5120×4096 | hsxga | 显示器、显微镜摄像机 |
| 6400×4096 | whsxga | 显示器 |
| 7680×4800 | whuxga | 显示器 |

3、调整大小时的注意事项 – 奈奎斯特采样定理
视频通常被调整为比来源更小的分辨率,这被称为下采样,主要用于便携式设备和通过互联网流媒体。重要的是要考虑,在较小的尺寸中,一些细节将会丢失,这一事实解释了奈奎斯特 – Shannon采样定理。它的一般形式与任何信号有关,并告知为了完全重构采样信号,我们必须使用比信源频率高至少2倍的频率。这意味着要将小细节保留在缩小的视频中,它们的原始尺寸必须高于缩放比例除以2。
例如,800×600(SVGA)分辨率的视频包含2像素宽的细节。当缩放到640×480(VGA)分辨率时,缩放比率为0.8,2像素被缩放为约2像素:
640 pixels / 800 pixels = 0.8
2 pixels * 0.8 = 1.6 ≈ 2 pixels
但是当这个视频被缩放到160×120 (QQVGA)分辨率时,细节就丢失了:
160 pixels / 800 pixels = 0.2
2 pixels * 0.2 = 0.4 ≈ 0 pixels
这意味着在向下采样后,只有输入尺寸至少为3个像素的细节才会可见。(采用的是四舍五入的向下取整的方式)
4、专业的扩大滤波器
将视频调整为更大的帧大小比较少见,因为该功能几乎可以提供所有媒体播放器,但由此产生的图像有时并不清晰,特别是当源解析度非常小时。用于平滑放大的源的特殊滤波器是super2xsai滤波器:
| 描述 | 通过像素艺术缩放算法将源帧大小放大2倍,同时不降低锐度。“2xSaI”表示“2倍尺度和插值”。 |
|---|---|
| 语法 | -vf super2xsai |
例如,将128×96的手机视频放大到256×192像素的分辨率,可以使用以下命令:
ffmpeg -i phone_video.3gp -vf super2xsai output.mp4
5、高级缩放技能
当使用 -s 选项更改视频帧大小时,会在相关滤镜图片的末尾插入缩放视频滤镜。要控制缩放过程开始的位置,可以直接使用缩放滤镜。
视频过滤器:缩放
| 描述 | 通过更改输出样本宽高比来缩放源,显示宽高比保持不变。 |
|---|---|
| 语法 | scale=width:height[:interl={1 |
| ********** | 宽度和高度参数的变量表示。 |
| iw 或 in_w | 输入宽度 |
| ih 或 in_h | 输入高度 |
| ow 或 out_w | 输出宽度 |
| oh 或 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滤镜的优点在于,对于框架设置,可以使用上面表中描述的其他参数。
6、按比例缩放视频输入
如果不知道输入帧的大小,可以使用scale滤镜的ih和iw参数相应地改变其分辨率。例如,要创建一个半尺寸的视频,可以使用以下命令:
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.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
7、扩展到预定义的宽度或高度
当输出视频应该有一定的宽度或一定的高度时,输入视频的大小和纵横比都是未知的,第二个维度可以通过一个方面参数来指定,比如下面的例子。要将输出宽度设置为400像素,高度按比例设置,可以使用以下命令:
ffmpeg -i input.avi -vf scale=400:400/a
若要将输出高度更改为300像素,宽度按比例改变,命令可以是:(注意到了么,如果需要指定高度,需要用*,不是/,我试了一下,貌似用除号不行,因为那个参数a意思是纵横比,下面我有说明)
ffmpeg -i input.avi -vf scale=300*a:300
音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。