代码之家  ›  专栏  ›  技术社区  ›  Koala Yeung

如何正确估计MP4 H.264视频大小?

  •  0
  • Koala Yeung  · 技术社区  · 8 年前

    基本上,视频大小是计算出来的:

    Video Size per Second (bps)
    =
    Frame Rate (fps)
    * Horizontal Pixels
    * Vertical Pixels
    * Bit Depth (bit)
    / Compression Ratio by Codec
    

    正如我在某个地方读到的,mp4视频的压缩比是50。因此,对于720p 24fps 24位彩色视频(暂时忽略音频大小),文件大小计算为:

    24(fps) * 1280 * 720 * 24(bit) / 50
    = 10616832 (bps) = 10.125 (Mbps)
    

    如果使用上述比特率计算1小时的视频大小,将得到:

    10.125(Mbps) * 3600(s) / 8(bit per Byte) / 1024(MB per GB)  = 4.449GB
    

    …看起来一点也不对。根据日常经验,我们知道1小时长的720p H.264 MP4大概在1 GB或更低。这个差异几乎是5的一个因素。

    我知道这个公式不包括 关键帧间隔 对计算来说,我读到的东西很重要。我也知道这里的压缩比只是一个经验法则。可能还有一些我没有考虑到的因素。问题是我不知道如何适应这些缺失的因素。

    那么,有没有其他方法可以更准确地估计视频大小呢?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Brad    8 年前

    它远比你的公式复杂得多,而且对你来说更简单。

    编解码器有数百个参数和内部分支。没有什么静态因素可以说是“50”。即使您希望针对特定的质量,所需的比特率也会根据正在压缩的内容有很大的变化。例如,一些不移动且亮度变化很小的物体所占用的带宽比从移动的车辆上拍摄的详细动态场景要少得多。压缩比变化很大。

    您可以为目标比特率配置编解码器。然后,您的视频流将接近该比特率。就这么简单。

    我可以告诉H.264以1920x1080视频中的恒定比特率10 Mbps视频流为目标,它将尽最大努力将其全部塞入其中。

    你提到关键帧间隔…是的,关键帧占用视频流中的大部分带宽。因此,如果可能的话,你希望它们能合理地分开。你在这里的设置更多的是选择一个折衷方案。您希望流更定期地重新同步(例如在广播中支持快速频道更改,或在线以减少延迟),还是希望将带宽保存到可靠的位置(例如预录制的文件)以获得更高质量的视频。您的视频仍将符合所需的比特率,但过于频繁地插入关键帧将减少流其余部分的可用带宽,从而导致较低的质量。如果您不确定,只需让编解码器决定在哪里插入关键帧。默认设置对于一般用途来说是可以的,并且通常比猜测不熟悉的设置要好。