メインコンテンツにスキップ

ffmpeg-slow-processing-problem


#FFmpegビデオ編集録画遅延、ビデオ長の短縮、CPU 100%のトラブルシューティング方法

リアルタイム映像録画サーバーでFFmpegを使って映像編集(録画)中、録画遅延問題が発生しました。同じ時間に録画された画像の長さは、一部のコンピュータで少なくなりました。問題が発生した状況、原因について分析し、解決した過程を見てみましょう。

##問題の状況

*リアルタイム動画を録画するための複数のサーバーが存在

  • Spring Boot & Kotlinベースのサーバー動作中
  • 各サーバーはFFmpegを使用して入力された動画ファイルを録画する機能を実行 *各サーバーの仕様がサーバーごとに多少異なる(同じハードウェアまたは同じインスタンスを使用しない)
情報

FFmpegは、マイケル・ニーダーマイヤーの主導のもとに開発されているすべての動画、音楽、写真フォーマットのデコードとエンコーディングを目指して作られているオープンソースプロジェクトです。詳しくは次のような役割をするプログラムです。

  1. オープンソース: FFmpegはオープンソースのビデオおよびオーディオ処理ツールで、誰でも無料で使用および変更できます。
  2. マルチプラットフォーム:FFmpegは、Windows、macOS、Linux、およびその他のさまざまなオペレーティングシステムで動作します。
  3. さまざまなフォーマットのサポート:FFmpegは何百ものフォーマットをサポートしています。これにより、ビデオ、オーディオ、画像、その他のマルチメディアデータのエンコード、デコード、変換、ストリーミングが可能になります。
  4. ビデオとオーディオのエンコード/デコード:FFmpegは、ほとんどすべての主要なビデオとオーディオコーデックをサポートしています。これは、ユーザーがさまざまな形式のビデオおよびオーディオファイルをエンコードおよびデコードできることを意味します。
  5. ストリーミング:FFmpegはリアルタイムでビデオとオーディオをストリーミングする機能を提供します。これは、メディアサーバーを構築したり、オンラインストリーミングプラットフォームにコンテンツを提供するために使用できます。
  6. フィルタとエフェクト: FFmpegは、さまざまなビデオおよびオーディオフィルタを提供することで、コンテンツを編集および強化できます。たとえば、サイズ変更、トリミング、回転、色補正、ノイズ除去などの操作を実行できます。
  7. コマンドラインインターフェイス: FFmpegはコマンドラインインターフェイスを介して使用されます。これにより、簡単なコマンドを使用してさまざまなマルチメディア操作を実行でき、自動化とバッチ処理に最適です。
  8. ライブラリ形式:FFmpegはライブラリ形式でも提供され、他のアプリケーションでマルチメディア機能を使用できます。これは、ビデオ編集ソフトウェア、メディアプレーヤー、ストリーミングサーバーなどで使用できます。

##問題

  • 特定サーバーで動画エンコーディングが録画した長さより短く表示される現象 発生
    • 問題確認のために様々な原因を調べるより、サーバー仕様やCPU、Graphic、Memoryなどのシステムリソース使用状況確認
  • 問題が発生した環境のサーバと正常動作サーバ間のシステムリソース使用率が異なることを確認 *正常:CPU使用量が大きく変化がなく、グラフィックカード使用量が0%台から30〜40%台に上昇する。 *異常:CPUを継続的に100%使用しており、グラフィックカードの使用量が増加しない。 *各環境を比較すると下記のような違いがある
    • 正常:Nvidiaの外装Graphic Cardが搭載された環境。既存開発もこの環境で確認 *異常:Intel内蔵Graphicのみ搭載されたサーバー
  • 定められた時間の間グラフィックカードを活用せず CPUで100%動画処理をするシステムでは、指定された時間内に処理を全くできず、映像が短くなると推定
    • コード上、一定時間の間録画機能を動作に設定しておく

回避策

  • Intelの内蔵グラフィックを使ってみる方法を探してみました。 ・Intel内蔵グラフィックは性能が大きく良いと知っていませんでした。 *しかし、CPU 100%を使うよりも作業を分けてすれば、はるかに効率的に動作すると思いました。

ffmpeg -codecs 「」

image

*上記のコマンドを使用すると、上記のように現在インストールされているffmpegの利用可能なコーデックを確認できます。

  • 録画をする際、各サーバはH.264コーデックを使用したが、Nvidia Graphic Cardを搭載したモデルはh264_nvencエンコーダを使用しました。
  • Intel内蔵グラフィックのみ搭載したモデルはh264_nvenc使用が不可能です。 libx264またはlibopenh264エンコーダを使用しましたが、これはSWベースの(CPU使用)方式でした。
  • この時 h264_qsv を使うと CPU 使用量は 10%も増加せず、従来使用されていなかった内蔵グラフィックの使用率が 30% 程度に増加したことが見られました。 録画時間も減らずに通常の長さに出ることになりました。
    • ただエンコーダが変わり、異なるグラフィックカードを持つ2つの映像のクオリティが多少異なって見えました。 *各サーバのHW特性をうまく活用しなければ正常なSW動作が期待でき、事前にHWが異なる場合もあらかじめ確認してみなければならないという知識を得ました。
情報

H.264は2003年に発表された動画標準規格のコーデックです。従来のMPEG-4 Part 2よりも進化したビデオコーディングであり、AVC(Advanced Video Coding)としても一般的です。圧縮率も良いだけでなく、比較的低いビットレートでも良い画質を持ち、多くのサービスで使用しています。