Hallo zusammen,
Ich möchte euch gerne mal noch meine neueste Bastelei vorstellen:
Worum geht es?
Ich hab immer das Gefühl, dass der Farbraum bei der mpv Wiedergabe nicht ganz richtig ist.
In mpv hatte ich target-prim=bt.2020 eingestellt und am JVC Beamer war ebenfalls BT.2020 in SDR fest eingestellt, da ich in der Regel tonemapping verwende.
Wenn man allerdings die Info Taste am JVC drückt, wird SRGB angezeigt! Wechselt man in Windows zu HDR wird BT.2020 angezeigt.
Mein Vermutung hier ist, dass der Farbraum nicht korrekt an den JVC weitergegen wird und Windows da evtl noch etwas konvertiert.
Bei madvr gibt es in den Calibration Einstellungen die Option "report BT.2020 to display". Mit dieser Option wird auch BT.2020 am JVC angezeigt in SDR.
Mit Hilfe des Tools ColorControl und einem Script wollte ich diese Funtkion nachbauen.
Zudem ist das nutzen von HDR ohne Tonemapping etwas umständlich mit mpv, da Windows nicht automatisch in den HDR Modus wechselt.
Mit aktivierten BT.2020 sind die Farben für mich korrekter, aber vlt bilde ich mir das aber auch nur ein.
Zumindest habe ich jetzt das Gefühl, dass Gesichter genau richtig sind.
Hinweis: Ich nutze Nvidia und JVC, Es sollte aber auch mit AMD und anderen Beamern funktionieren.
Color Control
Dieses Tool (https://github.com/Maassoft/ColorControl) erlaubt uns per Tastenkombination zwischen verschiedenen Bildmodi zu wechseln.
Meine Config sieht momentan so aus:
Die schwarzen Zeilen kann man ignorieren und zeigen nur die aktuellen aktiven Werte der Monitore an.
Beim ersten Start werden automatisch Profile generiert. Diese kann man einfach löschen.
Insgessamt habe Ich 5 Einstellungen (Die Tastenkobinationen sind frei wählbar und müssen im Script entsprechend angepasst werden) :
- SDR BT.2020 mit 12 Bit und BT.2020RGB (HDR aus) mit der Tastenkombination Ctrl + Alt + s (gedacht für HDR Tonemapping bei 24p)
- SDR BT.709 mit 8 Bit und Auto (RGB) (HDR aus) mit der Tastenkombination Ctrl + Alt + a (gedacht für SDR bei 50Hz und 60Hz)
- SDR BT.2020 mit 8 Bit und BT.2020RGB (HDR aus) mit der Tastenkombination Ctrl + Alt + w (gedacht für 50Hz und 60Hz Tonemapping)
- SDR BT.709 mit 12 Bit und Auto (RGB) (HDR aus) mit der Tastenkombination Ctrl + Alt + g (gedacht für SDR bei 24p)
- HDR BT.2020 mit 12 Bit und BT.2020RGB (HDR an) mit der Tastenkombination Ctrl + Alt + f (gedacht für HDR bei 24p)
Eine weitere Einstellung fehlt hier noch theoretisch: HDR BT.2020 mit 8 Bit und BT.2020 (HDR an) für 50Hz und 60Hz HDR. Das fehlt bei mir, da es bis jetzt nicht verwendet wurde zum testen.
Wir können nun also mit entsprechenden Tatsenkombinationen zwischen diesen Bildmodi welchseln.
Unter "Options" kann man das Tool gleich mit Windows mitstarten.
Automatisierung mit mpv
Leider habe ich in mpv keine Möglichkeit gefunden Tastenkombinationen an das System zu senden. Keypress etc scheint nur innerhalb von mpv zu funktionieren.
Aus diesem Grund bin ich den Umweg über python gegangen. Für python braucht man dafür die Bibliothek "pynput".
Das Script sieht bei momentan so aus:
from pynput.keyboard import Key, Controller
import sys
keyboard = Controller()
if sys.argv[1] == "on1":
keyboard.press(Key.alt)
keyboard.press(Key.ctrl)
keyboard.press('s')
keyboard.release('s')
keyboard.release(Key.alt)
keyboard.release(Key.ctrl)
elif sys.argv[1] == "on2":
keyboard.press(Key.alt)
keyboard.press(Key.ctrl)
keyboard.press('w')
keyboard.release('w')
keyboard.release(Key.alt)
keyboard.release(Key.ctrl)
elif sys.argv[1] == "hdr":
keyboard.press(Key.alt)
keyboard.press(Key.ctrl)
keyboard.press('f')
keyboard.release('f')
keyboard.release(Key.alt)
keyboard.release(Key.ctrl)
elif sys.argv[1] == "off1":
keyboard.press(Key.alt)
keyboard.press(Key.ctrl)
keyboard.press('a')
keyboard.release('a')
keyboard.release(Key.alt)
keyboard.release(Key.ctrl)
else: #off2
keyboard.press(Key.alt)
keyboard.press(Key.ctrl)
keyboard.press('g')
keyboard.release('g')
keyboard.release(Key.alt)
keyboard.release(Key.ctrl)
Alles anzeigen
Wie man sieht, ist das eine relative einfache Variante Tastenkombinationen zu erzeugen.
Dazu braucht man dann natürlich noch das lua Script für mpv:
msg = require 'mp.msg'
utils = require 'mp.utils'
require 'mp.options'
local python = "C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python38\\python.exe" # add your python path
local csscript = "C:\\path_to\\colorspace.py" # add your path for the colorspace python script
local options = {
-- behavior
enable = true, -- enable or disable the functionality
}
read_options(options)
local isused = false
local hdron = false
local fps = 0
local color = ''
local cs = false
function cs_cmd(cmd)
local command = {
python, csscript, cmd
}
local process = mp.command_native({
name = 'subprocess',
playback_only = false,
args = command,
capture_stdout = true,
capture_stderr = true,
})
--print("switching to bt.2020 mode ".. cmd)
end
function hdr_toggle()
if mp.get_property("video-params/gamma") ~= "pq" then
-- no hdr video
return false
end
if hdron then
hdron = false
mp.command("apply-profile HDRnopass")
if cs then
if fps <=24 then
cs_cmd("on1")
else
cs_cmd("on2")
end
isused = true
else
if fps <=24 then
cs_cmd("off1")
else
cs_cmd("off2")
end
isused = false
end
else
mp.command("apply-profile HDRPass")
cs_cmd("hdr")
isused = true
hdron = true
end
mp.command("apply-profile reload")
end
function cs_start()
-- get color space
while mp.get_property("video-params/primaries") == nil do
local time = mp.get_time()
while (time + 0.05) > mp.get_time() do end
end
color = mp.get_property("video-params/primaries")
local time = mp.get_time()
while time + 5 > mp.get_time() and mp.get_property_bool("eof-reached") == false do
if mp.get_property_number('estimated-vf-fps', 0) ~= 0 then
break
end
end
fps = math.floor(mp.get_property_number('container-fps', 0))
if color == "bt.2020" then
cs = true
end
local use_hdr = mp.get_property_bool('target-colorspace-hint')
if use_hdr and options.enable then
cs_cmd("hdr")
isused = true
hdron = true
return false
end
if cs and options.enable then
if fps <=24 then
cs_cmd("on1")
else
cs_cmd("on2")
end
isused = true
end
end
function cs_stop()
if isused then
if fps <=24 then
cs_cmd("off1")
else
cs_cmd("off2")
end
end
end
mp.register_event("file-loaded", cs_start)
mp.register_event("end-file",cs_stop)
mp.add_key_binding("H", "hdr_toggle", hdr_toggle)
Alles anzeigen
Das Script ruft den entsprechenden Modus für den Bildschirm auf (HDR für 50Hz/60Hz fehlt hier noch)
Den Pfad zu python und dem Script muss man entsprechend anpassen.
Mit der Taste H (Shift + h) kann man jederzeit zwischen nativen HDR und Tonemapping wechseln, sofern es sich um ein HDR Video handelt.
Damit dies alles funtioniert muss man aber noch ein paar Anpassungen in der Configdatei machen.
Hierbei wird vo=gpu-next angenommen
Wie man sieht, werden im Script Profile aufgerufen, die wir dann entsprechend brauchen in der Configdatei.
Der Vollständigkeit halber, habe ich noch weitere Profile als Beispiel:
[BT.2020]
profile-desc=bt.2020
profile-cond=p["video-params/primaries"]~=nil and p["video-params/primaries"]=="bt.2020"
target-prim=bt.2020
[DV]
profile-desc=DV
profile-cond=filename ~= nil and (filename:upper():match"[.]DV[.]" ~= nil or filename:upper():match"[.]DOVI[.]" ~= nil) and p["video-params/gamma"]~=nil and p["video-params/gamma"]~="pq"
profile=tonemap
[HDRnopass]
profile-desc=HDRnoPass
profile-cond=p["video-params/gamma"]=="pq" and p["target-colorspace-hint"] == false
target-colorspace-hint=no
profile=tonemap
[HDRPass]
profile-desc=HDRPass
profile-cond=p["video-params/gamma"]=="pq" and p["target-colorspace-hint"]
target-colorspace-hint=yes
hdr-compute-peak=no
target-trc=pq
target-peak=auto # change to desired value (probably > 200)
[SDR]
profile-desc=SDR
profile-cond=(p["video-params/gamma"]~=nil and p["video-params/gamma"]~="pq" and filename ~= nil and filename:upper():match"[.]DV[.]" == nil and filename:upper():match"[.]DoVi[.]" == nil)
hdr-compute-peak=no
target-trc=auto
Alles anzeigen
Damit Tonemapping funktioniert, brauchen wir dann das Profil "tonemap", welches bei mir aktuell so aussieht:
Das könnt Ihr natürlich entsprechend nach euren Wünschen anpassen.
[tonemap]
profile-desc=tonemap
hdr-compute-peak=yes
tone-mapping=bt.2446a
tone-mapping-mode=auto
target-peak=auto
gamut-mapping-mode=darken
target-trc=auto
target-peak=55
Als letztes brauchen wir noch einen Workaround, falls wir im laufenden Betrieb zwischen HDR und Tonemapping wechseln wollen:
Wenn man HDR dauerhaft ohne Tonemapping verwenden will, muss man in seiner Config überhalb der Profile noch diese Zeile hinzufügen:
Durch die Zeile word der HDR Modus automatisch aktiviert, sofern es sich um ein HDR Video handelt um man lieber den Projector mit HDR verwenden möchte.
Neue Einstellungen für den JVC
Im JVC können wir nun den Farbraum auf "Auto" stellen und er sollte korrekt zwischen BT.709 und BT.2020 wechseln je nach Videodatei.
Viel Spaß beim Basteln!