用于将静态图像转换为视频以供存档的 ffmpeg 设置

用于将静态图像转换为视频以供存档的 ffmpeg 设置

我需要将一组静止图像(指向道路的静态摄像机)转换为视频。

我考虑过 Theora、H.264、VP8、VP9、HEVC、Snow 等视频编解码器。

视频应具有最小尺寸和最大图像质量。现在,从所有可用的命令行参数中,我使用帧速率 (fps)、b:v(比特率) 和s(宽度*高度)。此外,对于 H.264 和 HEVC,有-crf-preset

还有哪些命令行参数可用于实现我想要的目标?在 ffmpeg 中,有几十个命令行参数,解析每个参数可能需要很长时间。

答案1

如果您想要最高的质量和最小的文件大小,您应该使用压缩效率高的编解码器。但是,您首先必须考虑是否要进行(数学上)无损、视觉上无损或有损编码:

  • 无损编码当然会导致文件大小增加,但它们的好处是保留原始数据。然后您可以从视频中提取单个帧而不会造成任何质量损失。这里,诸如 HuffYUV 或最终幻想1可以使用。这些通常用于存档目的,需要保留原始材料,并且发电损失是应该避免的。libx264(H.264)、libx265(HEVC)libvpx-vp9也可以在无损模式下使用:

    ffmpeg -i <input> -c:v huffyuv output.avi
    ffmpeg -i <input> -c:v ffv1 output.avi
    ffmpeg -i <input> -c:v libx264 -crf 0 output.mp4
    ffmpeg -i <input> -c:v libx265 -x265-params lossless=1 output.mp4
    ffmpeg -i <input> -c:v libvpx-vp9 -lossless 1 output.webm
    
  • 视觉无损编码会丢弃一些数据,但会保留质量,这样人们可能不会注意到原始视频和编码视频之间的任何差异。所谓的“中间”编解码器,如 ProRes(见这里) 通常用于此目的。您还可以使用libx265libx264通过指定足够低的 CRF 值 (CRF 的解释在这里),例如 x264 介于 10 和 18 之间。

    ffmpeg -i <input> -c:v prores -profile:v 3 output.mov
    ffmpeg -i <input> -c:v libx264 -crf 10 -preset ultraslow output.mp4
    ...
    
  • 有损编解码器有很多。如果您可以牺牲质量,则可以大大减小文件大小。就所需空间而言,VP9 和 HEVC 比 H.264 更高效,但它们可能需要更长的时间来编码。忘记 Theora 和 VP8 吧。使用 VP9、HEVC 和 H.264(至少使用 ffmpeg 中可用的编码器),您可以设置一个 CRF 参数来提供您想要的质量。您需要目视检查输出,以确保损失量不会太严重,无法达到您的目的。对于libx264,18 到 23 之间的 CRF 值看起来“不错”。

    ffmpeg -i <input> -c:v libx264 -crf 23 -preset ultraslow output.mp4
    ffmpeg -i <input> -c:v libvpx-vp9 -crf 10 -b:v 0 output.webm
    ...
    

一般来说,如果你的目标是存档内容,你不应该只指定目标比特率。相反,你应该使用恒定质量模式,编码器可以自由使用尽可能多的位来保持图像的质量(在一定范围内)。特别是对于 H.264 或 HEVC 编码器libx264libx265-b:v不建议使用单次编码,因为它可能会导致质量随时间发生巨大变化。(我写了一篇关于不同的速率控制模式。)总而言之,如果您正在存档,只需获取一个恒定的 CRF 值。

还要注意不要调整视频大小,因为调整大小会导致视频模糊(放大时),或丢失数据(缩小时)。-s:v除非图像对于视频来说太大,否则请忽略该选项。

最后,在执行视觉无损或有损编码时,你可以权衡速度和压缩效率。换句话说,如果你等待的时间更长,你可以让文件变小。这里,选项preset开始发挥作用:如果你选择预设,如ultraslow,编码过程将需要很长时间,但生成的文件(假设给定的 CRF)将更小,即使它具有相同的质量。VP9 有不同的选项来控制速度,请参阅这里

还有一件事:有了libx264,您可以使用-tune stillimage选项可优化图像编码。此外,选择所需的最低帧速率当然有助于节省文件大小。

一些文档:

相关内容