通过设置最终尺寸来转换视频

通过设置最终尺寸来转换视频

有没有办法使用 ffmpeg(或任何其他基于 CLI 的视频转换器)设置视频转换的最大最终尺寸?

比如,如果我有一个 100mb 的视频,想把它转换成一个 10mb 的最高质量的视频可能的,考虑到最终的格式并不重要。

答案1

从 100mb 到 10mb 是一个有点不切实际大小减少了 90%,但我将举一个缩小到 50mb 的例子,创建一个 H.264 视频,这是更合理的使用 HEVC 后尺寸缩小 50%,并减少至 40mb。

我正在使用以下示例文件:

wget https://web.archive.org/web/20190412004321/http://dl3.h265files.com/TearsOfSteel_720p_h265.mkv

您可以使用此示例文件来确认我给出的以下结果,也许实验再往前走一点。MediaInfo 揭示了此下载文件的以下内容:

mediainfo \
--Inform="General;Duration=%Duration/String3%\nFile size=%FileSize/String1%" \
TearsOfSteel_720p_h265.mkv
Duration=00:12:14.058   <-----
File size=101 MiB       <-----

当然,箭头是我自己的!那么你也许有两个非常好的选择:

  1. 重新编码为 H.264
  2. 重新编码为 HEVC

1. 重新编码为 H.264 (50mb)

H.264 现在已被广泛接受,是输出视频文件的绝佳选择。计算所需 50mb 输出比特率的公式如下:

(50 MiB * 8192 [converts MiB to kBit]) / 734 seconds = ~558 kBit/s total bitrate
558 - 128 kBit/s (desired audio bitrate) = 430 kBit/s video bitrate

为了实现这一点,请使用以下 FFmpeg 2 pass 命令:

ffmpeg -y -i TearsOfSteel_720p_h265.mkv \
      -c:v libx264 -b:v 430k -pass 1 \
      -c:a libmp3lame -b:a 128k -f mp4 /dev/null && \
ffmpeg -i TearsOfSteel_720p_h265.mkv \
       -c:v libx264 -b:v 430k -pass 2 \
       -c:a libmp3lame -b:a 128k TearsOfSteel_smaller.mp4

生成的文件大小为 49.4MiB,观看质量相当合理,但并不惊人。文件大小减少了 50%,这已经相当不错了巨大的视频比特率实际上下降了!

2. 重新编码为 HEVC (40mb)

另一个选择(由 emk2203 建议)是用较低的比特率重新编码现有的 HEVC 流,这次的目标是 40mb,因为 HEVC 声称质量更好以较低的比特率

这次的公式是:

(40 MiB * 8192 [converts MiB to kBit]) / 734 seconds = ~446 kBit/s total bitrate
446 - 128 kBit/s (desired audio bitrate) = 318 kBit/s video bitrate

FFmpeg 2 pass 命令行是:

ffmpeg -y -i TearsOfSteel_720p_h265.mkv \
      -c:v libx265 -x265-params pass=1 -b:v 318k \
      -c:a libmp3lame -b:a 128k -f mp4 /dev/null && \
ffmpeg -i TearsOfSteel_720p_h265.mkv \
       -c:v libx265 -x265-params pass=2 -b:v 318k \
       -c:a libmp3lame -b:a 128k TearsOfSteel_smaller.mp4

这将生成一个 40mb 的文件,其中相当合理质量。

综上所述:

从这些例子中你可以实验通过减少公式中所需的 MiB 并观察随后的观看质量来进一步提高。玩得开心!

参考:

答案2

是的。选择视频编解码器(x264 是一个很好的通用编解码器)并选择分辨率,保留大多数设置默认,但使用设置的平均比特率进行 2 次转换。

视频压缩速成课:视频复杂度会在整个视频中发生变化,因此如果将整个视频压缩到相同的视觉质量水平,实际比特率就会上下波动。如果将视频压缩到固定比特率,由于比特率太低,高复杂度部分的质量会很差,和/或低复杂度部分使用的比特率太高。因此,尽可能让它以恒定的质量为目标,让比特率随意波动。但如果压缩器的目标是特定的文件大小,它就不知道视频复杂度在尚未转换的部分是会上升还是下降,所以这就是为什么人们在以特定文件大小为目标时使用 2 次转换的原因。

您需要将输出指定为比特率(音频和视频,加上容器有轻微的开销),因此您需要一个计算器将文件大小和持续时间转换为比特率。

相关内容