目標: ユーザーが動画をアップロードできるアプリケーションがあり、それらの動画を他のユーザーにすぐにストリーミングできるようにする必要があります。私の現在の設定はこれで問題なく動作しますが、モバイル ストリーミング用に最適化されるように動画をトランスコードしたいと考えています。ベスト プラクティスをお探しの場合は、ご協力ください。
現在のセットアップ: S3 バケットを使用してビデオ アセット自体を保存しています。アップロードが成功すると、その特定のビデオのすべてのメタデータ (取得する URL を含む) を別の場所に別のビデオ オブジェクトに作成します。*実際には AWS CloudFront 経由でストリーミングしているため、動画オブジェクトの属性として保存している URL は、実際には S3 バケットに接続されている CloudFront ディストリビューションのベース URL です。
問題: モバイル向けに最適化されたストリーミング用に動画をトランスコードしたいと考えています。エラスティック トランスコーダーを使用してバックグラウンド ジョブを実行できます。このジョブは、1 つの AWS バケット (「bucket1」と呼びます) から取得し、トランスコードして、最適化されたビデオ用に指定された別のバケット (「bucket2」と呼びます) にドロップします。しかし、私の問題は、ユーザーがビデオをアップロードすると、フローが次のようになることです。bucket1 にアップロードし、メタデータを使用して対応するビデオ オブジェクトを作成します。後でビデオをストリーミングできるように、ビデオ オブジェクトには URL が必要です。バケット 2 (最適化されたビデオ アセットが最終的に配置される場所) に関連付けられた URL を設定します。問題は、私のバッチ ジョブがもう 1 時間実行されず、ユーザーが 1 分後にそのビデオを要求したとします。明らかに、bucket2 URL にはまだ最適化されたバージョンが存在しないため、ビデオをストリーミングできません。
私が試したこと: 最近、トランスコードされた動画用にバケット 2 を作成する代わりに、バックグラウンド ジョブを設定してバケット 1 から動画を取得し、それらをトランスコードしてから、同じバケットに再度ドロップするとどうなるか考えました。ファイル名 (最適化されていない古いバージョンを上書きします)。次に、ビデオごとに 1 つのファイルしかないため、最悪のシナリオでは、ユーザーがそのビデオでジョブが実行される前にビデオを要求した場合でもコンテンツを取得できますが、それは最適化されていないバージョンになります。これに関する 1 つの問題は、エラスティック トランスコーダーが明らかにファイルを上書きできないことです (おそらく、2 番目のバケットにファイルをドロップし、copyObject 操作で上書きを実行することで解決できます) 。)。ただし、より大きな問題は、これには拡張子を含む 1 つのファイル名が必要なことです。ファイルを .mov 形式 (たとえば) から .m3u8 拡張子を持つ hls プレイリストに変換したい場合、それは不可能のようです。
私が説明した問題を回避するためのベストプラクティスのヒントがあれば、私は非常に感謝しています!
乾杯、 ブレンダン