トランスコード
TubePress が分散型 FFmpeg ワーカーを使って、アップロードされた動画を Web 配信向けのレンディションに変換する仕組みを解説します。
トランスコードは、アップロードされた1つのファイルをWeb対応の複数のMP4レンディションに変換します。これにより、視聴者はアップロードされたコンテンツに関係なく、画質メニュー、高速な再生開始、統一されたコーデックを利用できます。また、ウォーターマークやイントロ/アウトロクリップなどのオプション機能を追加し、プレイヤーが使用するスクラブプレビュースプライトを生成します。
ここでの設定はすべて /admin/settings?tab=transcode で行い、フォーマット、キュー、サーバー、ウォーターマーク、イントロ、タイムライン のサブタブに分かれています。トランスコードはCMSサーバー上で直接実行することも、専用ワーカーに分散させることもできます。
トランスコードする理由
アップロードされたファイルは、解像度・コーデック・コンテナがさまざまです。トランスコードにより、+faststart 付きのMP4/H.264レンディションに標準化され、ファイルが完全にダウンロードされる前に再生を開始できます。また、720pや480pなど複数のサイズを生成し、プレイヤーが画質セレクターを提供して小さな画面には小さなファイルを配信できるようにします。ウォーターマークやプレロール/ポストロールクリップの適用も同じパスで行われます。これらは各レンディションにエンコードする必要があるためです。
トランスコードパイプライン
動画の処理準備が整うと、TubePressは出力ごとに1つのジョブを transcode_jobs テーブルにエンキューし、順番に処理します:
- キュー。 フルレゾリューションのソースランクと、ソースの高さより低い各アクティブなフォーマット、さらにプレビューが有効な場合はタイムラインジョブが作成されます。
- 取得。 ワーカー(このサーバーまたはリモート)が、ソースランクから開始して次の保留ジョブを取得します。
- ダウンロード。 リモートワーカーがHTTP経由でソースを取得します(署名付きメディアリンクをバイパスする、キー認証済みの直接URLを使用)。
- トランスコード。 FFmpegがレンディションをエンコードし、設定に従ってトリム、ウォーターマーク、イントロを適用しながら進行率を報告します。
- アップロード&コールバック。 結果はチャンクでアップロードされ、コールバックによってジョブが完了とマークされます。
動画のステータスはこれを追跡します:ジョブの実行中は processing 状態になり、ソースランクが完了すると即座に published に切り替わります。ソースランクが生成できない場合にのみ error になります。下位レンディションは公開後も引き続き処理されます。
レンディションとフォーマット
出力フォーマットは フォーマット タブで完全に編集でき、video_formats テーブルに保存されます。各フォーマットには、名前、ファイルの接尾辞(例:_720p.mp4)、ターゲット解像度、FFmpegオプション、アスペクト比を維持 フラグ、有効/無効の切り替えがあります。デフォルト設定は以下の通りです:
| フォーマット | 解像度 |
|---|---|
| 720p | 1280 × 720 |
| 480p | 854 × 480 |
| 360p | 640 × 360 |
品質を適切に維持するための2つのルールがあります。TubePressはアップスケールを行いません:ソースの高さ以上のフォーマットはスキップされます。また、元の最高品質は常に保持されます — ウォーターマークまたはトリムが設定されている場合は、フルレゾリューションのソースレンディションに再エンコードされます(キュー内でスター付きで表示)。それ以外の場合はソースファイルがそのまま配信されます。トリム開始 オプション(0–300秒)を使用すると、すべての動画の最初の数秒を削除できます。ウォーターマークと同様に、ソースを含むすべてのフォーマットに適用されます。
ジョブキュー
キュー タブ(/admin/settings?tab=transcode&sub=queue)は動画ごとにジョブをグループ化し、すべて / 保留中 / 処理中 / 完了 / 失敗 でフィルタリングできます。各動画には、スター付きのソースランク、各解像度、TIMELINE のバッジがジョブステータスに応じた色で表示されます:
動画ごとのコンソール(ターミナルアイコン)は、ライブジョブリスト、各ランクを担当するワーカー、経過時間、エラーメッセージをストリーミング表示します。失敗したジョブを再試行 ボタンをクリックすると、現在失敗中のすべてをワンクリックで再キューします。
リモートトランスコードサーバー
トランスコードはCPU負荷が高いため、Webサーバーから切り離すことができます。サーバー タブの このサーバー では、ローカルで同時に実行するFFmpegジョブ数(1〜4、またはリモートワーカーのみを使用する場合は0)を設定し、FFmpegのパスを上書きできます。その下でリモートワーカーを登録します。ジョブは最も負荷の低いワーカーに自動配分され、各ワーカーには 最大同時ジョブ数 の制限があります(2 CPUコアにつき1ジョブが推奨です)。
- サーバーを追加します。 サーバーを追加 をクリックし、名前と
http://YOUR-IP:8090のようなURLを入力して保存します。APIキーと起動コマンドがすぐに表示されます。 - FFmpeg + PHPをインストールします。 ワーカーマシンで
sudo apt install ffmpeg php-cli php-curlを実行します。 - ワーカーをデプロイします。
transcode-worker.phpをダウンロードし(/api/transcode-worker-downloadまたは一時的なwgetリンクから)、アップロードして、sudo ufw allow 8090/tcpでポートを開放します。 - 起動します。 次のコマンドでキーを指定してワーカーを実行します:
php transcode-worker.php --port=8090 --key=YOUR_API_KEY- 確認します。 チェック をクリックします。正常なワーカーは、検出されたエンコーダーとCPU/GPUの使用状況とともに Online と表示します。
GPU アクセラレーション(NVIDIA、AMD、Intel、Apple)は自動的に検出・利用されます。ワーカーはソースを取得し、トランスコードを行い、進行状況を報告し、結果をチャンクでCMSにアップロードします。チャンクアップロードにより、各リクエストをCloudflareの100 MB制限以下に保ちます。無人ホスト向けには、セットアップガイドに systemd ユニットが含まれており、起動時にワーカーが自動再起動されます。
監視とリトライ
このシステムは、動画が暗黙のうちに放棄されることのないよう設計されています。ほとんどの障害は一時的なもの(CDNの遅延や不安定さなど)であるため、失敗したエンコードは増加するバックオフ(約30秒から数時間)で自動的に再試行されます。さらに、1時間ごとの回復タスクが失敗マークのままのジョブを再キューするため、レンディションが完成するまで試み続けます。手動クリックは不要ですが、強制的に実行したい場合は 失敗したジョブを再試行 ボタンを使用できます。
ソースランク自体が永続的に失敗した場合、依存するサブフォーマットのジョブはキャンセルされます(ソースなしでは処理できないため)。動画は error としてマークされますが、回復タスクは引き続き復旧を試みます。ソースランクが最終的に完了すると、動画は自動公開されます。
必要条件
トランスコードを実行する場所であれば、FFmpegが利用可能である必要があります:
- ローカル処理: CMSサーバーにFFmpegをインストールします(
sudo apt install ffmpeg)。インストール後、トランスコード ページで検出されたバージョンが表示されます。 - リモート処理: 各ワーカーにFFmpegと
php-cli、php-curl、最低2 CPUコアと2 GB RAM、および開放されたワーカーポートが必要です。