簡潔な回答
プロバイダーが受信したのは画像ではなく、サーバーからのエラーレスポンスでした。ブラウザで開けるリンクは、あるブラウザでのダウンロードが機能することを証明しているに過ぎません。プロバイダーのサーバーがそれを取得できることを証明するものではありません。 典型的なエラーはリクエスト送信時に400として返され、タスクは作成されません:received: "" は、プロバイダーがダウンロードした内容から画像フォーマットを検出できなかったことを意味します。
最もシンプルな解決策:画像を通常のオブジェクトストレージバケットまたはCDNでホストし、https://cdn.example.com/xxx.png などのシンプルなパブリックURLを渡すことです。
実際の事例
あるお客様のファーストフレーム画像のリンクは以下のようになっていました:
最後の行が示しているように、画像とリクエストパラメータには問題がなく、リンクのみに問題がありました。
このようなリンクが存在する理由
これは画像のアドレスではありません。アプリケーションエンドポイントです。ユーザーのプライベートファイルはバックエンドに保存されており、ファイルが必要になるたびに、アプリは有効期限、署名、ダウンロード回数制限を含む一時的なダウンロード許可を発行します。これはプライベートファイルを保護するための一般的な方法です。リンクが漏洩しても短時間かつ数回の使用で使用できなくなり、すべてのダウンロードを監査することができます。 この設計は、1人のユーザーがブラウザで1回ダウンロードすることを想定しています。そのため、サーバーが代わりにファイルを取得しようとすると破綻します。- Range 非対応: 多くのサービスでは、フォーマットを検出するためにまず
Rangeヘッダーで先頭のバイトをリクエストしたり、チャンク単位でダウンロードしたりしてメディアを取得します。このようなエンドポイントはファイル全体しか返さず、Range リクエストに対してエラーを返します - ダウンロード回数の上限: プロバイダーがメディアを取得する際、プローブ、ダウンロード、失敗時の再試行を行う可能性があり、必ずしも1回だけのダウンロードとは限りません。上限に達すると、レスポンスはエラーの JSON になります
- 短い有効期限: リンクが期限切れになると、レスポンスは画像ではなくなります
画像の渡し方の選択
ファイルがこのようなダウンロード許可エンドポイントの背後にある場合は、送信前に別のリンクを用意してください:
- ファイルがすでにオブジェクトストレージ(OSS、S3、R2など)にある場合は、ストレージサービスから署名付きURLを生成し、その有効期限を少なくとも1時間に設定してください。署名付きURLは時間経過によってのみ失効し、ダウンロード回数の上限はなく、Rangeをサポートしています
- それ以外の場合は、画像を公開オブジェクトストレージバケットまたはCDNにコピーし、新しいURLをSeedanceに渡してください
送信前のリンク確認
インターネットにアクセス可能な任意のマシンで、これら2つのコマンドを実行してください。<URL>を画像リンクに置き換え、シェルが&を解釈しないようにシングルクォートで囲んだままにしてください:
- 両方のコマンドがJSONやHTMLではなく画像を返すこと
- ダウンロード回数の上限がなく、繰り返しダウンロードが機能し続けること
- Cookie、ログインセッション、追加のヘッダーが不要であること
- 少なくとも送信が完了するまで、理想的には1時間以上リンクが有効であること
- イントラネット内やIP許可リスト配下ではなく、パブリックインターネットからリンクにアクセスできること
関連ドキュメント
動画生成 API
画像を渡す3つの方法とすべてのリクエストパラメータ
アセットファーストワークフロー
3つの方法の送信時の比較とアセットのアップロード方法