DEV Community 日本語 フォロー GoとFFmpegワーカーでビデオサムネイルジェネレーターサービスを構築する 同社の動画カテゴリグリッドは、サードパーティのCDNから最適化されていない大きなJPEGサムネイルをホットリンクしており、モバイルでのLargest Contentful Paint(LCP)時間が遅くなっていました。これは、フル解像度の画像を配信し、CSSで縮小していたため、かなりの帯域幅を浪費していました。この問題に対処するため、サムネイル生成プロセスを管理するGoサービスを開発しました。このサービスはFFmpegを使用して、ソース動画またはポスターフレームから視覚的に区別できるフレームを抽出します。その後、これらのフレームを、JPEGよりも効率的な複数のWebP幅にエンコードします。Goサービスはダウンロードトラフィック制御も処理し、FFmpegプロセスが効率的に管理されるようにします。PHPは、実行時間とプロセス管理に関する共有ホスティングの制限により、このタスクには不向きと判断されました。Goサービスは、より高速なシークのために-iの前に-ssを使用し、より良いフレーム選択のためにthumbnail=300のようなFFmpegフラグを利用します。また、重複処理を防ぎ、同時実行性を管理するために、バウンドワーカープールとsingleflightを採用しています。生成されたサムネイルは一時ファイルに書き込まれ、その後アトミックにリネームされ、不完全なファイルが配信されるのを防ぎます。このGoサービスは、サムネイル生成タスクをキューに入れるcronジョブによってトリガーされます。その後、フロントエンドのPHPアプリケーションは、これらのサムネイルのステータスを確認するために、シンプルなSQLiteデータベースにクエリを実行します。データベーススキーマは基本的で、動画ID、ソースURL、ステータス、リトライ回数を格納します。PHPのcronジョブは、GoサービスへのHTTPリクエストを行うことで、このキューを処理します。Goサービスの書き込みタイムアウトは、応答の切り捨てを避けるために、ジョブの実行予算よりも意図的に長く設定されています。 Building a Video Thumbnail Generator Service with Go and FFmpeg Workers dev.to DEV Community 日本語 RSS thenote.app
-iの前に-ssを使用し、より良いフレーム選択のためにthumbnail=300のようなFFmpegフラグを利用します。また、重複処理を防ぎ、同時実行性を管理するために、バウンドワーカープールとsingleflightを採用しています。生成されたサムネイルは一時ファイルに書き込まれ、その後アトミックにリネームされ、不完全なファイルが配信されるのを防ぎます。このGoサービスは、サムネイル生成タスクをキューに入れるcronジョブによってトリガーされます。その後、フロントエンドのPHPアプリケーションは、これらのサムネイルのステータスを確認するために、シンプルなSQLiteデータベースにクエリを実行します。データベーススキーマは基本的で、動画ID、ソースURL、ステータス、リトライ回数を格納します。PHPのcronジョブは、GoサービスへのHTTPリクエストを行うことで、このキューを処理します。Goサービスの書き込みタイムアウトは、応答の切り捨てを避けるために、ジョブの実行予算よりも意図的に長く設定されています。