如何计算视频最佳码率

本文作者:李超,前“跟谁学”直播研发高级经理。(原文地址

原标题:计算视频最佳码率

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

前言

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

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

1.通过转码服务器,将不规则的视频转成标准规则视频。

2.对播放器进行修改。

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

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

建立码流映射表

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

 1{ //4:3
 2     { 160, 120, 65, 15 },
 3     { 180, 180, 100, 15 },
 4     { 240, 180, 120, 15 },
 5     { 240, 240, 140, 15 },
 6     { 320, 240, 200, 15 },
 7     { 360, 360, 260, 15 },
 8     { 360, 360, 400, 30 },
 9     { 480, 360, 320, 15 },
10     { 480, 360, 490, 30 },
11     { 480, 480, 400, 15 },
12     { 480, 480, 600, 30 },
13     { 640, 480, 400, 10 },
14     { 640, 480, 500, 15 },
15     { 640, 480, 750, 30 },
16     { 960, 720, 910, 15 },
17     { 960, 720, 1380, 30 },
18     { 0, 0, 0, 0}
19},
20{ // 16:9
21     { 320, 180, 140, 15 },
22     { 424, 240, 220, 15 },
23     { 640, 360, 400, 15 },
24     { 640, 360, 800, 24 },
25     { 848, 480, 610, 15 },
26     { 848, 480, 930, 30 },
27     { 960, 540, 800, 15 },
28     { 960, 540, 1200, 30 },
29     { 1280, 720, 1130, 15 },
30     { 1280, 720, 1710, 30 },
31     { 1920, 1080, 2080, 15 },
32     { 1920, 1080, 3150, 30 },
33     { 1920, 1080, 4780, 60 },
34     { 2560, 1440, 4850, 30 },
35     { 2560, 1440, 7350, 60 },
36     { 3840, 2160, 8910, 30 },
37     { 3840, 2160, 13500, 60 },
38     { 0, 0, 0, 0}
39}

始终保持宽比高大

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

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

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

寻找最佳分辨率

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

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

找到最佳码率

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

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

结束语

希望大家一起讨论!

 

填写常用邮箱,接收社区更新

WebRTC 中文社区由

运营