解决ffmpeg使用screen-capture-recorder录屏,有屏幕缩放的情况下录不全的问题

龚鸿羽
2023-12-01

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
 

 类似资料: