動画サムネイル用タイムスタンプを等間隔で計算
動画フレームを一枚もデコードする前に、見やすいプレビュー画像の配置を決められます。動画の長さと必要なサムネイル数を指定すると、秒単位で等間隔に並んだ、毎回同じ結果になるタイムスタンプを返します。黒い画面、フェード、タイトル、終了画面が入りやすい冒頭と末尾の1秒は意図的に除外します。取得した結果は、フレーム抽出コマンド、メディア処理パイプライン、絵コンテ生成、動画プレーヤーのタイムラインにそのまま利用できます。
無料で実行
両端を避けて内容を表す位置を選びます
良いサムネイル一覧は、単に動画全体を機械的に分割するだけでなく、内容を把握しやすくする必要があります。開始直後には、黒いフレーム、フェードイン、読み込み用の画面、不完全なキーフレームが含まれることがよくあります。終了直前にも、フェードアウト、クレジット、終了カードが表示されたり、動画の長さと完全に同じ時刻にはデコード可能なフレームが存在しなかったりします。この計算機では、開始から1秒後を安全な範囲の先頭、終了の1秒前を末尾として、信頼しにくい領域を除外します。2個以上を指定した場合は、安全な範囲の両端に最初と最後のタイムスタンプを置き、その間を均等に配分します。1個の場合は動画の中央を返します。同じ長さと個数からは常に同じ結果が得られます。そのため、間隔計算を処理ごとに書き直したり、メディアファイルの取得できない終端を誤って指定したりせず、返された秒数を別の抽出処理へ直接渡せます。
計算方法と入力範囲をご確認ください
入力の単位は秒で、小数の動画時間にも対応します。メディアのメタデータが整数秒で終わることは少ないため、小数を扱えることは重要です。複数のサムネイルでは、動画全体から2秒を引いた利用可能時間を、指定個数から1を引いた数で割って間隔を求めます。各タイムスタンプは、安全な先頭時刻の1秒に、間隔と0から始まる位置番号の積を加えて算出します。JSONの出力を安定させながら通常のフレーム抽出に十分な秒未満の精度を保つため、結果は最大6桁の小数に丸めます。動画時間は2秒を超える必要があります。それ以下では、冒頭と末尾の1秒を両方除いた範囲を確保できません。個数には1以上の整数が必要で、0または負数は入力エラーになります。上限は過度に大きな配列を防ぎます。この機能は位置だけを計算し、フレーム解析、シーン検出、キーフレーム探索、デコーダーの正確なシークを行うものではありません。
サムネイル処理へタイムスタンプを組み込みます
まず、メディア解析ツール、プレーヤーのメタデータ、アップロードサービスなどが報告する信頼できる動画時間をご用意ください。用途に合う個数を選びます。タイムライン上の簡単なホバープレビューには数枚で十分な場合がありますが、長い動画の絵コンテには数十枚が必要なこともあります。値を計算機へ送り、画像抽出時には返された順序を維持してください。多くの動画ツールは秒数を受け付けるか、独自の時間表記へ変換できます。等間隔で決定的な結果なので、キャッシュキーや再実行可能なバックグラウンド処理にも適しています。再試行しても同じ位置が要求されます。実際のフレーム精度は抽出ツールに依存します。高速シークは近くのキーフレームへ移動し、正確なシークは指定時刻までデコードします。内容に応じた選択にはシーン検出をご利用ください。予測可能な時間範囲、バッチ処理、テストデータ、プレビュー帯には、この再現しやすいタイムスタンプが役立ちます。
活用例
プレーヤーのプレビュー帯を作成
視聴者が動画のタイムラインを移動するときに表示する画像の位置を、予測可能な形で生成します。
動画の絵コンテを計画
冒頭の黒いフレームや終了画面を含めず、均等に抽出したコンタクトシートを作成します。
フレーム抽出を一括処理
安定したタイムスタンプ配列をFFmpegのジョブ、メディアワーカー、アップロード処理へ渡します。
よくある質問
料金はいくらですか?
APIリクエスト1回の料金は$0.002です。ブラウザー上でも計算機をご利用いただけます。
なぜ冒頭と末尾の1秒を除外するのですか?
その範囲にはフェード、黒いフレーム、タイトル、クレジット、デコードできない終端が含まれやすく、プレビューに向かないためです。
サムネイルを1個だけ指定するとどうなりますか?
計算機は動画の中央を返します。受け付けられるすべての動画時間で、安全な範囲内に収まります。
この機能で画像も抽出できますか?
いいえ。返すのはタイムスタンプだけです。動画デコーダーやフレーム抽出ツールと組み合わせてください。
小数秒にも対応していますか?
はい。動画時間とタイムスタンプには小数を使用でき、出力は最大6桁の小数に丸められます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/video/thumbnail-timestamps \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"duration_seconds":120,"count":5}'const res = await fetch("https://api.kit.forhosting.com/video/thumbnail-timestamps", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"duration_seconds": 120,
"count": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/video/thumbnail-timestamps",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"duration_seconds": 120,
"count": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/video/thumbnail-timestamps", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"duration_seconds":120,"count":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"duration_seconds":120,"count":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/video/thumbnail-timestamps", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"duration_seconds": 120,
"count": 5
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.thumbnail_timestamps",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_items | 10000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |