(修正版)part4 最後に残っている修正されそうなShadowPlayの色空間(ColorSpace)bt.601をbt.709に変換するときのあれやこれや。

日記 > PC

※■ 追記: –vpp-mpdecimate max=1

ミスリードを起こしたすべての始まり:ShadowPlay:MediaInfo Video [Standard : PAL]

※PALって話は無視してよい
※入力がbt601-6-525(NTSC)の時だけはちょっと違う処理が必要らしい
■ ShadowPlay:MediaInfo Video [Standard : PAL]について

・今回ShadowPlayで録画した動画はFHD(1920×1080)なので、標準PALフラグ自体は意味が無いようです
・PAL standard resolution is about 720×576 (not HD)。もちろん解像度だけの設定ではない
・フォーマット(metadata=video_format)にフラグを立てることはできるという事
・「TMPGEnc MPEG Smart Renderer 6 Version 6.0.6.7」を通すと[Standard : Component]になる

参考資料:

How to have "standard PAL" flag with a 1920x1080 video
I need to transcode some 1920x1080 video and to have the mediainfo flag "standard PAL" in it. I tried many things with f...
■ FFMpeg 11.30 colorspace filter
FFmpeg Filters Documentation
■ Rec.601 or BT.601(CCIR 601)

[Primary color]
・Slightly different primaries are specified for the 625-line (PAL and SECAM) and 525-line (NTSC) systems.

Rec. 601 - Wikipedia

https://glenwing.github.io/docs/ITU-R-BT.601-6.pdf

■ FFMpeg: colormatrixフィルタ

・YUVの変換式の変換を行うcolormatrixフィルタの使い方。このフィルタは8ビット深度の映像限定である。
※10bit使うなら、このフィルタには使わない方向で。実写だと分かりにくいものの、グラデーション縞が出るようなソースでは影響出ます。
個人的な感想なので好みで(^◇^;

色の変換色を変更するcolormatrix | ニコラボ
YUVの変換式の変換を行うcolormatrixフィルタの使い方。このフィルタは8ビット深度の映像限定である。
■ FFMpeg: colorspaceフィルタ

・カラースペースの変換を行うcolorspaceフィルタの使い方。このフィルタは高ビット深度の映像にも対応している。

色空間変換するcolorspace | ニコラボ
カラースペースの変換を行うcolorspaceフィルタの使い方。このフィルタは高ビット深度の映像にも対応している。
■ FFMpeg: colorspace サンプル「colorspace with fast=1 iall=bt601-6-525」

・「fast[boolean] 色度とガンマ補正を考慮しない」オプションを使うらしい
・colorspace with fast=1 iall=bt601-6-525:

ffmpeg -i “origin(rgb24).png” -c:v libx264 -preset placebo -qp 0 -x264-params “keyint=15:no-deblock=1” -pix_fmt yuv444p10le -sws_flags spline+accurate_rnd+full_chroma_int -vf “colorspace=bt709:iall=bt601-6-525:fast=1” -color_range 1 -colorspace 1 -color_primaries 1 -color_trc 1 “colorspace_fast=1_iall=bt601-6-525.avi”

ffmpeg -i “colorspace_fast=1_iall=bt601-6-525.avi” -compression_level 10 -pred mixed -pix_fmt rgb24 -sws_flags +accurate_rnd+full_chroma_int “colorspace_fast=1_iall=bt601-6-525.png”

※「-color_range 1 -colorspace 1 -color_primaries 1 -color_trc 1」:1 = bt.709

https://trac.ffmpeg.org/wiki/colorspace
■ FFMpeg: colorspace 変換サンプル

MPC-HCなど再生時の静止画保存に合わせたものです。
※colorprimやtransferを見ているプレイヤーでは違う変換が必要かもってことです


  set BEFORE=%~1
  set FILENAME=%~n1_colorspace_fast=1_iall=bt601-6-525
  set EXTENSION=%~x1
  set AFTER=%FILENAME%%EXTENSION%
  set LOGFILE=%FILENAME%.log

ffmpeg -hwaccel cuda -i "%BEFORE%" -c:v hevc_nvenc -preset:v p7 -profile:v main10 -vf colorspace=all=bt709:iall=bt601-6-525:fast=1 -rc vbr -qmin:v 0 -qmax:v 18 -pix_fmt p010le -codec:a copy "%AFTER%" 2>"%LOGFILE%"

今回の事例では入力設定省いても同じ動作なので。

ffmpeg -hwaccel cuda -i "%BEFORE%" -c:v hevc_nvenc -preset:v p7 -profile:v main10 -vf colorspace=all=bt709:fast=1 -rc vbr -qmin:v 0 -qmax:v 18 -pix_fmt p010le -codec:a copy "%AFTER%" 2>"%LOGFILE%"

・今まで使ってきたmpdecimateの結果(unsharpフィルタは除いてあります)

ffmpeg -hwaccel cuda -i "%BEFORE%" -c:v hevc_nvenc -preset:v p7 -profile:v main10 -vsync vfr -vf mpdecimate=max=1,colorspace=all=bt709:iall=bt601-6-525:fast=1 -rc-lookahead 32 -spatial-aq 0 -temporal-aq 0 -weighted_pred 0 -rc vbr -qmin:v 19 -qmax:v 25 -b_ref_mode 1 -multipass 2 -dpb_size 4 -g 300 -bf 4 -pix_fmt p010le -codec:a copy "%AFTER%" 2>"%LOGFILE%"

うむむむ。まだ納得はしていないが、そういう事なんだろうと理解はした感じ(^◇^;
あとはNVEncCか!

■ NVEncC: colorspace 変換サンプル

MPC-HCなど再生時の静止画保存に合わせたものです。
※colorprimやtransferを見ているプレイヤーでは違う変換が必要かもってことです

[NVEncC]

D:\bin\NVEncC_5.21_x64\NVEncC64.exe -c hevc --profile main10 --output-depth 10 --bref-mode each --ref 16 --avhw --input-analyze 16 --avsync vfr --aq --aq-temporal --aq-strength 0 --vbrhq 0 --vbr-quality 28 --lookahead 32 --gop-len 600 --bframes 4 --vpp-mpdecimate max=1 --vpp-colorspace matrix=smpte170m:bt709 --colormatrix bt709 --colorprim bt709 --transfer bt709 --audio-codec copy -i "%~1" -o "%~n1_nvenc_matrix+bt709x3.mp4" 2>"%~n1_nvenc_matrix+bt709x3.log"

※ログ出力の[2>”%~n1_nvenc_matrix+bt709x3.log”]は[–log “%~n1_nvenc_matrix+bt709x3.log”]でもテキストに出力されます。途中の変換速度が必要ない方は後者をお使いください

[NVEncC:input auto]

D:\bin\NVEncC_5.21_x64\NVEncC64.exe -c hevc --profile main10 --output-depth 10 --bref-mode each --ref 16 --avhw --input-analyze 16 --avsync vfr --aq --aq-temporal --aq-strength 0 --vbrhq 0 --vbr-quality 28 --lookahead 32 --gop-len 600 --bframes 4 --vpp-mpdecimate max=1 --vpp-colorspace matrix=auto:bt709 --colormatrix bt709 --colorprim bt709 --transfer bt709 --audio-codec copy -i "%~1" -o "%~n1_nvenc_auto2matrix+bt709x3.mp4" 2>"%~n1_nvenc_auto2matrix+bt709x3.log"

※今までのテストコマンドラインからunsharp設定を除いただけ…(´・ω・`)
正しくなるように設定すると今までどうやってあんなばらつき設定を出していたのか思い出せないという不思議な世界。1日勉強して単語の差異を知った効果か!(笑)

全部unsharpフィルタの動作を理解していなかった弊害ということにしておこう(・・ゞポリポリ

■ 追記:「残像消し」 –vpp-mpdecimate max=1

しばらく使ってみて、不都合が出てきたので…
初期値はmax=0なので、同じに見えるシーンは全部間引かれます。(変化する8x8のブロックのカウントが閾値に達しないとき)

◎暗いシーンからのフェードアウト(黒へ)でカクカクになる。
◎画面の一部しか更新されない場合、閾値に届かないので間引かれてしまう。
◎白や黒のフェードイン・フェードアウトでフェードしきらずにらず残像が残る(間引かれ過ぎ)(^◇^;

・星の瞬き
・暗いシーンで人物など瞼だけしょぼしょぼ動く時
・暗いシーンで手前のぼやけた黒い物体がゆらゆら動く時
・止め絵のフェードが最後までフェードしきらずブロックノイズが残る
・夜道で対岸くらいの距離の人物が手を振ってる時
・ゲームの読み込みや戦闘シーン切り替わりで、フェードアウトが多発する様な時
・引き画面のデジタル時計などのカウンターなど
・夜の地面で黒い虫が動くような(ノ><)ノ ヒィ
・カメラ固定で暗いシーンの小さいものが動くときに起きやすいですね

テストしたShadowPlay(デスクトップ録画=モニタの性能)で60fps→8fpsくらいまで落ちると、最後が完全に黒くなっていなかった。
ただでも今の圧縮技術は暗部でビットレート下げるので、暗くブロックノイズが出やすい場面で視認できる影響が出やすい。
プログラム的にもパラメータ変更で閾値を変えれば何とかなるけれど、そうすると他の場面で間引きがかかりにくくなる。
そこで、人の目は残像によるごまかしがきくので経験上最低でも12fpsは欲しい。違和感がなく安全マージンを取るなら30fps当たりあろうか(^◇^;

・暗い背景を用意してフェードアウトさせる動画でテストして納得がいく数値を見つけよう!
・仮説:60→30fpsなら最大連続でドロップするのを1にすればいけそうではある。
(テストした実写静止画(60fpsにして)→フェードアウト(黒)のシーンチェンジを入れたサンプル動画では、max=1よりmax=2の方が違和感が少なくfps的には理想に近かった。見た目はmax=1のほうがスムーズだけどファイルサイズは大きくなる)
※フェードアウトだけでなくフェードインでも、フェード時間が長くなるとカクカクが視認できてしまうのでMAX=1か2を指定したいところ。

■ mpdecimate の maxの挙動について詳しいサイト
フレームを間引くdecimate、mpdecimate | ニコラボ
一定のフレーム間隔で重複フレームを間引くdecimateフィルタと、前フレームとあまり変化のないフレームを間引くmpdecimateフィルタの使い方。
■ ほかのプレイヤーなど再生環境によって、表示カラーが変わる可能性は残る‥‥そういう条件付き妥協(^◇^;

MPC-HCなど再生時の静止画保存に合わせたものです。
※colorprimやtransferを見ているプレイヤー(動画編集ツール)では違う変換が必要かもってことです

3度目です(^◇^;
この辺りで深追いはやめておきます。
注1) colormatrix, colorprim, transfer が指定されていないときの動作が、ソフトデコーダー、HW支援、再生ソフトの組み合わせによって変わります(bt.601 だったり bt.709 だったり、720p以上の時だけbt.709だったり)。
注2)colormatrix、colorspaceという用語、「色空間」という日本語意訳からの誤認識カタカナエイゴ「カラースーペス」、書く人や使用場面・環境・ソフトウェアよって指し示す意味が変わるので注意してください。

m(__)m 英語が必要が無い時代に育った私はハマりました…