1、起因
使用ffmpeg做录屏功能,开启自带的gdigrab录屏时,鼠标指针闪烁严重,录屏电脑性能较低时甚至看不清鼠标。我受安排解决鼠标闪烁问题,解决方案较多,但考虑性价比与通用性(下到XP上到WIN11),使用现成且技术较为成熟的screen-capture-recorder.dll较为合适,但使用此dll录屏时,若屏幕有缩放,会导致录像无法录全整个屏幕,而我们无法控制用户行为,只能解决此问题。
2、问题所在
screen-capture-recorder.dll处理了屏幕缩放的问题,而ffmpeg同样处理了,这导致,如果屏幕有125%的缩放,ffmpeg裁剪一次录屏区域,screen-capture-recorder.dll裁剪一次录屏区域,导致了录不全屏幕的现象出现。
3、解决方式
去除两次缩放中的一次即可,考虑性价比,我们选择在ffmpeg.exe上禁用高DPI缩放,个人用户可右键→属性→兼容性→更改高DPI设置→替代高DPI缩放行为,而如果想自动给用户设置,可通过bat脚本,集成在自动安装中,附上bat脚本代码,脚本改自 百度用户:依梦琴瑶 的脚本,去除了输入选项,改为直接修改同目录下ffmpeg的属性。因对bat脚本语言不熟悉,修改的并不优雅,见谅。
4、bat脚本代码
新建txt,粘入代码,另存为所有类型,后缀.bat即可使用
@echo off
::设置ffmpeg.exe的完整路径
set App_path= %~dp0ffmpeg.exe
:Main
cls & set "Var=" & set "Str=" & set "ch=" & call :Check
call :SetNew "set Tmsg=关闭" "set Tmsg=开启" "set Tmsg=关闭"
goto ON
:ON
call :Check
call :SetNew "set Var=HIGHDPIAWARE" "goto Main" "set Var=%Var% HIGHDPIAWARE"
call :RegAdd "%Var%" "开启"
exit
:Check
set "Key=HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
for /f "skip=2 delims=" %%a in ('reg query "%Key%" /v "%App_path%" 2^>nul') do (
set "Var=%%~a"
)
if not defined Var goto :eof
set "Var=%Var:REG_SZ =|%"
for /f "tokens=2* delims=|" %%a in ("%Var%") do set "Str=%%~a"
if not defined Str (
reg delete "%Key%" /v "%App_path%" /f >nul 2>nul
set "Var="
goto :eof
)
set "Var=%Str%"
goto :eof
:SetNew
if not defined Var (
%~1
) else (
echo "%Var%"|find /i "HIGHDPIAWARE" >nul 2>nul && (
%~2
) || (
%~3
)
)
goto :eof
:RegAdd
reg add "%Key%" /v "%App_path%" /t REG_SZ /d "%~1" /f
ping 127.0.0.1 -n "3">nul
goto :eof
:END
exit