如果我把一个 2GB 的视频文件上传到服务器,能不能随时随地流畅播放?
最近在折腾云服务器和 MinIO 的时候,遇到了一个很自然的问题:
如果我把一个 2GB 的视频文件上传到服务器,能不能随时随地流畅播放?
最开始看起来,这是一个存储问题:
但继续深入后会发现,真正决定播放体验的,往往不是存储,而是网络。
于是引出了几个关键概念:
这些概念看似相近,但分别描述了不同层面的东西。
首先理解带宽。
带宽描述的是:
单位时间内,网络链路最多可以传输多少数据。
例如,一个云服务器标注:
txt
意味着理论上:
txt
注意:
网络中的 Mbps 使用的是 bit(比特),而文件大小通常使用 Byte(字节)。
两者关系:
txt
所以:
txt
也就是说,一个 3Mbps 的服务器公网出口,理论最大传输速度大约只有:
txt
这时候可以建立一个简单模型:
txt
带宽就是中间这条线路的最大运输能力。
类似:
文件 = 货物
网络 = 道路
带宽 = 道路宽度
道路越宽,单位时间能通过的车辆越多。
如果只是访问网页:
txt
数据量通常很小。
一次请求可能只有:
txt
即使带宽不高,也不会明显影响体验。
但是视频不同。
视频播放本质是:
持续不断地获取数据。
例如:
一个视频码率:
txt
意味着:
播放器平均每秒需要获取:
txt
的数据。
如果服务器只能提供:
txt
那么:
txt
播放器缓存最终会耗尽。
表现就是:
txt
那么什么是码率?
简单来说:
码率表示视频单位时间内包含的数据量。
例如:
txt
表示:
平均每秒需要:
txt
换算:
txt
也就是:
每秒大约消耗:
txt
网络需要持续提供这个速度,视频才能实时播放。
这里有一个容易混淆的地方:
很多人会认为:
视频越大,码率一定越高。
实际上不完全正确。
准确关系是:
txt
例如:
一个视频:
txt
计算:
txt
所以:
这个视频平均码率约为:
txt
如果另一个视频:
txt
那么:
txt
虽然文件大小一样,但播放需求完全不同。
所以:
文件大小决定存储成本,码率决定播放时的网络需求。
如果已经知道最终文件大小,那么可以计算平均码率。
但是问题来了:
为什么两个视频最终大小不同?
这就涉及视频编码。
影响因素包括:
例如:
txt
分辨率越高:
需要描述的像素越多。
通常需要更高码率。
例如:
txt
60 FPS 意味着:
每秒需要处理更多画面。
因此通常需要更多数据。
两个同样 1080p 的视频:
视频 A:
txt
视频 B:
txt
视频 B 通常需要更高码率。
原因是视频压缩依赖:
预测变化。
如果连续画面变化很小,编码器可以复用大量信息。
例如:
上一帧:
txt
下一帧:
txt
编码器只需要记录变化。
但是:
上一帧:
txt
下一帧:
txt
变化巨大,需要更多数据。
不同编码格式效率不同。
例如:
txt
更先进的编码格式通常可以在相同画质下使用更低码率。
所以视频最终大小:
不是由时长单独决定。
而是:
txt