尽管编解码器未更改,但 FFMPEG 转换会创建较小的文件

FFMPEG conversion creates a smaller files despite unchanged codecs

我有一个 h264/aac 视频 mp4 文件,FFMPEG 是这样说的:

  Metadata:
    major_brand     : qt
    minor_version   : 0
    compatible_brands: qt
    creation_time   : 2015-10-15 16:41:52
  Duration: 00:03:36.20, start: 0.000000, bitrate: 4298 kb/s
    Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      creation_time   : 2015-10-15 16:41:53
      handler_name    : Core Media Data Handler
    Stream #0:1(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 4160 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2015-10-15 16:41:53
      handler_name    : Core Media Data Handler
      encoder         : H.264

然后,我 运行 对其进行转换,同时使用此命令行保持相同的编解码器和分辨率:

ffmpeg -i x.mp4 -vcodec h264 -acodec libvo_aacenc y.mp4

生成的输出文件信息为:

  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.36.100
  Duration: 00:03:36.29, start: 0.033333, bitrate: 1913 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1780 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

似乎输入和输出文件应该相同,但输入文件为 116MB,生成的输出文件为 51.7MB。

如果编解码器和分辨率相同并且肉眼看视频质量没有变化,为什么文件大小相差如此之大?

那不是 lossy codecs 的工作方式。编码是 CPU 花费在编码、比特率和感知质量上的时间之间的权衡。对于相同的编解码器,不同的设置,你会得到不同的输出。

即使使用完全相同的设置,将 x264 的输出作为输入反馈回来,每次都会导致 generation loss。一些编解码器(如我认为的 prores)被设计为在一两代后停止代损失,但 h.264 不是那样的。部分是因为它在循环中有一个去块滤波器,部分是因为它对参考的准确性有限。

https://trac.ffmpeg.org/wiki/Encode/H.264 may help some, but you're misunderstanding some very basic concepts in lossy compression.

在给定的命令中,仅指定了编解码器名称,还有其他参数可在编码时控制视频质量。
例如,您可以指定 -b:v 4160 或 -crf 20,那么视频质量和大小不会有太大变化。
如果您不指定所有参数,ffmpeg 将为它们采用默认值。 如果您希望保持相同的文件大小,则不应重新编码视频。您可以使用命令作为

ffmpeg -i input.mp4 -acodec copy -vcodec copy output.mp4

如需参考,请查看此页面 https://trac.ffmpeg.org/wiki/Encode/H.264?