上海日报视频资源库
Shanghai Daily Media Library

项目流程(端到端链路)

目标:围绕“上传 → 断点续传 → 存储 → 异步转码 → 封面抽帧 → 权限与分发 → 审计追踪”,形成稳定可追溯的视频资产管理链路。 当前仓库包含一个纯 PHP API 原型(上传、入队、Worker、回调记录)。

全链路流程

从客户端上传到云端转码回调的核心路径(可横向滚动)。

1入口与权限
账号/角色

登录、权限校验、操作审计

管理员管理用户与配置;普通用户受限于上传/查看/下载。关键操作记录操作人和视频 ID。

2初始化
/uploads/init

创建 upload_id 与上传参数

提交文件元信息(filename/size/mime/chunks),返回 upload_id 与分片大小建议。

3分片上传
断点续传

逐片写入 + manifest 跟踪

按 index 上传二进制分片,支持失败重试与从最近成功分片续传;本地维护 manifest.json。

4合并入库
/uploads/{id}/complete

合并文件 + 生成 video_id

校验 total_chunks 与扩展名,合并为完整文件;video_id 作为后续存储与转码关联的唯一标识。

5上传源视频
OBS PUT

写入 OBS 源桶 + 设置 ACL

源视频存储至约定路径(按 video_id 归档并重命名),上传完成后设置互联网只读(ACL/桶策略)。

6入队任务
Redis

创建转码/抽帧作业(异步)

生成转码输出路径与截图参数,将作业写入队列;同时写入任务记录,便于追踪与重试。

7Worker 消费
worker/transcode_worker.php

调用 MPC:转码 + DOTS 截图

从队列读取作业,调用华为云 MPC 提交异步转码,并按配置抽取 5 帧截图(含主封面候选)。

8回调更新
/callbacks/mpc

落库状态、可检索与告警

MPC 回调携带 task_id 与状态;系统更新任务状态与回调 payload,便于错误追踪与告警。

9检索与分发
前端控制台

预览/下载/分发与权限控制

列表分页、标签检索、排序与视图切换;对外分发统一基于只读对象链接或 CDN,并受权限约束。

核心标识
video_id
上传机制
分片 + 断点续传
处理方式
异步队列驱动
外网访问
ACL/桶策略只读

存储与路径

与 REQUIREMENTS.md 一致的 OBS 路径规范。

源视频(原始文件)

obs://obs-shine-video/{video_id}/{video_id}.{ext}
  • 上传完成后设置互联网只读(ACL/桶策略)。
  • video_id 既是目录名也是文件名(便于追溯与去重)。

转码与封面(输出文件)

obs://obs-shine-video-result/out-new/{yyyy-mm-dd}/{video_id}/
  thumbnail/   (默认抽 5 帧,含主封面候选)
  transcoding/ (多码率/多封装按模板生成)
  • 按日期分区,便于生命周期管理与归档。
  • thumbnail 与 transcoding 分目录,方便权限与分发策略。

异步与失败处理

保证“可追踪、可重试、可回放”。

推荐策略(需求侧)

  • 分片上传:校验、重试、失败可从最近成功分片续传。
  • 转码/抽帧:异步队列 + 任务状态跟踪 + 回调入库。
  • 失败告警:保留错误日志,支持重新提交任务。
  • 审计日志:上传、合并、OBS 写入、ACL 设置、回调全链路记录。

仓库原型现状(实现侧)

  • 上传分片与合并:src/Services/ChunkStore.php(manifest.json 持久化)。
  • OBS 上传:src/Services/ObsClient.php(简单 AK/SK 签名 PUT)。
  • 队列:src/Queue/RedisQueue.php(无 Redis 扩展则写入 fallback log)。
  • Worker:worker/transcode_worker.php(消费队列、调用 MPC)。
  • 回调:src/Controllers/CallbackController.php(写入 storage/jobs)。

原型 API(当前仓库)

便于对照流程快速联调。

POST /uploads/init
POST /uploads/{id}/chunk?index=0
POST /uploads/{id}/complete
POST /callbacks/mpc
GET  /health

本地快速跑起来(无需网络调用)

php -S localhost:8000 -t public/
# .env 中设置 LOCAL_MOCK=true 跳过 OBS/MPC 实际调用

组件映射(代码 → 流程)

静态页用于展示全局结构,真实实现以代码为准。

环节 职责 入口/文件
路由 纯 PHP 路由匹配与分发 public/index.phpsrc/Http/Router.php
上传控制器 init/chunk/complete;组装 OBS 路径并入队任务 src/Controllers/UploadController.php
分片存储 chunks 写入、manifest 跟踪、合并与清理 src/Services/ChunkStore.php
OBS 客户端 PUT 上传源视频(可带 x-obs-acl 等头) src/Services/ObsClient.php
队列 Redis rPush(无扩展则落盘 fallback) src/Queue/RedisQueue.php
Worker 消费队列,调用 MPC 提交转码与截图 worker/transcode_worker.php
MPC 客户端 调用 /transcodings 与 /thumbnails src/Services/MpcClient.php
回调 接收 task 状态并写入 JobStore src/Controllers/CallbackController.php
审计/任务记录 落盘日志与 jobs json(后续可替换为 MySQL) src/Support/Logger.phpsrc/Support/JobStore.php

界面示例(静态页)

用于演示“检索列表 → 详情页”的信息结构与视觉风格。

列表页

  • 支持分类 Tab、关键词检索、排序与视图切换。
  • 点击卡片进入详情页(携带 title/creator/created_at)。

详情页

  • 预览区 + 侧栏信息 + 转码结果表格(外链复制/操作入口)。
  • 布局与交互样式参考提供的详情页截图。