设计视频分享系统

类似 YoutTube 或者 Netflix、HUlu 那样的系统。看似内容创作者上传视频、观看者点击视频后播放,背后很复杂。

理解问题

除了看视频,还有其他很多事情,如 对视频发表评论,将视频分享给其他人,为视频点赞,保存到播放列表,订阅频道等。

  1. 上传视频和观看视频
  2. 支持多平台客户端
  3. 假设日活500万
  4. 用户每天使用产品平均时长30分钟
  5. 支持国际用户
  6. 系统支持大部分视频分辨率和格式
  7. 要求加密
  8. 允许最大视频文件大小为 1GB
  9. 可以使用云服务 如亚马逊、谷歌、微软 提供的云基础设施

封底估算

500万 DAU、每个用户每天看5个视频,10%用户每天上传1个视频,假设视频文件平均300MB, 500万 x 10% x 300MB 是 150 TB

CDN 成本,平均每GB 0.02 美元,值计算视频流服务成本 500 万 x 5 个视频 x 0.3 GB x 0.02 美元 等于 150000 美元。

高层级设计

构建一个可扩展的Blob存储活CDN是及其复杂和昂贵的。像 Netflix 使用 AWS,Facebook 使用 Akamai 的 CDN。

图14-2

视频上传过程

下面展示了视频上传流程的高层级设计

流程a:上传实际视频

图14-4

流程b:更新视频元数据

当一个文件被上传到原始存储时,客户端并行发送一个请求来更新视频 元数据,如视频元数据、包括文件名、大小、格式等,API服务器将更新 元数据缓存和元数据数据库。

视频流式传输过程

看视频时,视频立即开始被流式传输,用户不需要等到整个视频下载完再看。

流媒体协议,这是一个控制视频流传输的标准方法,常见流媒体协议有:

重要的是知道不同流媒体协议支持不同的视频编码和播放器。选择合适的流媒体协议来支持我们的使用场景。

视频直接从CDN开始流式传输到客户端,离用户最近的边缘服务器回传送视频给用户。

视频转码

设备录制视频,通常将视频保存为特定格式的文件,如果希望录制的视频在其他设备上也能平滑播放,需要将视频编码成兼容的比特率和格式的视频,比特率是视频中每秒传输的比特数,高比特率视频流需要系统有更强的处理能力和网速。

帧率影响视频存储空间、设备和浏览器支持视频格式不同要保证兼容性,兼顾网速较差的用户也能看视频。

有很多类型编码格式可用,多数包含两个部分:

有向无环图模型

视频转码是耗费算力且耗时的人物。

Facebook 的流式视频引擎使用了有向无环图 Directed Acyclic Graph DAG 编程模型。模型定义了不同阶段的人物,使得人物可以顺序或并行执行。

图14-7

原始视频分解为视频、音频、元数据。

视频转码架构

图14-9

说实话这部分属于音视频架构的内容,一般做这些工作的都是技术专家,整个中国也没多少音视频专家。

系统优化

客户端上传视频,将视频作为整体上传效率低,可以通过GOP(Group of Pictures)对齐把视频分成小块。 然后并行上传。

这也可以在上传失败时快速恢复上传。把上传中心安置在用户近的地方。

视频从原始存储传到 CDN 的流程

图14-23

可以在每个系统之间使用消息队列进行解耦。

预签名 URL

确保只有获得授权的用户才可以将视频上传到正确的地址。

图14-25

客户端向API服务器发送请求获取预签名URL,将文件上传到 Amazon S3 会使用 预签名URL 术语,微软 Azure Blob 存储支持同样功能 名字为 共享访问签名。

保护有版权的视频

节省开销的措施

CDN 是系统关键组件,CDN 很贵,数据很大时怎么减少开销。

YouTube 视频流遵循长尾分布,少数热门视频会被频繁播放,很多 视频只有很少观众或没人看。

  1. 仅经由 CDN 提供最流行的视频,而其他视频则由我们的大容量视频服务器提供
  2. 对千不那么流行的视频,我们可能不需要存储多个编码过的视频版本 。 对短视频可以按需编码。
  3. 一些视频只在特定地区流行,没有必要把这些视频分发到其他地区。
  4. Netflix 直接构建自己的CDN并和ISP Internet Service Provider, 互联网服务提供商)建立合作关系。