前言
在音视频直播中经常遇到不同分辨率对应不同的码流问题,码流的大小通常是与分辨率和帧率密切相关的。
对于在直播中可以播放多媒体文件的情况更加复杂。因为很多媒体文件经过转码后都不是标准的比例(4:3或16:9)。对这种情况我们一般有两种解决办法:
- 通过转码服务器,将不规则的视频转成标准规则视频。
- 对播放器进行修改。
我们这里使用的是第二种情况。但问题是,由于视频不分辨率是不规的,那么我们的码流设置多大才合适呢?
这里我提供了一个算法供大家参考,也希望有不同想法的人一起讨论该问题。
建立码流映射表
视频的传输码流目前没有找到很好的计算公式(知道公式的可以提供一下哈)。一般的策略是根据经验值来设置码流大小,我们可以按视频的宽高比建立码流映射表。详细列表如下:
{ //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]));
结束语
希望大家一起讨论!
网友评论