×

计算视频最佳码率

96
音视频直播技术专家
2018.03.05 19:49* 字数 595

前言

在音视频直播中经常遇到不同分辨率对应不同的码流问题,码流的大小通常是与分辨率和帧率密切相关的。

对于在直播中可以播放多媒体文件的情况更加复杂。因为很多媒体文件经过转码后都不是标准的比例(4:3或16:9)。对这种情况我们一般有两种解决办法:

  1. 通过转码服务器,将不规则的视频转成标准规则视频。
  2. 对播放器进行修改。

我们这里使用的是第二种情况。但问题是,由于视频不分辨率是不规的,那么我们的码流设置多大才合适呢?

这里我提供了一个算法供大家参考,也希望有不同想法的人一起讨论该问题。

建立码流映射表

视频的传输码流目前没有找到很好的计算公式(知道公式的可以提供一下哈)。一般的策略是根据经验值来设置码流大小,我们可以按视频的宽高比建立码流映射表。详细列表如下:

{ //4:3
     { 160, 120, 65, 15 },
     { 180, 180, 100, 15 },
     { 240, 180, 120, 15 },
     { 240, 240, 140, 15 },
     { 320, 240, 200, 15 },
     { 360, 360, 260, 15 },
     { 360, 360, 400, 30 },
     { 480, 360, 320, 15 },
     { 480, 360, 490, 30 },
     { 480, 480, 400, 15 },
     { 480, 480, 600, 30 },
     { 640, 480, 400, 10 },
     { 640, 480, 500, 15 },
     { 640, 480, 750, 30 },
     { 960, 720, 910, 15 },
     { 960, 720, 1380, 30 },
     { 0, 0, 0, 0}
},
{ // 16:9
     { 320, 180, 140, 15 },
     { 424, 240, 220, 15 },
     { 640, 360, 400, 15 },
     { 640, 360, 800, 24 },
     { 848, 480, 610, 15 },
     { 848, 480, 930, 30 },
     { 960, 540, 800, 15 },
     { 960, 540, 1200, 30 },
     { 1280, 720, 1130, 15 },
     { 1280, 720, 1710, 30 },
     { 1920, 1080, 2080, 15 },
     { 1920, 1080, 3150, 30 },
     { 1920, 1080, 4780, 60 },
     { 2560, 1440, 4850, 30 },
     { 2560, 1440, 7350, 60 },
     { 3840, 2160, 8910, 30 },
     { 3840, 2160, 13500, 60 },
     { 0, 0, 0, 0}
}

始终保持宽比高大

一般的视频都是按照 4:3 或 16:9 的比例录制的,但也有的视频正好是反过来变成了 3:4 或者 9:16。

为了便于计算,首先需要将它们统一成宽比高大的形式。转换代码如下:

newWidth = (width > height) ?  width : height;
newHeight = (width > height) ? height : width;

寻找最佳分辨率

让宽始终大于高,这样我们就有了一个标准。然后通过下面的公式找到最佳的分辨率:

  • 首先,计算宽/高比与那个规格接近。是与 16:9 接近还是与 4:3接近?计算公式是: min( |宽/高- 16/9|, |宽/高- 4/3|);
  • 其次,遍历上面不同比例的列表,找到最小差值。通过公式 min( list(|w*h - cap[i].videosize|) ),找到最佳分辨率。

找到最佳码率

根据最佳分辨率率后,还要根据帧率的大小找到最佳码率。计算公式为:

min(list([frameRate - cap[i].frameRate]));

结束语

希望大家一起讨论!

音视频基础知识
Web note ad 1