CIビデオパイプライン向けに図解スライドを構築して学んだこと

最近、自動化されたYouTube動画パイプラインに図解やチャートを追加しました。

最も重要な教訓はシンプルです。まず、すべてをPNGファイルとして事前レンダリングすることです。

ビデオエンジン内やffmpeg経由でビジュアルを生成しようとしないでください。代わりに、共有のPNG受け渡し(handoff)を使用してください。これにより、パイプラインのあらゆる部分がテスト可能になり、交換も容易になります。

以下に、構築方法とその過程で学んだことをまとめます。

アーキテクチャ

私のパイプラインは2ホスト構成を採用しています。一方のホストはビジュアルとオーディオを処理し、もう一方のホストはffmpegを使用してすべてを動画に結合します。

ffmpegはJavaScriptを実行したりブラウザを呼び出したりできないため、異なるツール間のギャップを埋める必要がありました。

• Mermaid(フローチャート用)はPuppeteerとChromium経由で実行されます。 • Matplotlib(チャート用)はPython経由で実行されます。 • Pillow(スライド用)は画像上に直接描画します。

これらのツールは直接通信できないため、単一のパターンを使用しています。つまり、PNGにレンダリングし、そのPNGをPillowのキャンバスに貼り付けるという方法です。2つのパスを作るよりも、1つのパスにまとめる方が優れています。

主な技術的教訓

1. Chromiumの設定

GitHub Actionsで実行する場合、特定のフラグを使用しないとChromiumは失敗します。--no-sandbox--disable-setuid-sandboxを含める必要があります。これらがないと、コンテナがプロセスをブロックしてしまいます。

2. Mermaidのテーマ設定

カスタムカラーを使用したい場合は、組み込みの「dark」や「forest」テーマを使用しないでください。それらのテーマは設定を上書きしてしまいます。「base」テーマを使用してください。これが、カスタムパレットを確実に機能させる唯一の方法です。

3. Matplotlibの背景設定

チャートをスライドの背景に合わせるのは一筋縄ではいきません。以下の3つのことを行う必要があります。

  • pyplotをインポートする前に matplotlib.use("Agg") を呼び出す。
  • figureとaxesの両方の facecolor を設定する。
  • ファイルを保存する際、bbox_inches="tight" を使用して白い境界線を取り除く。

4. 信頼性とフェイルセーフ

図解が欠けていても、動画のビルド全体が止まってしまうべきではありません。私はエラーをキャッチする仕組みを構築しました。レンダリングに失敗した場合、パイプラインは単に「visual unavailable(ビジュアル利用不可)」というプレースホルダーを表示します。動画自体は完成します。これにより、一部が失敗してもコンテンツを確認することができます。

トレードオフ

事前レンダリングは時間を要します。Mermaidの図解1つにつき、レンダリングに約2〜4秒かかります。20セグメントの動画の場合、全体のビルド時間に約20秒が追加されます。私のニーズにおいては、システムの安定性と引き換えにする価値のあるコストです。

Source: https://dev.to/morinaga/what-i-learned-adding-diagram-and-chart-slides-to-a-ci-rendered-youtube-pipeline-3bnl