FFmpeg、マルチスレッド・トランスコーディングパイプラインを導入
(ffmpeg.org)- FFmpeg CLI のマルチスレッド・トランスコーディングが、約2年の作業と700件以上の準備コミットを経て、初の「完全に動作する」形で公開された
- 変更範囲が大きいため一部機能が壊れている可能性が残っており、実際のマージ前にはテストとレビューが重要な課題となる
-fix_sub_duration_heartbeatは、デコーダとエンコーダ・マクサー間の同期を前提としているため、非同期実行では非決定的な動作を避けにくい- スレッド化のオーバーヘッドは概ね小さいが、パケット当たりの処理量が非常に少ない作業では、性能向上よりもコストが目立つ可能性がある
- ボトルネックが単一コンポーネントに集中しておらず、各コンポーネントがすでにマルチスレッド化されて飽和している状態でなければ、マルチコア環境でCPU利用率と実処理時間が大きく改善される可能性がある
FFmpeg CLI マルチスレッド化パッチの要点
- 約2年の作業と700件以上の準備コミットを経て、マルチスレッド版 FFmpeg CLI の初の「fully functional」バージョンがパッチセットとして公開された
- 変更規模が大きいぶん、未発見の破損が残っている可能性があり、実際のユースケースに基づくテストとレビューが必要
- 一般的な場合、スレッド化のオーバーヘッドは小さいが、パケット当たりの処理量が非常に少ないワークロードでは、オーバーヘッドが無視できなくなる可能性がある
- トランスコーディングが単一コンポーネントに支配されておらず、各コンポーネントがすでに独自のマルチスレッド化で飽和している状態でなければ、マルチコアシステムでCPU利用率と実行時間が改善される可能性がある
動作上の制約と既知の問題
-fix_sub_duration_heartbeatオプションは、現在の構造では離れたコンポーネント間の同期を前提としている- 対象となる流れは、エンコーダ・マクサーからデコーダへ続く同期である
- 各コンポーネントが非同期に実行されると、動作は根本的に非決定的になる
- 現状でも動作は予測しにくいが、同じオプションで実行すれば、実行間の結果は決定的である
- 16/24 のパッチではこのオプションが無効化され、より良い処理方法が必要になる
24件のパッチセットの構成
- パッチセットは計24件で構成される
- 01-09/24 は準備修正であり、残りのシリーズより先にプッシュされる可能性がある
- 10-17/24 はエンコードとフィルタリングをスレッドへ移し、必要な準備変更を行う
- この段階のスレッド化は、メインスレッドが他スレッドの完了を待つ「擬似」スレッド化であり、実際の並列実行ではない
- 一時的なオーバーヘッドが大きかったり、一部のコーナーケースが壊れたりする可能性があるため、全体セットが準備できてからプッシュするのが適切である
- 18/24 は最大の個別パッチで、トランスコードスケジューラを追加するが、その時点ではまだ実際には動作しない
- 19-24/24 は個別コンポーネントをスケジューラ利用方式へ変換する
- レビューのために分割されているが、最終プッシュではまとめられるべきである
- 関連資料は最近の VDD 発表動画と
ffmpeg_threadingブランチで確認できる- VDD talk
- ffmpeg_threading branch
1件のコメント
Hacker Newsのコメント
4コアARMサーバーで約2倍高速化し、並列化のオーバーヘッドもそれほど大きくなさそう
ffmpeg_threading/ffmpegは7.771秒、従来のffmpegは13.841秒で、CPU使用率はそれぞれ218%、114%だったNVIDIAカードで映像のデコードとエンコードの両方にハードウェアアクセラレーションを使うとどうなるのか気になる:
ffmpeg -hwaccel cuda -i $inputFile -codec:a copy -codec:v hevc_nvenc $outputそのほかの処理は性能コストの面では比較的小さい気がするので、改善は歓迎だが実際の影響はかなり限定的だと予想している
ツイートの代わりに https://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/3165... をリンクしたほうがよかった気がする
ツイートの要点も結局はこのリンクだから
これを理解するには、VideoLAN Dev Days 2023でAntonが行った発表を見るのがよい: https://www.youtube.com/watch?v=Z4DS3jiZhfo&t=1221
プロパティアニメーションをより強力に扱う方向を想像してしまう
ツイートは http://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/31655... に飛び、そこからさらにコード https://git.khirnov.net/libav.git/log/?h=ffmpeg_threading を参照している
これが自動で適用されるのか、それともコマンドライン引数を複雑に組み合わせる必要があるのか気になる
ffmpegを活用する動画編集ソフトウェアがあるのか気になる
以前、SVGで図形を描いてffmpegを使ったり、UIを付けたり、あるいはテキスト追加だけのものを作ってみようかと思ったが、始めはしなかった
Avidemuxは少しそんな感じで、ffmpegの内部はかなり生っぽいので、GUIから扱う前提で作られておらず、ベースにしたエディタは鈍重で奇妙になり、保守も難しそうだ
コマンドの説明器やパイプラインビューアでプレビューを作るような、モジュール式エディタなら可能かもしれない
ffmpegは強力だが、コマンドライン専用で使われる点が一部のユーザーの障壁になっている。以前、ランダムな数のクリップを受け取って
xstackフィルターでモザイクを作るPythonスクリプトを書いたことがあるが、簡単ではなかったhttps://vsdb.top/
https://www.vapoursynth.com/
ffmpegベースのニッチなソフトウェアとしてはlosslesscutを見たことがある: https://github.com/mifi/lossless-cut
Staxripも大きい: https://github.com/staxrip/staxrip
ただし「総合的な」エディタはよく分からない
Plex向けのちょっとしたトランスコーディング処理がもっと速くなるとうれしい
グラフィックカードでハードウェアトランスコーディングをサポートしていないので期待している
トランスコーディング速度を上げる方法を探していて、1つはGPUアクセラレーション、もう1つはスレッド数を増やすことだった
ただし最適なスレッド数を見つけるのが難しい
ただし可能ならGPUアクセラレーションのほうがずっとよい
大規模なffmpeg配布におけるライセンス要件がどうなるのか気になる。どんな場合に費用が必要なのだろう?
http://ffmpeg.org/legal.html
つまり無料だが、一部モジュールを使うと独自コードと組み合わせる際に問題になる可能性がある
FFmpegが改善されていくのを見るのはうれしい。近いうちにDolby AC4対応も見られるといいな