-
-
Save myfreeer/d744c445aa71c0eeb165ca39cf6c0511 to your computer and use it in GitHub Desktop.
-- settings | |
-- key_binding: press the key specified below | |
-- to cycle between denoise filters below, | |
-- set it to nil to disable the binding | |
local key_binding = "n" | |
-- key_binding_reverse cycle between denoise filters below | |
-- in reverse order, set it to nil to disable the binding, | |
-- set it to a single-char string to enable | |
local key_binding_reverse = nil | |
-- denoisers: specify names of denoise libavfilter filters | |
-- from `mpv --vf=lavfi=help` command | |
-- where the last 3 filters (dctdnoiz, owdenoise, nlmeans) | |
-- are too slow to be used in playback | |
local denoisers = { | |
"removegrain" | |
,"atadenoise" | |
,"hqdn3d" | |
,"vaguedenoiser" | |
-- ,"dctdnoiz" | |
-- ,"owdenoise" | |
-- ,"nlmeans" | |
} | |
local denoiser_count = #denoisers | |
local filter_index = 0 | |
local script_name = mp.get_script_name() | |
local denoise_label = string.format("%s-denoise", script_name) | |
-- from https://github.com/mpv-player/mpv/blob/39e04e929483847a3e0722d86d53f69837ed99db/TOOLS/lua/autocrop.lua | |
function del_filter_if_present(label) | |
-- necessary because mp.command('vf del @label:filter') raises an | |
-- error if the filter doesn't exist | |
local vfs = mp.get_property_native("vf") | |
for i,vf in pairs(vfs) do | |
if vf["label"] == label then | |
table.remove(vfs, i) | |
mp.set_property_native("vf", vfs) | |
return true | |
end | |
end | |
return false | |
end | |
function cycle_denoise() | |
if not del_filter_if_present(denoise_label) then | |
filter_index = 0 | |
end | |
filter_index = filter_index + 1 | |
if filter_index > denoiser_count then | |
mp.osd_message("denoise filters removed", osd_time) | |
return | |
end | |
-- insert the filter | |
mp.command( | |
string.format( | |
'vf add @%s:lavfi=graph="%s"', | |
denoise_label, denoisers[filter_index] | |
) | |
) | |
end | |
function cycle_denoise_reverse() | |
if not del_filter_if_present(denoise_label) then | |
filter_index = denoiser_count | |
else | |
filter_index = filter_index - 1 | |
end | |
if filter_index < 1 then | |
mp.osd_message("denoise filters removed", osd_time) | |
return | |
end | |
-- insert the filter | |
mp.command( | |
string.format( | |
'vf add @%s:lavfi=graph="%s"', | |
denoise_label, denoisers[filter_index] | |
) | |
) | |
end | |
if key_binding then | |
mp.add_key_binding(key_binding, "denoise", cycle_denoise) | |
end | |
if key_binding_reverse then | |
mp.add_key_binding(key_binding_reverse, "denoise-reverse", cycle_denoise_reverse) | |
end |
But how to do that without typing something into a console? Isn't it possible to change the script to have this option added?
But how to do that without typing something into a console? Isn't it possible to change the script to have this option added?
@geextahslex Yes, it's possible, here is the docs of mpv and lua, use lua 5.1 syntax since luajit is used.
If coding in lua is not an option, you can also try javascript api.
@myfreeer The noise is most of the time present in the lows 0-60srgb. When it's affecting the whole image, it blurrs the mids and highlights with no reason. Is it possible to limit the affected range of the video filter (srgb0-60)? This would be very usefull. It would keep details in the highlights, like faces etc.
@myfreeer The noise is most of the time present in the lows 0-60srgb. When it's affecting the whole image, it blurrs the mids and highlights with no reason. Is it possible to limit the affected range of the video filter (srgb0-60)? This would be very usefull. It would keep details in the highlights, like faces etc.
@geextahslex The filters referenced by this script is ffmpeg filters, check the docs for detailed usage of filters, or maybe try VapourSynth filter if your build includes it.
@geextahslex Open console, type
vf add lavfi=graph=atadenoise
, enter, typevf add lavfi=graph=hqdn3d
, enter