動画ループのつなぎ目の適合性を確認
自然な動画ループでは、終わりから始まりへ違和感なく戻ることが重要です。このチェッカーは、先頭フレームと末尾フレームの赤、緑、青、明るさの平均値を比較し、差を分かりやすい類似度スコアへ変換して、指定したしきい値を満たすか判定します。編集担当者、モーションデザイナー、メディア処理パイプラインは、書き出しを一つずつコマ送りで確認したり、接続点で点滅する動画を公開したりする前に、目立つ可能性がある継ぎ目をすばやく検出できます。
無料で実行
処理はブラウザ内で完結します。ファイルは送信されません。無料でご利用いただけます。
フレームを代表する平均値をご用意ください
最初に、先頭フレームの赤、緑、青、明るさの平均値を計算し、末尾フレームについても同じ4つの値を計算してください。比較条件を統一するため、明るさを含むすべてのチャンネルで一般的な0から255の範囲を使用します。色変換、フィルター、オーバーレイ、書き出し時の圧縮を適用した後、視聴者が実際に見るデコード済みフレームを使用してください。カラーグレーディング前の素材を比較すると、後の工程で生じた継ぎ目を見落とす場合があります。また、別々のサービスが作成したサムネイルは、サイズ変更やカラーマネジメントによって平均値が個別に変わるため避けてください。このチェッカーは両方の値セットに4チャンネルすべてを要求します。不完全な色から、一部を無視した誤解を招くスコアを返さないためです。平均値による検査は高速で結果も一定ですが、物体や輪郭の位置は表現しません。合格は全体的な色と光量が近いことを示す一次判定であり、動き、構図、質感が接続点で完全に一致する保証ではありません。
スコアとしきい値をご確認ください
計算では、2つのRGB平均値のユークリッド距離を求め、取り得る最大のRGB距離で正規化します。明るさの絶対差も別に求め、同じ0から255の範囲で正規化します。最終的な類似度では色を80パーセント、明るさを20パーセントとして扱います。広い範囲の色相変化は通常目立ちやすい一方、光の点滅や低下にも十分な重みを残すためです。スコアは0から100で、100は4つの値がすべて完全に一致する状態です。既定のしきい値は90です。指定値以上なら継ぎ目に適合すると判定し、下回る場合は確認対象となります。控えめな背景ループ、商品用背景、大型表示では高いしきい値が適しています。高速カット、グリッチ表現、小さな装飾プレビューでは低い値でも許容できる場合があります。処理結果を比較するには、同じ一括処理内で同じしきい値をお使いください。応答には色距離と明るさの差も含まれるため、主な原因がカラー調整か露出かを判断できます。
編集ワークフローで結果をご活用ください
候補を書き出すたびに検査し、不合格のクリップは編集担当者または自動補正工程へ戻してください。明るさの差が大きい場合は、露出を合わせる、短いクロスフェードを加える、フェード終端を調整すると継ぎ目が改善します。色距離が大きい場合は、ホワイトバランス、照明変化、アニメーション付きグラデーション、境界付近の圧縮をご確認ください。変更後は以前の測定を再利用せず、平均値を計算し直します。パイプラインではスコア、しきい値、各差分を書き出しファイルと一緒に保存すると、合否の理由を後から確認できます。API の料金は1項目あたり $0.002 で、個別の確認にはブラウザー版が便利です。合格した重要なループも必ず目視で再生してください。平均色が同じでも、明部と暗部が反対側に配置されたフレームは存在します。また、平均値では被写体位置、カメラ移動、オプティカルフロー、音声の連続性を検査できません。このツールは全体的な点滅や色飛びを早期に検出する低コストな品質ゲートです。完全な接続が必要な場合は、目視または空間的なフレーム比較を併用してください。
活用例
SNS向けループを事前検査
公開予約の前に、末尾フレームの色や明るさが変化する書き出し済みアニメーションを検出します。
モーションデザインを一括検証
多数の背景ループに同じしきい値を適用し、問題の可能性がある動画だけを目視確認へ送ります。
環境ディスプレイ用動画を調整
継ぎ目の点滅が目立つロビー、案内端末、ステージ向け動画の複数案を比較します。
よくある質問
どの値を入力すればよいですか?
先頭と末尾の各フレームについて、0から255の赤、緑、青、明るさの平均値をご入力ください。
チャンネルが不足するとどうなりますか?
部分的で誤解を招くスコアは計算せず、無効な入力としてエラーを返します。
継ぎ目に適合するスコアはいくつですか?
既定のしきい値は90です。確認方針に合わせ、0から100の任意の値をご指定いただけます。
合格すれば完全なループになりますか?
いいえ。全体の平均色と明るさを測定するもので、位置、動き、質感、音声の連続性は対象外です。
API での検査料金はいくらですか?
1項目あたり $0.002 です。個別の対話的な確認にはブラウザー版をご利用いただけます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/video/loop-seamless-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"first_frame":{"red":124,"green":118,"blue":110,"brightness":117.6},"last_frame":{"red":126,"green":117,"blue":112,"brightness":118.1}}'const res = await fetch("https://api.kit.forhosting.com/video/loop-seamless-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"first_frame": {
"red": 124,
"green": 118,
"blue": 110,
"brightness": 117.6
},
"last_frame": {
"red": 126,
"green": 117,
"blue": 112,
"brightness": 118.1
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/video/loop-seamless-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"first_frame": {
"red": 124,
"green": 118,
"blue": 110,
"brightness": 117.6
},
"last_frame": {
"red": 126,
"green": 117,
"blue": 112,
"brightness": 118.1
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/video/loop-seamless-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"first_frame":{"red":124,"green":118,"blue":110,"brightness":117.6},"last_frame":{"red":126,"green":117,"blue":112,"brightness":118.1}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"first_frame":{"red":124,"green":118,"blue":110,"brightness":117.6},"last_frame":{"red":126,"green":117,"blue":112,"brightness":118.1}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/video/loop-seamless-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"first_frame": {
"red": 124,
"green": 118,
"blue": 110,
"brightness": 117.6
},
"last_frame": {
"red": 126,
"green": 117,
"blue": 112,
"brightness": 118.1
}
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.loop_seamless_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |