使用 FFmpeg 轻松调整视频的大小/缩放/更改分辨率

使用 FFmpeg 进行简单的视频编辑非常强大。它是一个命令行工具,虽然一开始可能看起来有点复杂,但掌握了基本命令后会非常有用。

使用 FFmpeg 轻松调整视频的大小/缩放/更改分辨率

在此 FFmpeg 教程中,我们学习使用 FFmpeg 的命令行工具更改视频的分辨率(或调整视频的大小/缩放)。

更改视频的分辨率(也称为调整大小或缩放)是视频编辑、处理和压缩中非常常见的操作。对于 ABR 视频流尤其如此,其中将单个视频作为源并压缩为多个不同的比特率分辨率组合。例如,输入视频的分辨率可以是1920x1080,ABR 比特流可以是1280x720,640x480等。

因此,作为第一步,让我们找出输入视频的分辨率是多少。使用FFmpeg 版本附带的工具ffprobe,让我们确定输入视频的分辨率。这是使用ffprobe.

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4

此命令的输出应该与您的控制台上显示的1920x1080。太好了——您现在知道视频的分辨率并且现在可以缩放或更改分辨率。

注意:您必须注意,向上/向下缩放的行为是一个有损过程,会导致视频质量有所下降。

如何使用 FFmpeg 调整/缩放/更改视频的分辨率?

使用 FFmpeg 缩放或更改视频的分辨率是由FFmpeg 中的过滤器scale完成的。要使用scale过滤器,请使用以下命令 –

ffmpeg -i input.mp4 -vf scale=$w:$h <encoding-parameters> output.mp4

其中,$w和$h表示目标视频所需的宽度和高度。例如,您可以使用-vf scale=640:480将视频大小调整为480p.

而已!使用这个简单的命令,您可以使用 FFmpeg 更改视频的分辨率。

并且,在 FFmpeg 更改视频的分辨率后,它将以该分辨率重新编码。在上面的命令行中,您可以向 FFmpeg 提供编码参数,并使用这些参数对缩放后的视频进行编码。例如,您可以告诉 FFmpeg 使用 crf=18 进行编码,以获得高质量的 H.264/AVC 编码,或者选择其他编码方式!

好的,让我们来解决下一个主题,即更改视频的分辨率但保留/保持其纵横比。

如何使用 FFmpeg 在保持高质量的同时调整视频大小

调整大小后,您可能会注意到输出视频的质量很差或达不到您的预期。通过告诉 FFmpeg 您希望在调整大小过程后使用的视频编码参数,可以轻松解决此问题。

这是一个例子——

ffmpeg -i input.mp4 -vf scale=1280:720 -preset slow -crf 18 output.mp4


在这里,您要告诉 FFmpeg 将视频缩放至 720p,然后使用 crf=18 和 libx264 的慢速预设进行编码。由于它打开的编码工具的数量,通常可以提供非常好的质量。

如何更改视频的分辨率但保持纵横比?

图像的纵横比在维基百科中有如下定义:图像的纵横比是其宽度与高度的比值。它通常表示为用冒号分隔的两个数字,如16:9. 对于x:y纵横比,图像是 x 个单位宽和 y 个单位高。

在处理视频时遇到这个问题很常见:​​如何更改视频的分辨率(或缩放视频)但保持或保留视频的原始纵横比。

在FFmpeg中,如果您想在缩放视频的同时保持其宽高比,则需要设置height或width参数之一并将另一个参数设置为-1。也就是说,如果您设置height,则将宽度设置为 -1,反之亦然。

为了演示,假设以下命令将高清视频 ( 1920x1080) 作为其输入。并且,假设我们想要更改其分辨率。这可以通过上面讨论的两种方式完成,所以让我们尝试两种方式。

1.指定宽度以保持纵横比

ffmpeg -i input.mp4 -vf scale=320:-1 output.mp4

生成的视频的分辨率为320x180. 这是因为1920 / 320= 6。因此,height被缩放到1080 / 6 = 180像素。

2.指定高度以保持纵横比

ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4

生成的视频的分辨率为1280x720. 这是因为1080 / 720= 1.5。因此,width被缩放到1920 / 1.5 = 1280像素。

在 FFmpeg 中使用变量缩放/更改视频的分辨率

我们可以使用表示视频参数的变量来实现相同的缩放命令。输入视频的width和height分别用iw和表示ih。

让我们看看将视频宽度缩放两倍 ( 2x) 的命令是什么样的。

ffmpeg -i input.mp4 -vf scale=iw*2:ih output.mp4

如果你想用一个数字除以高度或宽度,语法会稍微改变,因为scale=iw/2:ih/2参数需要用双引号括起来。

ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" output.mp4  

以下是一些常见的简单视频编辑操作及其 FFmpeg 命令:


1. 剪切视频

如果你想从一个视频中剪切出一段,你需要指定开始时间 (-ss) 和持续时间 (-t),或者开始时间 (-ss) 和结束时间 (-to)。

  • 指定持续时间:

    ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 -codec copy output.mp4
    
    • -i input.mp4:指定输入文件。
    • -ss 00:01:00:从视频的第 1 分钟开始剪切(时:分:秒)。
    • -t 00:00:30:剪切 30 秒的持续时间。
    • -codec copy:这非常重要!它会直接复制视频和音频流,而无需重新编码,这样速度快,并且不会损失质量。
  • 指定结束时间:

    ffmpeg -i input.mp4 -ss 00:01:00 -to 00:01:30 -codec copy output.mp4
    
    • -to 00:01:30:剪切到视频的第 1 分 30 秒。

2. 改变视频分辨率(缩放)

如果你想改变视频的尺寸,可以使用 -vf scale 过滤器。

ffmpeg -i input.mp4 -vf scale=1280:-1 output_720p.mp4
  • -vf scale=1280:-1:将视频宽度设置为 1280 像素,-1 会自动计算高度以保持宽高比。你也可以指定具体的高度,例如 scale=1280:720
  • 注意: 改变分辨率需要重新编码,这会比复制流慢。

3. 提取音频

从视频中提取音轨。

ffmpeg -i input.mp4 -vn output.mp3
  • -vn:表示不包含视频流(video no)。
  • output.mp3:指定输出的音频文件格式。你也可以使用 .aac 或其他音频格式。

4. 提取视频(无音频)

从视频中移除音轨,只保留视频。

ffmpeg -i input.mp4 -an -codec copy output_no_audio.mp4
  • -an:表示不包含音频流(audio no)。
  • -codec copy:同样,为了避免重新编码,使用这个参数可以快速提取。

5. 合并视频(串联)

如果你有多个视频片段,想把它们按顺序连接起来,可以使用 FFmpeg 的 concat 解复用器或过滤器。

推荐方法:使用 Concat Demuxer (列表文件)

这种方法更快,因为不需要重新编码。

  1. 创建一个文本文件 (例如 mylist.txt),列出你要合并的视频文件,每个文件一行,格式如下:

    file 'input1.mp4'
    file 'input2.mp4'
    file 'input3.mp4'
    
  2. 运行 FFmpeg 命令:

    ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
    
    • -f concat:使用 concat 解复用器。
    • -safe 0:在某些情况下可能需要,允许读取绝对路径或危险路径。
    • -i mylist.txt:指定包含文件列表的文本文件。
    • -c copy:复制流,不重新编码。
替代方法:使用 Concat 过滤器 (如果文件格式或编码不同,或需要更复杂的处理)

如果你的视频文件格式或编码不同,或者你需要对视频进行其他处理(例如调整大小),则需要使用 concat 过滤器,这会重新编码。

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4
  • -i input1.mp4 -i input2.mp4:输入多个文件。
  • -filter_complex:使用复杂过滤器图。
  • [0:v][0:a][1:v][1:a]:指定输入流 (第一个文件是 0,视频是 v,音频是 a)。
  • concat=n=2:v=1:a=1n=2 表示有两个输入文件,v=1 表示输出一个视频流,a=1 表示输出一个音频流。
  • -map "[v]" -map "[a]":映射输出的视频和音频流。

6. 添加水印/叠加图像

在视频上叠加一个图片(例如水印)。

ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output_watermarked.mp4
  • -i watermark.png:第二个输入是你的水印图片。
  • -filter_complex "overlay=10:10":使用 overlay 过滤器。10:10 是水印左上角的 x 和 y 坐标,表示距离视频左上角 10 像素。

7. 改变视频速度

如果你想让视频播放得更快或更慢,可以使用 setptsatempo 过滤器。

改变视频播放速度 (不改变音高)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output_faster.mp4
  • setpts=0.5*PTS:将视频播放速度加快一倍(0.5 倍持续时间)。对于减慢速度,可以使用大于 1 的值,例如 2.0*PTS 会让视频慢两倍。
  • atempo=2.0:将音频播放速度加快一倍。atempo 的值必须在 0.5 到 2.0 之间。如果你需要更快的速度,可以链式使用多个 atempo 过滤器(例如 atempo=2.0,atempo=2.0)。

8. 旋转视频

将视频顺时针旋转 90 度。

ffmpeg -i input.mp4 -vf "transpose=1" output_rotated.mp4
  • transpose 过滤器参数:
    • 0 = 逆时针旋转 90 度并垂直翻转 (默认)
    • 1 = 顺时针旋转 90 度
    • 2 = 逆时针旋转 90 度
    • 3 = 顺时针旋转 90 度并垂直翻转

 热门原创推荐

视频加密与在线教育文章

AI工具类文章

视频加密/防下载/防录屏

FFmpeg视频编码

谷歌浏览器

ThinkPad电脑

视频直播

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值