
视频转码全流程如何编排深度解析YouTube视频转码与DAG任务调度【免费下载链接】system-design-notesNotes of the book System Desgin Interview - An Insiders Guide项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-notes视频转码是 YouTube 这类视频平台最核心的工程问题之一用户上传原始视频后系统必须自动完成转码、缩略图生成、水印叠加等一系列处理才能让观看者在任意设备、任意网络条件下流畅播放。本文基于 system-design-notes 系统设计笔记的第 14 章Design YouTube带你完整拆解视频转码架构是如何用DAG有向无环图任务调度来编排一个个转码任务的。 本章完整笔记见14. Youtube/Readme.md为什么视频平台需要视频转码很多新手会问用户直接上传的视频为什么不能直接播放因为原始视频存在三大问题问题说明 存储浪费原始视频体积大直接存储成本极高 兼容性问题不同设备、浏览器支持的编码格式各不相同 网络适配需要按网络状况提供不同清晰度实现自适应播放视频转码Video Transcoding就是解决这个问题的手段把原始视频转换解码→重新编码为多种分辨率、码率、编码格式的版本。它依赖两个基础概念容器Container封装视频、音频和元数据的格式如 MP4、AVI编解码器Codec压缩与解压缩算法如 H.264、VP9。视频转码全局图一张高层架构看懂 YouTube在看转码细节之前先建立全局视角。整个系统分为两条主线Client手机、电脑、智能电视等各类终端CDN专门负责视频流分发通过边缘服务器降低延迟API Servers处理除流媒体外的一切请求上传、元数据更新等Original Storage存放原始视频的对象存储Transcoding Servers视频转码服务器把视频转换为多种分辨率和格式Transcoded Storage存放转码后视频的对象存储。一句话总结视频流走 CDN其他所有请求走 API 服务器这是典型的读写/流量分离设计。视频转码全流程上传之后发生了什么用户上传视频后系统会并行启动两条流程视频文件上传 元数据入库。整个转码流程如下完整链路可以拆解为 5 步[1] 上传原始视频视频文件存入原始存储Blob Storage[2] 转码开始转码服务器把视频转换成多种格式多种分辨率、码率[3] 单路转码完成后两个动作并行执行[3a] 转码结果写入转码存储[3b] 转码完成事件被投入完成队列completion queue[3a.1] CDN 分发转码后的视频被推送到 CDN[3b.1] 收尾通知完成处理器更新元数据并通知用户转码完成可以播放了。注意第 3 步的并行设计——分发和通知互不阻塞这正是消息队列解耦的威力后文详述。DAG任务调度模型把转码变成一张依赖图视频转码计算量大、耗时长。如果用一条流水线串行执行效率极低。业界的做法是用DAG有向无环图模型来描述转码任务每个节点是一个任务每条边是一条依赖关系没有依赖的任务可以并行执行。原始视频先被拆成三条链路再汇聚到最终的合成节点Video 链路视频流 → 转码任务多分辨率/码率/编解码、缩略图生成、水印叠加等这些任务互相独立可并行Audio 链路音频流 → 音频编码如转换为 AACMetadata 链路提取并处理元数据Assemble 节点所有依赖就绪后把各路结果合成最终可播放的视频。 缩略图可以由用户上传也可以由系统自动从视频中抽取生成水印则是叠加在视频上的标识信息用于版权保护。DAG任务调度器如何编排分Stage是关键光有 DAG 还不够还需要一个调度器把这张图变成可执行的计划。DAG Scheduler 的做法是把 DAG 按依赖关系切分成若干个Stage阶段同一 Stage 内的任务互相独立、可以并行Stage 之间严格串行。以视频转码为例调度器会这样切分Stage 1Video 拆分、Audio 拆分、Metadata 处理——三者无依赖全部并行Stage 2Video 文件进一步拆出 Video encoding视频编码和 Thumbnail缩略图两个任务Audio encoding音频编码也加入本阶段并行执行。切分完成后各阶段任务被依次投入资源管理器的任务队列等待被调度执行。这就是DAG 任务调度的核心依赖决定顺序无依赖即并行。视频转码架构深度解析四大组件如何分工把上面两节串起来就是完整的视频转码架构整条流水线由四大组件 一个临时存储协作完成1️⃣ Preprocessor预处理器它是 DAG 的生成器有 4 项职责把视频流按GOP图像组对齐拆分成更小的片段为旧版客户端做 GOP 对齐的二次拆分根据配置文件生成 DAG——开发者用配置描述任务依赖即可无需写死逻辑把 GOP 片段和元数据存入临时存储编码失败时可基于持久化数据重试。DAG 配置文件长这样左边是下载任务右边是转码任务通过 next 字段声明依赖2️⃣ DAG SchedulerDAG调度器上一节讲过的分 Stage 专家把 DAG 图切分为任务阶段放入资源管理器中的任务队列。3️⃣ Resource Manager资源管理器负责资源分配效率内部包含 3 个队列和 1 个任务调度器Task queue任务队列优先级队列存放待执行的任务Worker queue工作者队列优先级队列存放各 Task Worker 的负载情况Running queue运行队列记录正在执行的任务及其所在 WorkerTask scheduler任务调度器核心决策者——从任务队列取最高优先级任务从工作者队列选最优 Worker然后指派该 Worker 执行任务并把状态写入运行队列。4️⃣ Task Workers任务工作者真正干活的计算节点有的跑视频编码Encoder有的生成缩略图Thumbnail有的加水印Watermark有的做合成Merger。不同 Worker 负责不同任务天然支持水平扩展——转码高峰期加机器就行。 Temporary Storage临时存储存放中间产物GOP 片段等用于失败重试。选型要看数据类型、大小、访问频率和数据生命周期等因素。全流程优化让视频转码更快、更安全 速度优化并行一切能并行的并行分块上传把视频切成小分片并行上传速度快且支持断点续传并行处理用消息队列解耦各模块上传、转码、分发、通知各环节独立扩展分布式上传中心借助 CDN 在网络靠近用户的位置做上传枢纽。 安全优化预签名 URL视频存储桶不能对公网裸奔。正确做法是客户端先向 API 服务器申请一个预签名 URLPre-Signed URL只有拿到该 URL 的授权用户才能上传视频既安全又灵活此外还有 DRM 版权保护如 FairPlay、Widevine、AES 加密、视频水印等手段保护视频内容。 成本优化热门视频才放 CDN冷门视频从大容量服务器直接出流极少被访问的视频按需转码不为冷数据预先付出计算成本按地区热度分区分发自建 CDN 并与 ISP 合作降低带宽费用。视频转码全流程总结最后用一张心智地图收尾——从上传到播放视频转码全流程共四步拆分预处理器按 GOP 对齐拆分视频生成 DAG 任务图编排DAG 调度器把任务图切成 Stage无依赖任务标记为可并行调度资源管理器用三队列 调度器把最优任务分给最优 Worker产出转码结果写入转码存储并分发到 CDN事件队列驱动元数据更新和用户通知。记住一个核心思想DAG 任务调度的本质是依赖决定顺序无依赖即并行——它不只适用于视频转码也是几乎所有批处理、数据管道系统的通用范式。相关章节资料相对仓库根目录第 14 章完整笔记14.%20Youtube/Readme.md全书 28 章目录总览Readme.md相关配套阅读第 19 章 分布式消息队列、第 01 章 水平扩展与 CDN【免费下载链接】system-design-notesNotes of the book System Desgin Interview - An Insiders Guide项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-notes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考