类似 YoutTube 或者 Netflix、HUlu 那样的系统。看似内容创作者上传视频、观看者点击视频后播放,背后很复杂。
除了看视频,还有其他很多事情,如 对视频发表评论,将视频分享给其他人,为视频点赞,保存到播放列表,订阅频道等。
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。
下面展示了视频上传流程的高层级设计
流程a:上传实际视频
流程b:更新视频元数据
当一个文件被上传到原始存储时,客户端并行发送一个请求来更新视频 元数据,如视频元数据、包括文件名、大小、格式等,API服务器将更新 元数据缓存和元数据数据库。
看视频时,视频立即开始被流式传输,用户不需要等到整个视频下载完再看。
流媒体协议,这是一个控制视频流传输的标准方法,常见流媒体协议有:
重要的是知道不同流媒体协议支持不同的视频编码和播放器。选择合适的流媒体协议来支持我们的使用场景。
视频直接从CDN开始流式传输到客户端,离用户最近的边缘服务器回传送视频给用户。
设备录制视频,通常将视频保存为特定格式的文件,如果希望录制的视频在其他设备上也能平滑播放,需要将视频编码成兼容的比特率和格式的视频,比特率是视频中每秒传输的比特数,高比特率视频流需要系统有更强的处理能力和网速。
帧率影响视频存储空间、设备和浏览器支持视频格式不同要保证兼容性,兼顾网速较差的用户也能看视频。
有很多类型编码格式可用,多数包含两个部分:
视频转码是耗费算力且耗时的人物。
Facebook 的流式视频引擎使用了有向无环图 Directed Acyclic Graph DAG 编程模型。模型定义了不同阶段的人物,使得人物可以顺序或并行执行。
原始视频分解为视频、音频、元数据。
说实话这部分属于音视频架构的内容,一般做这些工作的都是技术专家,整个中国也没多少音视频专家。
客户端上传视频,将视频作为整体上传效率低,可以通过GOP(Group of Pictures)对齐把视频分成小块。 然后并行上传。
这也可以在上传失败时快速恢复上传。把上传中心安置在用户近的地方。
视频从原始存储传到 CDN 的流程
可以在每个系统之间使用消息队列进行解耦。
确保只有获得授权的用户才可以将视频上传到正确的地址。
客户端向API服务器发送请求获取预签名URL,将文件上传到 Amazon S3 会使用 预签名URL 术语,微软 Azure Blob 存储支持同样功能 名字为 共享访问签名。
CDN 是系统关键组件,CDN 很贵,数据很大时怎么减少开销。
YouTube 视频流遵循长尾分布,少数热门视频会被频繁播放,很多 视频只有很少观众或没人看。