跳转到内容
TubePress — 免费、自托管 & 持续维护
媒体与转码

转码

TubePress 如何借助分布式 FFmpeg 工作进程,将上传文件转换为适合网页播放的多清晰度版本。

转码将单个上传文件转换为多个适合网络播放的 MP4 版本,让观看者无论上传的是什么格式,都能获得清晰度选择菜单、快速启动的播放体验以及统一的编解码器。此外,它还会嵌入可选的附加功能—水印和片头/片尾片段—并生成播放器所需的进度预览缩略图。

此处所有内容均在 /admin/settings?tab=transcode 下配置,分布在 格式队列服务器水印片头时间轴 子标签中。转码可以在 CMS 服务器本身上运行,也可以分发到专用的工作节点。

为什么要转码

原始上传文件可以是任意分辨率、编解码器或容器格式。转码将其标准化为带有 +faststart 标志的 MP4/H.264 版本,使播放在文件完全下载前就能开始,同时生成多种尺寸(例如 720p 和 480p),以便 播放器 能够提供清晰度选择器,并为小屏幕设备提供较小的文件。水印和片头/片尾片段也在同一处理流程中应用,因为它们必须编码进每个版本。

转码流水线

当视频准备好处理时,TubePress 会为每个输出在 transcode_jobs 表中创建一个任务并依次处理:

  1. 排队。为全分辨率源层级和所有低于源高度的活跃格式各创建一个任务,如果启用了预览,则额外创建一个时间轴任务。
  2. 领取。工作节点—本服务器或远程服务器—认领下一个待处理任务,从源层级开始。
  3. 下载。远程工作节点通过 HTTP 拉取源文件(一个经过密钥认证的直接 URL,可绕过签名媒体链接)。
  4. 转码。FFmpeg 对版本进行编码,按配置应用剪裁、水印和片头,并实时报告进度百分比。
  5. 上传与回调。结果以分块方式上传回服务器,回调标记任务完成。

视频状态跟踪此流程:任务运行时处于 处理中 状态,源层级完成后立即切换为 已发布,只有当源层级永远无法生成时才变为 错误。较低分辨率版本在发布后继续生成。

嵌入视频从不进行转码。只有上传的或基于 URL 的文件才会进入处理流水线;带有嵌入代码的视频直接从其源地址提供。

版本与格式

输出格式可在 格式 标签中完整编辑,并存储在 video_formats 表中。每种格式包含名称、文件后缀(例如 _720p.mp4)、目标分辨率、原始 FFmpeg 选项、保持宽高比 标志和激活开关。内置默认值为:

格式分辨率
720p1280 × 720
480p854 × 480
360p640 × 360

两条规则确保质量合理。TubePress 从不进行放大:任何等于或高于源高度的格式将被跳过。并且 原始最高质量始终保留—如果启用了水印或剪裁,将重新编码为全分辨率 版本(在队列中显示为星号),否则直接提供源文件。开始剪裁 选项(0–300 秒)可以去掉每个视频的开头几秒;与水印一样,它会应用于包括源文件在内的每种格式。

任务队列

队列 标签(/admin/settings?tab=transcode&sub=queue)按视频分组显示任务,并支持按 全部 / 待处理 / 处理中 / 已完成 / 失败 筛选。每个视频为每个层级显示一个徽章—带星号的源层级,然后是各分辨率,最后是 TIMELINE—以任务状态着色:

待处理
已排队,等待空闲工作节点。
处理中
活跃中,显示实时阶段(下载、转码或上传)和百分比。
已完成
版本已生成并存储。
失败
当前已超出重试次数;自动恢复仍适用(见下文)。

每个视频的控制台(终端图标)实时流式传输任务列表、处理每个层级的工作节点、已用时间和任何错误信息。重试失败任务 按钮一键将所有当前失败的任务重新排队。

远程转码服务器

转码是 CPU 密集型操作,因此可以将其从 Web 服务器中卸载。在 服务器 标签中,本服务器 设置本地同时运行的 FFmpeg 任务数量(1–4,或设为 0 以仅使用远程工作节点),并允许覆盖 FFmpeg 路径。在其下方可注册远程工作节点;任务会自动分配给负载最低的节点,每个节点都有 最大并发任务数 限制(推荐每两个 CPU 核心对应一个任务)。

  1. 添加服务器。点击 添加服务器,输入名称和 URL(例如 http://YOUR-IP:8090),然后保存。API 密钥和启动命令将立即显示。
  2. 安装 FFmpeg + PHP。在工作节点机器上运行 sudo apt install ffmpeg php-cli php-curl
  3. 部署工作节点。下载 transcode-worker.php(从 /api/transcode-worker-download 或临时 wget 链接获取),上传并使用 sudo ufw allow 8090/tcp 开放端口。
  4. 启动。使用您的密钥运行工作节点:
php transcode-worker.php --port=8090 --key=YOUR_API_KEY
  1. 验证。点击 检查;健康的工作节点将报告 在线,并显示检测到的编码器和实时 CPU/GPU 使用情况。

GPU 加速(NVIDIA、AMD、Intel 或 Apple)会被自动检测并使用。工作节点拉取源文件、转码、报告进度并以分块方式将结果上传回 CMS—分块上传的目的是将每次请求保持在 Cloudflare 100 MB 限制以内。对于无人值守的主机,安装指南包含一个 systemd 单元,以便工作节点在启动时自动重启。

在生产环境中保护工作节点。工作节点在其端口上使用明文 HTTP 通信。请在其前端放置带 HTTPS 的 nginx,并将端口限制为仅允许 CMS 服务器访问。

监控与重试

系统的设计确保视频永远不会被静默放弃。编码失败后会以递增的退避间隔自动重试—从大约半分钟到几小时不等—因为大多数失败都是暂时性的(CDN 缓慢或不稳定)。除此之外,每小时的恢复任务会重新排队所有仍标记为失败的任务,持续尝试直到版本成功生成。无需手动点击,但如果需要强制重试,重试失败任务 按钮随时可用。

如果源层级本身永久失败,其依赖的子格式任务将被取消(没有源文件无法继续),视频将被标记为 错误;恢复机制仍会尝试修复。当源层级最终完成时,视频将自动发布。

系统要求

FFmpeg 必须在转码运行的任何位置可用:

  • 本地处理:在 CMS 服务器上安装 FFmpeg(sudo apt install ffmpeg)。转码 页面安装后将显示检测到的版本。
  • 远程处理:每个工作节点需要 FFmpeg 以及 php-cliphp-curl,至少 2 个 CPU 核心和 2 GB 内存,并开放工作节点端口。
没有 FFmpeg,就没有转码。如果本地缺少 FFmpeg 且没有远程服务器在线,则无法启用转码开关—请先安装 FFmpeg 或添加工作节点。

后续步骤

还有疑问?

从您的控制面板提交工单,我们的团队将为您提供帮助。

体验在线演示 → 下载 TubePress →