コンテンツにスキップ

FFmpegで画像から動画を作る(RGB→YUV)と色が異なってしまうときの具体例と対処

TrainScannerで作成したドクターイエローの編成写真をSNSでシェアするために、PNGファイルから動画ファイルを生成してVLCなどの動画プレーヤーで見てみると、ドクターイエローの車体がなんとなく赤っぽい黄色になってしまいました。FFmpegで動画を作ったときに色化けしたようです。

FFmpeg colorspace などのキーワードでネット検索して、FFmpegでRGB画像からYUV形式の動画を作るときに色空間の変換が必要になることが分かりました(詳細はこちら)が、実際にどれくらい違って見えるのか比較してみました。

動作環境は以下のとおりです。

  • MacBook Pro (16インチ, 2024)

    Liquid Retina XDRディスプレイ搭載、ディスプレイのプリセットはApple XDR Display (P3-1600 nits)を選択している状態

  • macOS Sequoia 15.6.1

    動画プレーヤーのスクリーンショットはOSの機能(⌘+Shift+5)を使ってPNGファイルに保存

  • QuickTime Player バージョン10.5
  • VLC media player Version 3.0.21 Vetinari (Apple Silicon)
  • Photoshop 26.11.0

    Liquid Retina XDRディスプレイに表示している動画プレーヤーのスクリーンショットはPNG形式(カラープロファイルはカラーLCDとなっている)だが、Photoshopで開いたときに編集メニューのプロファイル変換を使ってsRGB IEC61966-2.1に変換している

  • ffmpeg version 8.0 built with Apple clang version 17.0.0 (clang-1700.0.13.3)

    Homebrewを使ってインストールしたFFmpegを使用

PNGファイルから作成した動画データは、colorspaceフィルターなしで作った動画とcolorspaceフィルターありで作った動画の2種類を準備しました。

  • colorspaceフィルターなしの場合:
    Terminal window
    ffmpeg -f rawvideo -pix_fmt rgb24 -i pipe: \
    -pix_fmt yuv420p output.mp4
  • colorspaceフィルターありの場合:

    詳細は Colorspace support in FFmpeg を参照

    Terminal window
    ffmpeg -f rawvideo -pix_fmt rgb24 -i pipe: \
    -filter_complex "[0]colorspace=bt709:fast=1:iall=bt601-6-625[s0]" -map "[s0]" \
    -color_primaries 1 -color_range 1 -color_trc 1 -colorspace 1 \
    -sws_flags spline+accurate_rnd+full_chroma_int \
    -pix_fmt yuv420p output.mp4