Streamline:使用 Cloudflare Stream 和 Workers 构建自定义视频管线
内容提要
Cloudflare发布开源项目Streamline,演示如何用Workers、Containers和Durable Objects构建自定义视频处理管线。媒体引擎在容器中运行FFmpeg,支持RTMP、HLS输入及叠加、字幕、滤镜、编码等操作,可实时输出到直播或点播。系统提供会话API、WebSocket低延迟预览和访问控制,并附示例应用与公共演示。
延伸解读
架构设计:容器、Durable Objects 与 Workers 的分工
Streamline 将媒体处理管线拆分为媒体引擎和控制应用。媒体引擎运行在容器中,包含 Go 编写的控制器和基于 FFmpeg 的处理器,负责实际的音视频输入输出与处理。控制应用则基于 Workers 构建,通过 Durable Object 编排会话生命周期和预览中继。这种分工让处理进程独立于控制请求,即使 Worker 断开,容器仍可继续运行,适合长时间直播或点播处理任务。
会话管理与容器生命周期
Streamline 的会话由控制 Worker 发起,但容器会持续运行直到控制方停止或达到最大时长。由于 Cloudflare 容器默认在无请求时休眠,Streamline 通过重写 onActivityExpired() 回调,在会话未过期时续期活动,否则销毁容器。这保证了管线不会因控制端断开而意外终止,同时通过最大时长限制避免无限运行。同一时间一个容器实例只能服务一个会话。
安全与访问控制设计
Streamline 将安全作为核心设计,而非事后补充。部署通过 Workers 的 Access 集成保持私有,只有授权用户能创建或控制会话,且会话之间相互隔离。Stream Live 的 RTMPS 输入输出密钥存储在 Worker 密钥或 Durable Object 存储中,不会返回给控制应用或浏览器。预览流使用两种凭证:Access 服务令牌认证容器工作负载,每会话随机能力授权发布。当前部署使用临时路径绕过,后续替换为服务认证。
当前限制与未来方向
Streamline 目前使用容器 CPU 进行媒体处理,在高质量或高帧率场景下会成为瓶颈。管线操作顺序由引擎固定,配置数组中顺序不影响实际执行。未来计划扩展至计算机视觉管线、硬件加速媒体处理、基于 WebRTC 和 MoQ 的实时体验,并最终在 Workers 中原生支持视频编解码。项目已开源,并提供公共演示环境供开发者体验。
Q&A
Streamline 是什么?它主要用来做什么?
Streamline 是 Cloudflare 发布的一个开源开发者演示项目,用于展示如何利用 Workers、Containers 和 Durable Objects 构建自定义视频处理管线。它可以对视频进行实时修改,例如添加叠加层、烧录字幕、应用滤镜和重新编码,并将处理后的视频输出为直播流或点播视频。
Streamline 的系统架构由哪些部分组成?
Streamline 部署包含两个主要组件:媒体引擎(Media Engine)和控制应用(Application)。媒体引擎运行在 Container 中,负责媒体输入/输出和处理,内部由 Go 编写的控制器和 FFmpeg 处理器组成。控制应用基于 Workers 构建,包含用户界面和由 Durable Object 实现的任务编排器,负责创建、配置、观察和停止媒体会话。
Streamline 支持哪些视频输入和输出方式?
输入方面,Streamline 支持从 Stream Live 输入拉取 RTMPS 流、从 Cloudflare Stream 拉取 HLS 清单及分片,以及接收控制应用提供的视频源(如网络摄像头)。输出方面,它可以向另一个 Stream Live 输入发布 RTMPS 流,也可以通过 WebSocket 输出 fMP4 格式的预览视频。
Streamline 如何处理长时间运行的视频处理会话?
Streamline 利用 Container 提供长时间运行环境,并通过覆盖 onActivityExpired() 回调来维持会话。当容器一段时间没有收到请求时,该回调会检查会话是否过期:如果未过期则续期活动超时,否则销毁容器。此外,系统还设置了最大持续时间,确保会话最终一定会关闭,不会无限运行。
Streamline 提供了哪些 API 来操作视频处理管线?
Streamline 导出了两个包:@cloudflare/streamline/client 提供基于会话的高层 API,@cloudflare/streamline 暴露与容器关联的 Durable Object 基类。客户端 API 包括 createStreamline()、sessions.create()、sessions.resume(id)、session.start(config)、session.ingest(chunk)、session.annotation(png)、session.metrics() 和 session.stop() 等方法。
Streamline 目前支持哪些视频处理操作?
Streamline 目前支持四种操作:filter(应用滤镜,如模糊、饱和度)、overlay(叠加图片,可通过 URL 引用或通过 annotation() 调用指定二进制 PNG)、subtitle(烧录字幕)和 encode(指定输出编码参数)。这些操作的执行顺序由底层媒体引擎固定,配置数组中指定的顺序不影响实际执行顺序。
Streamline 如何保证安全性?
Streamline 通过 Workers 的 Access 集成保持部署私有,验证 Access 会话后才接受控制请求,并将活动会话绑定到已验证的主体。Stream Live 输入密钥存储在 Worker 机密或 Durable Object 存储中,不会返回给控制应用。预览视频流使用两种凭证:Cloudflare Access 服务令牌用于容器工作负载认证,随机生成的每会话能力用于授权发布。系统还限制资源使用,确保会话相互隔离。
如何试用 Streamline?
Streamline 已开源并部署了公共演示环境。你可以访问 https://playground.streamline-video.workers.dev 试用公共演示。源代码位于 Cloudflare 的 GitHub 仓库:https://github.com/cloudflare/streamline(媒体引擎和包导出)和 https://github.com/cloudflare/streamline-demo(示例应用 Worker、Astro 前端、部署配置和 Access 工具)。