ファイルアップロード
ローカルファイルを FFHub が読める公開 URL に変換。
FFHub のワーカーはクラウド上で動作し、公開 URL のみを入力として受け付けます。ファイルがローカル、スマホ、またはプライベートストレージにある場合は、まず FFHub Storage にアップロードして公開リンクを取得し、それを ffmpeg コマンドに渡してください。
アップロードの仕組み
2 ステップで完了、ファイルは弊社サーバを経由しません。クライアントが使い捨ての署名付き URL を取得して、R2 に直接 PUT します。
- 署名。
POST /v1/uploads/signで 15 分間有効な署名付き URL が返ります。 - PUT。
curl、fetch、その他任意の HTTP クライアントでその URL にバイトを送ります。
このおかげで、データパスに弊社サーバが入らないまま、最大 5 GB までアップロードできます。
ステップ 1 — 署名付き URL を取得
curl -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"
}'
レスポンス:
{
"upload_url": "https://...r2.cloudflarestorage.com/...?X-Amz-Signature=...",
"public_url": "https://storage.ffhub.io/tmp/uploads/<user>/<rand>.mp4",
"key": "tmp/uploads/<user>/<rand>.mp4",
"content_type": "video/mp4",
"expires_at": "2026-05-12T05:30:00Z"
}
ステップ 2 — ファイルをアップロード
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: video/mp4" \
--data-binary "@./input.mp4"
Content-Type ヘッダはステップ 1 で送った content_type と完全に一致させてください — そうでないと R2 が署名を弾きます。
PUT が 200/204 を返した瞬間から、ステップ 1 の public_url はそのまま読み取り可能になります。
エンドツーエンドの例
FILE=./input.mp4
SIZE=$(stat -f%z "$FILE" 2>/dev/null || stat -c%s "$FILE")
# 1. 署名取得
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\":$SIZE,\"content_type\":\"video/mp4\"}")
UPLOAD_URL=$(echo "$SIGNED" | jq -r '.upload_url')
PUBLIC_URL=$(echo "$SIGNED" | jq -r '.public_url')
# 2. R2 へ直接アップロード
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: video/mp4" \
--data-binary "@$FILE"
# 3. public_url を入力にタスクを投入
curl -X POST https://api.ffhub.io/v1/tasks \
-H "Authorization: Bearer $FFHUB_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"command\":\"-i $PUBLIC_URL -c:v libx264 -crf 28 output.mp4\"}"
CLI ならこの流れを自動で処理します — CLI を参照。
制限
- 最大サイズ:1 アップロードあたり 5 GB(R2 単発 PUT の上限)
- 署名 URL の有効期間:
expires_atから 15 分、過ぎたら再署名 - ファイル保持期間:7 日、その後 R2 から削除
7 日以上保持したい場合は、タスク完了後すぐに自分のバケットにコピーしてください。
すでに公開 URL がある場合は?
このフローはまるごと不要です。タスク API は -i 入力に任意の公開 URL を受け付けます:
curl -X POST https://api.ffhub.io/v1/tasks \
-H "Authorization: Bearer $FFHUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{"command":"-i https://example.com/clip.mp4 -c:v libx264 output.mp4"}'
自前の S3、自前の CDN、弊社のストレージ — どれも同じ扱いです。タスクモジュールはバイトの所在を気にしません。