视频创意是一个数据密集型工作流。一个 Adstacker 项目可以包括源片段、缩略图、标准化视频、提取的音频、可重用叠加层和最终变体。我们需要上传不会使应用服务器过载、可靠的验证、可预测的输出位置以及对废弃工作的清理。
Amazon S3 是该工作流背后持久的资产层。Adstacker 使用它将大文件直接从创作者移动到存储,组织项目的每个阶段,并使完成的视频可供下载。
挑战:视频资产迅速增加
创意测试允许少量片段生成许多变体——并带来资产管理问题。一个项目可能始于“hook”、“body”和“CTA”素材,然后生成标准化副本、音频、带字幕的叠加层、缩略图以及最终的 MP4 或 MOV 输出。
通过 API 传输每个字节都会减慢上传速度并消耗服务器带宽。松散的文件名会使重试变得困难,并在创作者在上传过程中关闭选项卡时留下孤立资产。
存储必须是生产流程中有意为之的一部分。
我们的方法:S3 贯穿资产生命周期
S3 从项目创建到最终下载都参与其中。后端处理授权、清单、验证和作业状态;S3 处理大对象。
架构

这种分离为媒体文件提供了直接、持久的存储路径。
1. 直接从浏览器上传大视频
当创作者开始一个项目时,Adstacker 会创建一个源视频清单,并为每个文件返回一个预签名的 S3 POST 请求。浏览器直接将文件发送到 S3,而不是通过后端代理。
S3 执行签名上传约束:固定的内容类型和允许的大小范围。这些在上传文件到达之前阻止了空文件或过大的上传,而短时效的请求限制了浏览器可以上传的内容。
如果会话中断,Adstacker 会为待处理的视频重新签发新的 URL。它还在恢复期间检查 S3,因此即使对象错过了完成回调,仍然可以进行协调和验证。
2. 在处理之前验证已到达的内容
浏览器中的上传完成不足以开始渲染。后端使用 S3 HEAD 请求来确认对象,读取其大小和 ETag,并将该 ETag 与已验证的视频一起保存。
接下来,Adstacker 临时下载对象进行 FFprobe 验证。我们确认它可读,并且持续时间和有效分辨率符合项目要求。无效文件会收到有用的拒绝原因并被删除;瞬时读取失败会使对象保留在原位以供重试。
每个视频都经历一个清晰的生命周期:待处理、上传中、已上传、验证中、已验证或已拒绝。项目只有在每个预期资产都经过验证后才会推进,并且原子更新可防止重复回调导致视频被重复计数。
3. 使每个输出都可预测且可重用
Adstacker 根据项目、资产类型、类别和变体使用确定性的 S3 路径。标准化媒体和提取的音频与渲染的叠加层和最终组合分开存储。
这种组织方式通过三种方式帮助了管道:
- 直接查找:工作程序可以准确地找到与项目和变体关联的输入或输出。
- 高效重用:可重用的叠加层存储一次,并且可以支持多个最终组合。
- 幂等重试:重试会写入相同的预期键,避免不断增加的重复导出轨迹。
最终的视频记录保留了输出、缩略图以及(如果相关)MOV 变体的 S3 键和 URL。然后,应用程序可以提供已准备好的格式。
4. 安全地提供访问并清理未完成的工作
S3 存储桶是私有的。Adstacker 签发有时效的签名下载 URL,可选择附带下载文件名,因此资产不需要公开暴露。
并非所有上传都会成为已完成的项目。定时清理会识别过时的未完成项目并删除其剩余的 S3 源对象。被拒绝的上传会在验证失败后立即删除。
这些生命周期规则限制了废弃的存储,同时保留了项目历史。
实际案例:中断的上传不意味着从头开始
想象一位营销人员上传了六个片段,在其中四个到达 S3 后关闭了浏览器。返回时,Adstacker 会恢复上传会话,并为未完成的片段提供新的预签名请求。它还会检查文件是否已到达 S3,即使其完成回调已丢失。
一旦所有六个文件都经过验证和确认,项目就会进入处理阶段。源文件、准备好的媒体、叠加层、缩略图和最终变体在后续的每个步骤中都以已知键值进行组织。
专为创意速度设计的存储
Amazon S3 让 Adstacker 能够将视频资产视为一个受管理的生命周期:直接上传、验证对象、验证媒体、创建可预测的输出、授权下载以及清理未完成的工作。这使得创意管道可以专注于将片段转化为可测试的变体。
将您的资产上传到 Adstacker,构建您想要测试的组合,并让平台管理每个渲染背后的存储工作流。
技术栈:Amazon S3 · AWS SDK for JavaScript · Presigned S3 POSTs · NestJS · FFprobe · AWS ECS Fargate · MongoDB
了解更多来自我们团队的内容
1. 导出服务与视频编辑器管道
2. 构建一个普通的视频编辑器

