媒资管理系统
一份素材从分片上传、转码、识别到编目、检索、借阅审批,在同一条链路上跑完。
媒资系统真正难的不是把文件传上来,而是四件后面的事:大素材要能边传边续、播放要快慢都不卡、每段画面和每句话都要能被搜到、谁能看谁能下要留痕。这个平台把上传、转码、识别、编目、检索、借阅审批串成一条链路,AI 只做标注与预填,发布与放行始终由人点头。
- 72 个管理页面
- 51 个权限点 · 16 个分组
- 转码 · 转写 · 人脸 · OCR
文件库 / 编目 / 检索 / 审片 / 作业 / 治理各域自己的页面
001 → 025,仓库启动按文件名顺序重放
文件、转码、识别、编目、下载单、审计各自独立
分 16 组;细到「审片批注」「导出审计」「下载备份」这一级
上传:大文件按片传,断了接着传
影视素材动辄几十 GB,浏览器一次 POST 传不完,网络一抖就要从头再来。这里把文件切成片、逐片确认、最后按顺序合并:中途断网只要重新问一次「哪些片已经到了」,从缺的那片继续。落盘位置由存储节点决定,不是写死在服务端某一块盘上。
- 三段式分片上传
- 建上传单(init)→ 逐片上传(chunk,带片序号)→ 合并(complete)。每片独立确认,客户端可以并发传,也可以暂停后再续。
- 断点续传有据可查
- 随时查询「已收到哪些片」,前端据此只补缺片;合并前还会核对分片总数,数量对不上直接报错,不会静默合出一个 0 字节文件。
- 整包也能一次进
- zip 上传走独立入口,适合一次交付整批素材;服务端解包后按原有目录结构登记。
- 存储节点可登记、可观测
- 上传目录按节点配置,节点可加多台;容量采集走宿主 statfs,扩容登记与使用量在同一页看,不靠人去 df。
- 不下载也能看
- 视频、音频、图片、PDF、Office(docx / xlsx / pptx 客户端渲染)与三维模型(glb / gltf / obj / fbx / stl)都能在浏览器里直接预览。
- 接口
- init / chunk / complete / chunks 状态,四段都可单独重试
- 并发
- 分片在途数量受限(进程内限流),传满即回 429,不把宿主带宽打死
- 存储
- 本地存储节点,可登记多节点与容量;不依赖对象存储
- 预览
- 视频 / 音频 / 图片 / PDF / Office / 三维五类,均走文件级权限判定
转码:worker 分段跑,长素材不用等一整块
原始素材的码率通常不适合在线播放。转码在这里不是为了「出更多格式」,而是为了两件具体的事:让预览打开就走(低码率版本),和让列表知道自己是什么(封面、时长、分辨率、码率)。长素材拆段并行,最后按顺序拼回一个文件。
- 接任务
- 上传合并后自动登记转码任务,或由人工对单个文件重发;任务与进度可查,不靠翻日志。
- 选 worker
- 先看在线转码服务(带容量),再按集群关系分发;集群没配时不静默失败,会回落本机 ffmpeg 并把这一点留在任务里。
- 分段转码
- 长素材切成若干段,多 worker 并行处理后合并;单机部署时退化成一段到底,行为一致。
- 产物回收
- 低码率预览(640 宽 / 500k 视频 / 64k 音频)、封面(抽第 5 秒)、ffprobe 元数据写回文件记录。
- 状态可见
- pending / processing / completed / failed 四态,失败带原因;播放器在低码率未就绪时降级到原片并提示,不是白屏。
- 集群优先
- transcode_services 里 status=online 且未满载的 worker 才会被选中;capacity 决定一台接几个任务。
- 节点归属
- 分派第一跳查节点所属集群;节点没挂集群就回落本机转码——任务照样完成,但 worker 闲置,这一点要在集群页上看得见。
- 回调确认
- worker 完成后回调后端改状态;回调被拦会让任务停在 processing,因此回调通道单独放行并留痕。
- 转码工具
- ffmpeg / ffprobe(worker 镜像内自带,宿主也可直装)
- worker
- 独立 Go 进程,按端口登记;一台可接多个任务,容量可配
- 产物
- 低码率 MP4 预览 + 封面图 + 元数据;原始文件保持不变
识别:三类结果都落时码,所以搜得到具体那一段
识别本身不稀奇,稀奇的是结果能不能用来找东西。语音转写给出每句的起止时码,人脸给出出现帧,OCR 给出画面里的文字与帧号——三类结果都进同一份检索索引,所以「这句话在第几分钟」「这张脸出现在哪几帧」「这个字出现在哪一帧」是同一个入口问题。
- 语音转写(字幕)
- faster-whisper 转写为带时码的分段,可导出 SRT;中文与英文可选,长素材异步跑(202 + task_id),前端轮询进度,不占着请求不放。
- 人脸检测与人物库
- 四类结果:出现位置(帧 + 人脸框)、相似度候选、人工命名绑定、人物库。相似度只给候选,不做自动合并簇——误合并不可逆。
- 画面 OCR
- 视频按帧、图片整图做文字识别,结果带帧号或页码;识别文本进索引后参与打分(权重低于标题)。
- 模型与部署
- 识别服务只依赖 onnxruntime + opencv,无 torch、无 GPU 也能跑;模型文件可放本机目录,也可换成内网 OCR 服务。
- 任务表带租约与心跳:worker 崩了能重新认领,不会永久卡在 processing
- 帧图落临时目录、任务结束回收;识别结果是「派生产物」,原片不动
- 识别结果只从一个入口写进检索索引(避免两套口径互相覆盖)
- 人脸缩略图与 OCR 文本都属于「取内容」,与文件本身走同一套权限判定
- 人脸相似度只给候选与排序,不自动合并簇;命名必须人工确认
- 转写语言白名单只有中文与英文;其他语种不做无根据承诺
- 识别跑在 CPU 上,长素材按队列排,不承诺「秒出」
编目与检索:先著录,再让人搜到片段
没有编目的素材只是一堆文件;编目之后才有「谁能看、算什么类型、属于哪个专题」。这里把分类树、编目模板、AI 预填与人工审核串成一条路:AI 可以建议字段,但发布动作由有审核权限的人做。检索则同时吃编目字段、字幕、OCR 文本与人脸名,命中后能跳到具体时码。
- 建分类树
- 按业务建多级分类;一个文件在编目上只归一个分类(排他),但可以同时进多个专题/集合(多对多)。
- 配编目模板
- 模板 + 字段两张表:字段键、标签、类型(文本/选项/日期等)、是否必填、默认值、排序都可配,不同素材类型用不同模板。
- 著录与预填
- 人工著录,或让 AI 从标题、字幕、OCR 文本里预填建议值;预填只是建议,仍要人确认。
- 审核与发布
- 提交 → 审核通过 → 发布 / 下架,三步都留操作人;未通过审核的条目不会以「已发布」身份出现在检索里。
- 检索与定位
- 关键词、分类子树、标签、集合、时间范围、有无 OCR / 有无人物等条件组合;结果高亮命中片段,视频直接跳到对应时码。
- 两套排序口径
- 过滤用 ILIKE(带转义,q=% 不会命中全库),排序用 pg_trgm 相似度加权:标题 1.5、人脸名 1.2、正文 1、OCR 0.5。
- facet 六维
- 分类、标签、集合、时间、是否有 OCR、是否有人脸——每维计数与列表同源,不会出现「筛完剩下 3 条但边上写 40」。
- 可见性统一
- 已发布与未编目都可见(published / uncataloged,存量资产不因没编目而消失);受限来源件(作业提交、收集投递)只对本人与评审可见。
- 专题 / 集合
- 专题(带策展排序)与集合(归集)两种形态,成员可拖拽排序、可分享、导出成员清单;与编目的「一个分类」互不替代。
分类 · 标签 · 集合 · 时间 · 有 OCR · 有人脸
每维计数与列表同源,不会出现「筛完只剩 3 条、边上写 40」。
- 标题权重最高:用户通常记得名字,不记得正文
- 人脸名次之:人名检索是媒资库的高频入口
- OCR 权重最低:画面文字噪声大,命中不等于相关
借阅:不是给个下载链接,而是一次可追溯的裁决
素材能不能下,取决于三件事:这份文件的密级与可见性、当前用户的权限点、以及这次申请有没有经过审批。三者缺一不可,且每一步都留记录。批量下载不是把文件挨个放行,而是在打包前逐项重新复核——审批通过后策略被收紧,导出不能绕过它。
- draft
- 用户还在挑,单子未提交;此时不通知审批人,也不占审批额度。
- pending
- 已提交,等待逐项裁决;审批人在待办里看到的是「每一项 + 理由」,不是整单一个按钮。
- part_approved
- 部分批准:已批的可下,未批的仍在等;不会因为一项被拒就整单作废。
- approved
- 全部批准,可打包导出;导出时再逐项复核一次策略与可见性。
- rejected
- 全部被拒;拒绝理由回写通知,申请者可改范围重新提交。
- 文件级策略
- 密级(公开 / 内部 / 受限等)、可见性与「是否允许下载」是文件属性,不是按目录一刀切。
- 权限点判定
- 查看、下载、审批、导出各自是独立权限点;预览权 = 下载权或评审权,不给第三条口子。
- 自批回避
- 提交人不能审批自己的单;管理员也不例外,避免「自己批自己」。
- 通知与留痕
- 提交、逐项裁决、整单通过 / 驳回、撤回都有站内通知;每次决策进操作审计,可按人、按文件回查。
- 两种分享
- 查看型(view)给外部只读浏览;收集型(collect)让外部把素材投进来,投递进收集箱后由内部审阅。
- 口令与有效期
- 分享可设访问口令(哈希存储)与到期时间;到期即失效,不靠人工记得去关。
- 访客页面独立
- 访客只看到分享范围内的文件与只读预览,不出现后台入口;收集链接的上传面板也是独立页面。
协作:审片、作业、组织都在同一套文件上
媒资库不只服务「找和看」。同一份素材可以被拉进审片会话做逐帧批注,也可以作为作业素材发给班级、收学生提交并对提交件评分;人员与班级来自组织架构,权限按角色下发。这些能力共用同一套文件、预览与权限判定,不是另建一套库。
- 审片批注
- 锚点支持时码点、时码区间、帧号、页码与画面几何(三维视角);会话可多人在线,播放进度由主持人同步(playback.sync / control / takeover),批注可回复、可标记解决。
- 作业与提交
- 作业绑定素材或要求提交文件;学生提交进「提交件」域,教师按评分表打分、写意见、导出成绩;AI 可给批改建议,计分仍要人确认。
- 收集链接
- 对外发一个收集链接,外部按表单投递素材;投递件在收集箱里审阅,通过后才进资产库。
- 组织与账号
- 部门树支持改名/移动(路径同事务重写)、环检测;账号可设有效期(到期登录 403,在途会话 ≤5 秒失效)、可批量导入与邀请。
治理:权限、审计、备份、加密都在后台可操作
这类系统上线后最常被问的三件事:谁改了什么、数据丢了怎么办、敏感配置会不会明文躺在库里。三件事在这里都有对应页面与脚本:操作审计可按条件筛并导出,备份可校验可下载,敏感项加密入库且密钥可轮换。
权限点 51 个 / 16 组
文件、编目、下载、AI、审片、作业、集合、组织、存储、系统治理各自成组;内置角色含管理员、普通用户、教师、学生、评审与外部客户。
操作审计
写操作与敏感读都落审计,记录操作人、资源、动作、结果与详情(详情按白名单裁剪,不塞整段请求体),支持导出。
加密与轮换
敏感项用 AES-256-GCM 入库,主密钥放 keyring 文件(0600);轮换是「预检 → 单事务全量重加密 → 切 active」,旧钥保留到下一次成功轮换。
备份与恢复
备份产物可校验、保留期可配、可下载;恢复演练在独立 scratch 库进行,不碰现网库。
IP 白名单
后台入口可限定来源网段,越界直接拒绝;白名单变更同批写审计。
统计看板
调用、下载、审核、资产分布等指标单源口径,另列失败与越权计数;数据不全时显式提示「失真」,不拿空数据画漂亮的 0。
- 部署
- Linux + Docker Compose(也可裸机);后端单进程,转码 worker 与识别服务可分散部署
- 后端
- Go(Gin + pgx);PostgreSQL;迁移随启动按文件名顺序重放
- 转码
- ffmpeg / ffprobe;transcode-worker 按集群与容量分发
- 识别
- whisper-service(:5000)语音转写;ai-service(:5100)人脸与 OCR,CPU 即可跑
- 模型
- 识别服务内置开源模型;文本类 AI(剪辑建议、编目预填)走 OpenAI 兼容端点,可指内网自建
- 存储
- 本地存储节点,可登记多节点与容量;不做对象存储 / 多副本(当前版本口径)
- 权限
- 51 个权限点 / 16 个分组;可接 Spark 单点登录,也可用独立账号体系
- 浏览器
- 桌面 Chrome / Edge / Safari 最新版;三维预览依赖 WebGL
转码 worker 与识别服务可以分散部署,也可以先单机跑通;没有转码 worker 时预览会降级到原片,没有识别服务时检索只剩编目字段——功能随部署递减,不会整站不可用。
申请媒资管理系统试用
官网不提供安装包下载,也没有自助注册或系统登录入口。所有产品一律邮件申请试用:说明使用场景,我们回复开通演示环境或安排演示。