🐕

ffmpegで画像が変色する話

2023/12/05に公開

この記事は かろ噴水・ゆるゆる Advent Calendar 2023 の12/05日分です(1日遅れ)

バグ一つ直すのに4回リリースするとかいうアホなことをやらかしたので備忘録的に

前提

私はffmpegを用いて映像に対して連番のpng画像をオーバーレイするものを作っています
ユーザーさんからオーバーレイしている画像の色がおかしいという報告をもらったためこれについて調査していました

結論

[元データ]format=yuva444p,colorspace=bt709:iall=bt601-6-525:fast=1[color];[元データ]format=rgba,alphaextract[alpha];[color][alpha]alphamerge[結果]

これで行けます

原因

ffmpeg標準のrgb→yuv変換がクソ
ref: https://zenn.dev/razokulover/scraps/4282a6911e4ca7

解説

  1. 画像の色空間をyuva444pに変換します
    format=yuva444p,colorspace=bt709:iall=bt601-6-525:fast=1
  2. 1で変換を行う際にalpha値が失われてしまうためalpha値だけを別で取り出します
    format=rgba,alphaextract
  3. 画像データとalpha値を合成します
    alphamerge

実例

オーバーレイしたい場合は

ffmpeg -i input.mp4 -r 30 -i image_%03d.png -filter_complex "[1:v]format=yuva444p,colorspace=bt709:iall=bt601-6-525:fast=1[color];[1:v]format=rgba,alphaextract[alpha];[color][alpha]alphamerge[image];[0:v][image]overlay[out_v]" -map:v "[out_v]" -map:a "0:a" output.mp4

とするとできます

Discussion