気に入った短いクリップがあります。480p で安く生成したもの、あるいは古い映像から切り出したもので、音をそのまま残したまま 1080p か 4K で公開しなければなりません。動画高解像度化の API なら 1 回の呼び出しで済みますが、呼び出しは作業の真ん中にすぎません。ファイルが使えるかどうかを決めるのは、その直前(編集の完了、元の動画の確認)と直後(時間内のダウンロード、サイズと長さ、音声の確認、納品先が求める寸法のまま書き出すこと)です。
要点だけを先に。最終カットを、納品先が必要なティアで、1 回だけ拡大します。SpicyAPI Video Upscaler は 3 秒から 60 秒の MP4 とティアを受け取り、長さ、アスペクト比、動き、音のトラックをそのままに保ちながら、同じクリップをより高い解像度で返します。プロンプトはありません。価格は、720p または 1080p で元動画 1 秒あたり $0.006、2K で $0.012、4K で $0.024 です。
何を送り、何を支払うか
video_url(MP4 への直接リンク、またはアップロードしたファイル)を送り、必要に応じて resolution を指定します。720p、1080p(既定)、2k、4k のいずれかです。アップロードできる MP4 は最大 90 MB まで。課金は元クリップの秒数ごとで、整数秒に切り上げ、3 秒が最低額です。
| 元クリップ | 720p / 1080p | 2K | 4K |
|---|---|---|---|
| 5.2 秒(6 秒として課金) | $0.036 | $0.072 | $0.144 |
| 20 秒 | $0.12 | $0.24 | $0.48 |
| 60 秒 | $0.36 | $0.72 | $1.44 |
切り上げは提出したクリップごとに適用されます。5.2 秒のクリップを 3 本送ると、16 秒ではなく 18 秒として課金されます。送信前に表示される見積もりは 60 秒のクリップを前提にしたものです(1080p で $0.36、4K で $1.44)。タスクの確定時に未使用分が解放されるので、6 秒のクリップは 6 秒として課金されます。失敗したタスクは返金されます。
拡大の費用面の根拠は生成側にあります。Seedance 2.5 Spicy で 480p として生成した 10 秒のクリップは 1 回あたり $2.16。ネイティブの 1080p なら $10.80 になります。まず 480p で下書きし、残したい take を決め、1080p へ拡大するのに $0.06 を足す。拡大器はフレームにすでに入っているものを大きくするので、下書きにないディテールは出てきません。小さなラベルや顔を精密に合わせる必要があるなら、下書きの段階で確かめるか、より高い解像度で下書きしてください。
元動画を準備する
先に編集を完了させます。 拡大する前に、トリム、並べ替え、音声のミックスを済ませてください。あとから編集を直すたびに数倍の画素数を持つファイルでやり直すことになり、捨てる秒数の処理にも料金を払うことになります。拡大器は間違えた take を直せません。歪んだ手やズレたロゴは、そのまま大きくなって戻ってきます。
ファイルを確かめます。 ffprobe は実際に提出しているもの、つまり画面では「60 秒」に丸めて表示されるが実際は 60.4 秒である長さも含めて示します:
ffprobe -v error \
-show_entries format=duration,size:stream=codec_type,codec_name,width,height,avg_frame_rate,sample_rate,channels \
-of json approved-source.mp4見るべき点は 3 つです。長さは 3 秒から 60 秒の間に入っていなければなりません。スマホのクリップは縦向きで再生されることがあります。保存されたフレームは横向きで回転フラグを持ちます(ffprobe -show_streams は side data の中にそれを出します)。アップロードの前に回転を焼き込んでください。音声ストリームにも注目してください。あとで結果と比較します。
すでに十分な大きさのクリップは飛ばします。 そのティア以上のクリップはほぼ同じ大きさで戻ってきますが、課金はされます。720p で送った 786x1178 のクリップは 784x1176 で戻りました。元の動画がすでに納品先の仕様に合っていれば、そのまま書き出して終えてください。
最もきれいなマスターから始めます。 圧縮ブロックとノイズも、ほかのものと一緒に拡大されます。生成マスターか編集マスターを使い、ソーシャルフィードから再ダウンロードしたコピーは使いません。
納品先からティアを選ぶ
ティアはアスペクト比を保った画素予算です。そのため普通でない元の動画には、普通でない大きさで戻ってきます。832x480 のクリップは 1080p で 1896x1094、4K で 3792x2188 に戻りました。854x480 のクリップは 1922x1080 に戻ります。ちょうど 1920x1080 になるとは期待しないでください。
- 720p または 1080p はフィード、ランディングページ、広告向けです。どちらも同じ価格なので、価格ではなく納品先を基準に選んでください。1080p が既定で、たいてい正しい選択になります。
- 2K または 4K は大きなディスプレイ、プレゼンテーション、あとからトリムする場合向けです。価格は 2 倍と 4 倍になり、時間もかかります。5 秒の 1080p のジョブで約 35 秒、4K で約 100 秒です。5 秒の 4K ファイルはおよそ 19 MB になります。
- 納品先が 1080x1920 のような厳密な寸法を必要とする場合は、拡大とは別の書き出し工程として扱います。
横向きのクリップを拡大してから縦にトリムすると、捨てる画素分の代金を払っていることになります。構図は拡大前に決めて、最終的な構図を送ってください。
まず Playground で試す
- Video Upscaler のページを開き、Playground タブの Form ビューに留まって、残高のあるアカウントでログインして実行します。
- Input video に承認済みの MP4(最大 90 MB)を置くか、Asset URL でファイルの直接リンクを貼り付けます。動画を再生するページを渡すと HTML が返り、課金は返金されたうえで呼び出しが失敗します。ファイルをアップロードするのがいちばん確実です。
- Resolution を 720p、1080p、2K、4K のいずれかにします。価格に影響する項目として表示され、見積もりは選択に応じて更新されます。
- 実行し、結果と元の動画を突き合わせて再生し(下記の確認事項)、そのあとで自分のストレージへコピーします。
5 秒のクリップは 4K でも数セントです。コードを書く前に、実際に納品するティアで自分のクリップを試してください。
それからコードから実行する
Python SDK を入れ(pip install spicyapi)、サーバー環境で SPICY_API_KEY を設定して、次を実行します:
import uuid
from spicyapi import SpicyClient, output_assets
client = SpicyClient() # reads SPICY_API_KEY from the environment
task = client.create_task(
model="spicyapi/video-upscaler-v1/upscale",
input_data={
"video_url": "https://example.com/approved-product-ad.mp4",
"resolution": "1080p",
},
idempotency_key=str(uuid.uuid4()), # one key per approved clip and tier
)
print("Resume task:", task["taskId"], flush=True)
final = client.wait_for_terminal(task["taskId"])
if final["state"] != "succeeded":
raise RuntimeError(f"{task['taskId']} ended as {final['state']}: {final.get('errorCode')}")
assets = output_assets(final)
if not assets or any(a.get("pending") or a.get("unavailable") or not a.get("url") for a in assets):
raise RuntimeError(f"Task {task['taskId']} has no ready output; check this task before a new run")
print(assets[0]["url"]) # copy the file to your own storage now作成、待機、リトライ、エラーコード、ダウンロードは tasks ガイドと Python SDK リファレンスにまとまっています。ローカルファイルは無料のアップロード手順を通り、spicy:// の URI として渡します。結果リンクの有効時間は短く、ファイルは約 14 日間保持されるので、その上に構築する前に保持と納品を確認してください。succeeded はサービスが処理を終えたことだけを意味します。下記の確認事項を通ったあとで、クリップを納品済みとしてマークします。
あるいはエージェントに実行させる
アシスタントに拡大を実行させる場合、3 つの公式ツールはいずれも価格を表示し、有料の呼び出しの前に確認を求めます。
- CLI.
{"video_url": "https://example.com/approved-product-ad.mp4", "resolution": "1080p"}をinput.jsonに入れて、次を実行します:
``bash spicyapi tasks create --model spicyapi/video-upscaler-v1/upscale --input-file input.json --wait ``
CLI のドキュメントも参照してください。npx @spicyapi/cli はインストールなしでも動きます。
- MCP サーバー。 MCP サーバーを追加し、こう尋ねます:「Upscale approved-source.mp4 to 1080p with Video Upscaler.」
spicyapi_upload_fileでファイルをアップロードし、spicyapi_task_createを呼び、それが価格確認のために停止し、spicyapi_task_waitを呼びます。 - Skill.
npx skills add spicyapi-ai/spicy-skillは Agent Skillを入れ、項目を推測せずに現在のモデルスキーマを読ませます。
結果を元の動画と突き合わせる
同じプローブを両方のファイルに実行して比較します。次の短いスクリプトはクリップごとに 1 行を出力します:
probe() {
ffprobe -v error -of json \
-show_entries format=duration,size:stream=codec_type,codec_name,width,height,avg_frame_rate,sample_rate,channels,duration "$1" |
jq -c '{size_bytes: (.format.size|tonumber), duration: (.format.duration|tonumber),
video: (.streams|map(select(.codec_type=="video"))[0]|{codec:.codec_name,w:.width,h:.height,fps:.avg_frame_rate}),
audio: (.streams|map(select(.codec_type=="audio"))[0]|if .==null then null else {codec:.codec_name,rate:.sample_rate,ch:.channels} end)}'
}
probe approved-source.mp4
probe returned.mp4確認する項目:
- サイズと形。 アスペクト比が元の動画と一致し、各寸法がティアから得られるべき値になっているか。実際の幅と高さを記録してください。ティアの名前から写し取ってはいけません。
- 長さ。 長さが元の動画と一致しているか。納品先が正確なカット位置に依存するなら、丸めた数字だけでなく最初のフレームと最後のフレームを見てください。
- 音声。 返ってきたファイルに、元の動画と同じチャンネル数と同じ長さの音声ストリームがあるか。ストリームが存在するだけでは正しい証明にはならないので、同じ位置で両方のファイルを再生してください。最初の発話、カットの前後、最後のフレーズです。元の動画が意図的に無音だったなら、結果も無音であるべきです。
- 再生中の映像。 静止画を調べる前に、クリップ全体を通常の速度で観てください。ちらつき、揺れるテクスチャ、動く輪郭のハローは再生中に現れ、静止画ではめったに現れません。
- 意味を持つディテール。 商品ラベル、ロゴ、文字、顔は、拡大器が本物のディテールを取り戻す代わりに、ありそうなディテールを作り出すことがある部分です。同じトリミングで元の動画と比較してください。変わったブランドマークは、よく見えてもクリップを不合格にします。
同じ瞬間を並べて比較するには、元の動画を出力サイズまで最近傍補間で拡大し、実際の画素が見えるようにします:
ffmpeg -ss 2.0 -i returned.mp4 -ss 2.0 -i approved-source.mp4 \
-filter_complex "[1:v]scale=1896:1094:flags=neighbor[s];[s][0:v]hstack" \
-frames:v 1 compare-at-2s.png拡大率を返ってきた幅と高さに合わせます。

納品ファイルを正確に書き出す
納品先が固定の寸法を求める場合、ローカルでの書き出しで仕上げます。例は 2:3 のようなおおむね縦の元動画を前提にしています。横向きを拡大して 1080x1920 にパディングすると、細い帯状の映像が残ります。パディングはフレーム全体を残し、トリミングは満たしますが端を切ります。どちらの場合も製品を確認してください。
ffmpeg -i accepted-upscale.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -pix_fmt yuv420p -crf 18 \
-c:a aac -b:a 192k delivery-vertical.mp4この処理は音声を再エンコードします。元のトラックをそのまま残したいなら、納品先が受け入れる場合に -c:a copy を使い、その後、書き出したファイルにもう一度プローブを当ててください。字幕や図形は拡大後に焼き込みます。そうすれば文字の縁が拡大されたものではなく最終の大きさで描かれます。
3 つのファイルを保管してください。承認済みの元動画、そのままの拡大結果、そして書き出しごとの 1 本。あとからトリムや書き出し直しをしても、二度目の拡大で費用を支払う必要はありません。

うまくいかないとき
拡大をもう一度実行するのではなく、失敗した工程を直します。
| 症状 | 考えられる原因 | 対処 |
|---|---|---|
| タスクが失敗して返金され、長さを読み取れない | URL が MP4 ではなくウェブページ | ファイルの直接リンクを渡すか、ファイルをアップロードする |
| 長さで拒否または失敗する | 3 秒未満または 60 秒を超える | トリムするか、仕様内のクリップに分割する |
| 結果が大きく見えない | 元の動画がすでにそのティア以上だった | より高いティアを選ぶか、呼び出しをやめる |
| 結果が 1920x1080 にならない | ティアはアスペクト比を保つ画素予算 | 拡大後に必要な寸法で書き出す |
| ダウンロードが 403 を返す | 結果リンクの期限が切れている(約 20 分) | タスクを読み直して新しいリンクを得る |
| 最終ファイルで音が変わる | 書き出しが再エンコードまたは差し替えた | -c:a copy で書き出し直すか、前の工程でミックスを直す |
| 複数のクリップで同じ不具合が出る | 共通の原因、たとえば強く圧縮された元動画一式 | バッチを止めて、個々のクリップではなく元の動画を直す |
一括処理の前に 1 本だけ試す
実際の動きと音声トラックを持つクリップを、経路全体に通します。プローブ、拡大、ダウンロード、比較、書き出し、そして実際の納品先(フィード、プレイヤー、大きなディスプレイ)で最終ファイルを再生します。ローカルのプレイヤーやプラットフォームはデコードと再圧縮の仕方が異なるため、結果が保つかどうかを示せるのは納品先だけです。一括処理を組むなら、速いパン、カットの多い広告、細かいテクスチャのクリップを含め、クリップごとに元の長さ、課金された秒数、ティア、最終的な課金、そして不採用になった理由を記録してください。
ティアで迷っているなら、クリップを固定して、実際に見られる大きさで 1080p と 4K を比べてください。1080p で納品先の要件を満たすなら、追加の 1 秒あたり $0.018 で見えるものを買うことはできません。
判断
返ってきたファイルは、完成した納品物ではなく、確かめるマスターとして扱ってください。呼び出しの費用は数セントです。避けられる費用は、より高い解像度で編集をやり直すこと、すでに十分な大きさのクリップを拡大すること、音声や商品ラベルが変わったファイルを送り出すことです。試すには Video Upscaler のモデルページを開いてください。






