OpenCV videowriter で作成する動画の中間ファイルがデカすぎる
下記のアプリを作成したのですが、OpenCV videowriterで作成している中間ファイルの動画ファイルが大きく、その後の音声データをつける処理に影響が出ている、と感じていました。
当初は、fourcc mp4vを使っていたのですが、ciscoのopen-h264.dllを利用したmp4の方が(正規っぽくて)ファイルサイズが小さいのでは??と考えたのですが、実際にやってみると違和感を感じました。
実際にどれがファイルサイズが小さく、また中間動画ファイル作成時の負荷が小さそうか、確認した方がいいと思い、簡単ですが調査しました。
fourcc(拡張子)ごとの簡易ベンチマーク
環境
Windows11 64bit
python 3.11
opencv-python 4.10.0.84
intel 11400F
geforce 4700tiSUPER 16GB
MEM 32GB
ベンチマークに用いた動画
大きい動画でも試したのですが、傾向は同じだったので、小さいファイルで確認しています。
拡張子 | ファイルサイズ | フレームレート(FPS) | ビットレート(kbps) | 時間(秒) | 縦 | 横 |
---|---|---|---|---|---|---|
mp4 | 47.5MB | 60 | 19756 | 20 | 2560 | 1080 |
動画はhandbrakeで作成したもので、H.265 NVencで作成したものです。
エントリーしたfourccと拡張子
上記のmp4v、cisco open-h264以外にも、使えるかもしれないかな?と思ったものをエントリーしました。
OpenCVでfourccと拡張子を設定すると、 "そんな組み合わせないから俺(opencv内ffmpeg)が拡張子に合わせてコレに変えといたぜ" と言われることが結構あり、その辺も出ないように言われるがままの組み合わせに変更して設定しています。
OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
fourcc | 拡張子 | テスト前の俺下馬評 |
---|---|---|
mp4v | .mp4 | 最初はファイルサイズが大きいと感じたが、実際はどうなんだ?? |
avc1 | .mp4 | CISCO openh264-1.8.0-win64.dll 本当にこれがいいのかな? |
vp09 | .mp4 | VP9が選べた。ファイルサイズは強そうだが、果たして? |
FMP4 | .avi | xvidだと思ったけど違う?FMP4?まぁイマドキAVIはないだろうな |
XVID | .wmv | WMVも試してみたかった。XVIDが通った(え?)。果たして? |
mp4v | .wmv | WMVはmp4vでも通った。果たして? |
FMP4 | .wmv | WMVはFMP4でも通った。果たして? |
結果
ファイルサイズが小さく、動画処理のフレームレートが速い(数値が大きい)ものが望ましい。
FPSはGPUによる推論を含むなので多少振れは発生するとは思われるが、動画圧縮の負荷
fourcc | 拡張子 | ファイルサイズ(KB) | 動画作成時FPS | 備考 |
---|---|---|---|---|
mp4v | .mp4 | 100842 | 17.78 | |
avc1 | .mp4 | 170402 | 16.45 | CISCO openh264-1.8.0-win64.dll利用 |
vp09 | .mp4 | 中止 | 1.0程度 | あまりに遅かったので中止 |
FMP4 | .avi | 100894 | 17.63 | |
XVID | .wmv | 101686 | 17.68 | |
mp4v | .wmv | 101686 | 17.83 | |
FMP4 | .wmv | 101686 | 18.07 |
考察
CISCO openh264-1.8.0-win64.dllを利用するのが良いだろうと思い込んでいたが、mp4vと比べるとこちらの方がファイルサイズが大きかった。
vp09は圧縮処理の負荷が大きいのかあまりに遅かったので途中で中止。(その割にはシステムモニターでCPU負荷がMAXではないのだが)
FMP4+.aviは、当初の期待を裏切り好成績。mp4v+.mp4と大きな差はなかった。
wmvは最近見かけないが、もしかしたらダークホース的な位置づけになるか?と期待していた。大きな遜色はないが、積極的に採用するほどではないかな?という印象。ファイルサイズはfourccに何を選んでも同じなのはちょっと不思議(そういうもの?)。
OpenCV内のffmpegがかなり有能で拡張子に適したfourccを選んでくれるので、それに乗っかっておくスタイルが良さそう。
fourcc FMP4は知らなかったが、ラッパー的な振る舞いをするものなのかな?
結論
アプリでの一時の動画書き出しには、mp4v+.mp4か、FMP4+.aviにする予定。aviの方が次の音声付加で有利か?
CISCO openh264-1.8.0-win64.dllの採用はやめておく。
OpenCV videowriterでは、mp4v+.mp4 が王道で間違いない選択だったことを再確認できた。