编程小短文:FFmpeg视频画面尺寸调整,必知必会

2020-05-29 16:19:52 浏览数 (1)

引言

FFmpeg是音视频处理领域,应用范围最广的一个项目。

我们日常使用的大小桌面版视频播放器,或者命令行使用的播放器,大多数是基于 ffmpeg 开发的。

如果说它是音视频编解码处理中的老大哥,这一点都不为过。

本文主要从一个小知识点作为切入面,深入介绍一下,如何有效地压缩和降低视频文件的体积。

问题的提出

有一位题主遇到下面的情况,他有一个视频文件,宽高比是 1024x576,现在想要将尺寸调整为 720x480,应该怎么办?

当然了,这对于 ffmpeg 应用程序来说是小菜一碟。只用执行下面一行指令。

代码语言:javascript复制
ffmpeg -i input.avi -s 720x480 -c:a copy output.mkv

其中:

-s:是 --scale 的短选项,用于指定输出文件的画面宽高比;

-c:a:是输出音视频的盒子,copy 说明了是不做任何处理,原样输出。

如果想要限制画面宽度,而对于画面高度想要自动的进行裁切,那么就要用到过滤器。执行下面一行指令。

代码语言:javascript复制
ffmpeg -i input.avi -filter:v scale=720:-1 -c:a copy output.mkv

-1将告诉ffmpeg自动选择与提供的宽度相关的正确高度,以保持宽高比。如果用户给定了高度,那么-1则可以用于指定保持宽高比中的宽度。

使用libx264时,Scale的一个缺点是此编码器需要偶数值,Scale可能会自动选择奇数值,从而导致错误:宽度或高度不能被2整除。

你可以告诉Scale为给定高度选择偶数值(在本例中为720):

代码语言:javascript复制
scale="trunc(oh*a/2)*2:720"

或者指定高度,

代码语言:javascript复制
scale="1280:trunc(ow/a/2)*2"

引申讨论

一般情况下我们会把固定格式宽高比的视频文件转换为统一格式,用于适配不同型号的手机。那么有没有办法,在不知道目标型号手机的宽高比的时候,按照百分比为视频画面进行调整呢?答案是肯定有的。

比如下面这样对画面进行宽高50%的收缩。

代码语言:javascript复制
ffmpeg -i input.avi -vf scale="iw/1:ih/2" output.avi

你应该会注意到我们使用了两个变量。

  • iw:输入文件的画面宽度
  • ih:输入文件的画面高度

这两个是系统的常量,可以拿来直接使用。

写在最后

其实 ffmpeg 所提供的过滤器功能十分复杂,而且功能十分强大。可应用于众多领域的音视频转换,只要是输入的视频流,均可进行深度的处理。

Happy coding :_)

0 人点赞