引言
FFmpeg是音视频处理领域,应用范围最广的一个项目。
我们日常使用的大小桌面版视频播放器,或者命令行使用的播放器,大多数是基于 ffmpeg 开发的。
如果说它是音视频编解码处理中的老大哥,这一点都不为过。
本文主要从一个小知识点作为切入面,深入介绍一下,如何有效地压缩和降低视频文件的体积。
问题的提出
有一位题主遇到下面的情况,他有一个视频文件,宽高比是 1024x576,现在想要将尺寸调整为 720x480,应该怎么办?
当然了,这对于 ffmpeg 应用程序来说是小菜一碟。只用执行下面一行指令。
ffmpeg -i input.avi -s 720x480 -c:a copy output.mkv
其中:
-s:是 --scale 的短选项,用于指定输出文件的画面宽高比;
-c:a:是输出音视频的盒子,copy 说明了是不做任何处理,原样输出。
如果想要限制画面宽度,而对于画面高度想要自动的进行裁切,那么就要用到过滤器。执行下面一行指令。
ffmpeg -i input.avi -filter:v scale=720:-1 -c:a copy output.mkv
-1将告诉ffmpeg自动选择与提供的宽度相关的正确高度,以保持宽高比。如果用户给定了高度,那么-1则可以用于指定保持宽高比中的宽度。
使用libx264时,Scale的一个缺点是此编码器需要偶数值,Scale可能会自动选择奇数值,从而导致错误:宽度或高度不能被2整除。
你可以告诉Scale为给定高度选择偶数值(在本例中为720):
scale="trunc(oh*a/2)*2:720"
或者指定高度,
scale="1280:trunc(ow/a/2)*2"
引申讨论
一般情况下我们会把固定格式宽高比的视频文件转换为统一格式,用于适配不同型号的手机。那么有没有办法,在不知道目标型号手机的宽高比的时候,按照百分比为视频画面进行调整呢?答案是肯定有的。
比如下面这样对画面进行宽高50%的收缩。
ffmpeg -i input.avi -vf scale="iw/1:ih/2" output.avi
你应该会注意到我们使用了两个变量。
iw:输入文件的画面宽度
ih:输入文件的画面高度
这两个是系统的常量,可以拿来直接使用。
写在最后
其实 ffmpeg 所提供的过滤器功能十分复杂,而且功能十分强大。可应用于众多领域的音视频转换,只要是输入的视频流,均可进行深度的处理。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货