Skip to main content

簡潔な回答

プロバイダーが受信したのは画像ではなく、サーバーからのエラーレスポンスでした。ブラウザで開けるリンクは、あるブラウザでのダウンロードが機能することを証明しているに過ぎません。プロバイダーのサーバーがそれを取得できることを証明するものではありません。 典型的なエラーはリクエスト送信時に400として返され、タスクは作成されません:
received: "" は、プロバイダーがダウンロードした内容から画像フォーマットを検出できなかったことを意味します。 最もシンプルな解決策:画像を通常のオブジェクトストレージバケットまたはCDNでホストし、https://cdn.example.com/xxx.png などのシンプルなパブリックURLを渡すことです。

実際の事例

あるお客様のファーストフレーム画像のリンクは以下のようになっていました:
ブラウザでは画像が正常に表示されましたが、Seedanceタスクを送信すると上記の400が返されました。このリンクをテストした結果は以下の通りです: 最後の行が示しているように、画像とリクエストパラメータには問題がなく、リンクのみに問題がありました。

このようなリンクが存在する理由

これは画像のアドレスではありません。アプリケーションエンドポイントです。ユーザーのプライベートファイルはバックエンドに保存されており、ファイルが必要になるたびに、アプリは有効期限、署名、ダウンロード回数制限を含む一時的なダウンロード許可を発行します。これはプライベートファイルを保護するための一般的な方法です。リンクが漏洩しても短時間かつ数回の使用で使用できなくなり、すべてのダウンロードを監査することができます。 この設計は、1人のユーザーがブラウザで1回ダウンロードすることを想定しています。そのため、サーバーが代わりにファイルを取得しようとすると破綻します。
  • Range 非対応: 多くのサービスでは、フォーマットを検出するためにまず Range ヘッダーで先頭のバイトをリクエストしたり、チャンク単位でダウンロードしたりしてメディアを取得します。このようなエンドポイントはファイル全体しか返さず、Range リクエストに対してエラーを返します
  • ダウンロード回数の上限: プロバイダーがメディアを取得する際、プローブ、ダウンロード、失敗時の再試行を行う可能性があり、必ずしも1回だけのダウンロードとは限りません。上限に達すると、レスポンスはエラーの JSON になります
  • 短い有効期限: リンクが期限切れになると、レスポンスは画像ではなくなります
オブジェクトストレージや CDN(R2、S3、OSS、TOS など)上の公開 URL には、このような制限は一切ありません。静的ファイルを直接指し示し、Range をサポートし、ダウンロード制限もなく、追加のヘッダーや Cookie も不要です。

画像の渡し方の選択

ファイルがこのようなダウンロード許可エンドポイントの背後にある場合は、送信前に別のリンクを用意してください:
  • ファイルがすでにオブジェクトストレージ(OSS、S3、R2など)にある場合は、ストレージサービスから署名付きURLを生成し、その有効期限を少なくとも1時間に設定してください。署名付きURLは時間経過によってのみ失効し、ダウンロード回数の上限はなく、Rangeをサポートしています
  • それ以外の場合は、画像を公開オブジェクトストレージバケットまたはCDNにコピーし、新しいURLをSeedanceに渡してください

送信前のリンク確認

インターネットにアクセス可能な任意のマシンで、これら2つのコマンドを実行してください。<URL>を画像リンクに置き換え、シェルが&を解釈しないようにシングルクォートで囲んだままにしてください:
また、以下の点も確認してください:
  • 両方のコマンドがJSONやHTMLではなく画像を返すこと
  • ダウンロード回数の上限がなく、繰り返しダウンロードが機能し続けること
  • Cookie、ログインセッション、追加のヘッダーが不要であること
  • 少なくとも送信が完了するまで、理想的には1時間以上リンクが有効であること
  • イントラネット内やIP許可リスト配下ではなく、パブリックインターネットからリンクにアクセスできること
ダウンロード上限があるリンクを確認する場合もダウンロード回数が消費されます。送信予定のリンクを使い果たさないよう、別途発行したリンクでテストしてください。

関連ドキュメント

動画生成 API

画像を渡す3つの方法とすべてのリクエストパラメータ

アセットファーストワークフロー

3つの方法の送信時の比較とアセットのアップロード方法