快速开始

3 分钟跑通第一个 FFHub 云端 FFmpeg 任务。

这篇教你完成第一次 API 调用:拿到密钥、提交转码任务、读取结果。

1. 拿到 API Key

ffhub.io 注册,进 控制台 API Keys 创建一个。Key 形如 sk_xxxxx,注意保密。

新用户注册自带免费额度,下面这套流程跑下来不用花钱。

2. 提交任务

任意 FFmpeg 命令打到 POST /v1/tasks 即可。输入文件必须是公网可访问的 URL,本地路径会被云端 worker 拒掉。

curl -X POST https://api.ffhub.io/v1/tasks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "command": "ffmpeg -i https://storage.ffhub.io/Sample_Video_File_100MB.mp4 -c:v libx264 -preset fast output.mp4"
  }'
const res = await fetch("https://api.ffhub.io/v1/tasks", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.FFHUB_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    command:
      "ffmpeg -i https://storage.ffhub.io/Sample_Video_File_100MB.mp4 -c:v libx264 -preset fast output.mp4",
  }),
});
const { task_id } = await res.json();
import os, requests

res = requests.post(
    "https://api.ffhub.io/v1/tasks",
    headers={"Authorization": f"Bearer {os.environ['FFHUB_API_KEY']}"},
    json={
        "command": "ffmpeg -i https://storage.ffhub.io/Sample_Video_File_100MB.mp4 -c:v libx264 -preset fast output.mp4",
    },
)
task_id = res.json()["task_id"]

返回里的 task_id 拿来轮询状态:

{
  "task_id": "01abcd…",
  "status": "pending",
  "created_at": "2026-05-10T12:00:00Z"
}

3. 轮询直到完成

curl https://api.ffhub.io/v1/tasks/TASK_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

每 2-5 秒查一次。status 变成 completed 后,响应里会带公网下载链接:

{
  "task_id": "01abcd…",
  "status": "completed",
  "progress": 100,
  "outputs": [
    {
      "filename": "output.mp4",
      "url": "https://storage.ffhub.io/outputs/01abcd…/output.mp4",
      "size": 10485760
    }
  ]
}

输出链接 24 小时 后过期,要保留请提前下载。

上传本地文件

如果输入文件不是公网 URL,先上传拿到一个。两步走:

# 1. 申请一次性的签名 PUT URL
SIGNED=$(curl -s -X POST https://api.ffhub.io/v1/uploads/sign \
  -H "Authorization: Bearer $FFHUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename":"input.mp4","size":12345678,"content_type":"video/mp4"}')

# 2. 把文件直接 PUT 到 R2 —— 你的服务器不经手任何字节
curl -X PUT "$(echo "$SIGNED" | jq -r '.upload_url')" \
  -H "Content-Type: video/mp4" \
  --data-binary "@./input.mp4"

# 返回的 .public_url 字段就是你在任务命令里传给 `-i` 的地址。

完整流程见 上传文件

后续

快速开始 — FFHub Docs