トップ 問題解決の記録

ffmpeg JPEG非互換問題

目的

ffmpegで動画からJPEGフレームを抽出し、後続のCOLMAPで読み込んで処理する。ffmpegは標準的なツールであり、特別な設定なしで相互運用できることを前提としていた。

問題

ffmpeg 8.1.1が出力するJPEGに 0xFFFE マーカーが含まれており、COLMAPが内部的に使用するFreeImageライブラリがこのマーカーを認識できずクラッシュ。

背景: JPEGフォーマットの成り立ちと課題

JPEG(正確にはEXIF-JPEG)は、2000年前後に日本のカメラメーカーが中心となって策定された規格(JEITA CP-3451 / CIPA DC-008)であり、現在はCIPA(一般社団法人カメラ映像機器工業会、Camera & Imaging Products Association)が維持・管理している。デジタルカメラで撮影した画像を保存・交換するための共通基盤として普及し、カメラメーカー各社はこの規格に準拠したJPEGを出力するため、長年にわたり高い互換性が保たれていた。

しかし近年は、カメラ以外のソフトウェア(ffmpegや画像処理ライブラリなど)がJPEGを生成することが増えており、これらが厳密なフォーマット仕様を満たさない場合がある。特にffmpegのような多目的エンコーダーは、カメラ向けに最適化されたEXIF-JPEGのサブセットではなく、より自由度の高いJPEGストリームを出力するため、結果として0xFFFEのような非標準マーカーが含まれることがある。

原因

ffmpeg 8.1.1のLavc MJPEGエンコーダーが 0xFFFE(アプリケーションデータマーカー)を書き込むが、これは標準的なJFIF形式(0xFFE0)ではないため、FreeImageが非対応。

対策

恒久対策

ffmpeg抽出後にOpenCVで全JPEGを再保存し、JFIF形式(0xFFE0 マーカー)に強制変換。

影響

ステータス

恒久対策済み