非常感谢作者维护的MPV整合包,非常好用。反馈一个问题:
问题描述
在部分设备上使用 hdr-mode.lua 脚本配合 display-info.dll 插件时,mpv 退出后显示器的 HDR 模式偶尔未能自动关闭。此问题间歇性发生(约 1%-3% 的退出操作会出现),导致显示器保持在 HDR 状态,桌面颜色显示异常。
复现条件
- 设备:部分 Windows 设备(尤其是系统响应较快的机型)
- 系统:Windows 10/11
- 插件:
display-info.dll
- 脚本模式:
hdr_mode=switch
- 播放内容:HDR 视频
- 退出方式:按
q 或点击关闭按钮
日志分析
mpv.log
mpvHistory.log
以一次出现问题的退出流程为例:
| 时间 |
事件 |
| 13.101s |
用户按 q 退出,mpv 开始执行退出流程 |
| 13.111s |
脚本发送 toggle-hdr-display off 命令 |
| 13.111s |
同一毫秒内,mpv 完全退出 |
| 13.111s |
display_info 插件被销毁 |
正常退出日志(HDR 正常关闭):
[2.366][i][hdr_mode] Restoring display to SDR on shutdown
[2.366][d][cplayer] Run command: script-message, flags=64, args=[args="toggle-hdr-display", args="off"]
[2.593][v][cplayer] Set property: user-data/display-info/hdr-status="off" -> 1
[2.629][i][cplayer] [display-info] HDR disabled
异常退出日志(HDR 未能关闭):
[13.111][i][hdr_mode] Restoring display to SDR on shutdown
[13.111][d][cplayer] Run command: script-message, flags=64, args=[args="toggle-hdr-display", args="off"]
[13.111][i][cplayer] Exiting... (Quit)
[13.111][d][display_info] Destroying client handle...
注意:异常日志中缺失以下关键行:
Set property: user-data/display-info/hdr-status="off"
[display-info] HDR disabled
原因分析
目前脚本在 on_end 中发送关闭命令后,mpv 会立即继续执行退出流程:
local function on_end(event)
-- ...
if event["reason"] == "quit" and o.hdr_mode == "switch" then
if hdr_active then
switch_display_mode(false) -- 发送关闭命令
end
end
-- 继续执行退出...
end
而 script-message 是异步的,发送后不等待接收方处理完成。display-info.dll 作为 C 插件,需要时间调用 Windows API 切换 HDR。当系统负载较低时,mpv 退出速度极快,display-info.dll 还没来得及处理命令就被销毁了。时序如下:
hdr-mode.lua 通过 script-message 发送 toggle-hdr-display off 命令
- mpv 立即继续执行退出流程,销毁
display-info.dll
display-info.dll 未能收到或未能处理该命令
这是一个典型的竞态条件(Race Condition):
hdr-mode.lua 脚本正确发送了关闭命令 ✅
- 但
script-message 是异步的,发送后不等待接收方处理完成
display-info.dll 作为 C 插件,需要时间调用 Windows API 切换 HDR
- mpv 退出速度太快,插件来不及完成工作就被卸载
环境信息
- 操作系统:Windows 11 24H2
- mpv 版本:v0.41.0-856-g33111f321
- display-info.dll:最新版(dyphire/mpv-display-plugin)
- hdr-mode.lua:最新版(dyphire/mpv-scripts)
相关代码位置
| 行号 |
代码 |
说明 |
| 23-28 |
local o = {} |
配置选项定义处,新增 hdr_exit_wait |
| 240-252 |
local function on_end(event) |
退出处理函数 |
| 246 |
switch_display_mode(false) |
发送 HDR 关闭命令 |
| 243 |
mp.unobserve_property(switch_hdr) |
取消属性观察 |
补充说明
- 为什么问题很少发生? 系统负载较高时,mpv 退出流程稍慢,display-info 有足够时间处理命令;系统空闲时,mpv 退出速度极快,display-info 来不及响应。
script-message 是异步的,调用后不等待接收方完成处理
以上分析猜测是AI给的.可能分析的很lower 望酌情谅解
非常感谢作者维护的MPV整合包,非常好用。反馈一个问题:
问题描述
在部分设备上使用
hdr-mode.lua脚本配合display-info.dll插件时,mpv 退出后显示器的 HDR 模式偶尔未能自动关闭。此问题间歇性发生(约 1%-3% 的退出操作会出现),导致显示器保持在 HDR 状态,桌面颜色显示异常。复现条件
display-info.dllhdr_mode=switchq或点击关闭按钮日志分析
mpv.log
mpvHistory.log
以一次出现问题的退出流程为例:
q退出,mpv 开始执行退出流程toggle-hdr-display off命令display_info插件被销毁正常退出日志(HDR 正常关闭):
异常退出日志(HDR 未能关闭):
原因分析
目前脚本在
on_end中发送关闭命令后,mpv 会立即继续执行退出流程:而
script-message是异步的,发送后不等待接收方处理完成。display-info.dll作为 C 插件,需要时间调用 Windows API 切换 HDR。当系统负载较低时,mpv 退出速度极快,display-info.dll还没来得及处理命令就被销毁了。时序如下:hdr-mode.lua通过script-message发送toggle-hdr-display off命令display-info.dlldisplay-info.dll未能收到或未能处理该命令这是一个典型的竞态条件(Race Condition):
hdr-mode.lua脚本正确发送了关闭命令 ✅script-message是异步的,发送后不等待接收方处理完成display-info.dll作为 C 插件,需要时间调用 Windows API 切换 HDR环境信息
相关代码位置
local o = {}hdr_exit_waitlocal function on_end(event)switch_display_mode(false)mp.unobserve_property(switch_hdr)补充说明
script-message是异步的,调用后不等待接收方完成处理以上分析猜测是AI给的.可能分析的很lower 望酌情谅解