DM Log

[RDP 모니터링 프로젝트 #2] ffmpeg 기반 화면 녹화 Batch 스크립트 구현 본문

PJT/영상 파일 재생 PJT

[RDP 모니터링 프로젝트 #2] ffmpeg 기반 화면 녹화 Batch 스크립트 구현

Dev. Dong 2025. 11. 30. 15:51

개요

사용자 RDP 접속 시 자동 녹화 시작 & 로그오프 시 자동 녹화 종료 구조 만들기

  • record_start.bat /record_stop.bat 스크립트 작성
  • 사용될 폴더 구조
rdp_monitor
   ├── scripts\           ← 배치 스크립트
   │     ├── record_start.bat
   │     ├── record_stop.bat
   │     └── ffmpeg_test.bat
   │
   ├── record\            ← 녹화 파일 저장
   │     └── 20250312\user1\파일.mp4
   │
   └── logs\              ← 로그 저장
         └── 20250312\logon.log, logoff.log, ffmpeg_xxx.err

 


ffmpeg 실행 기본 설정 & TEST Batch

설정 항목
코덱 libvpx-vp9
프레임 30 fps
해상도 1280 * 720
화면 캡처 gdigrab -i desktop
출력 포맷 webm

pid 기반 영상 녹화 및 저장 Test 

  • ffmpeg_test.bat (화면 녹화 시작)
@echo off
setlocal enabledelayedexpansion

set BASE_DIR=C:\rdp_monitor
set FFMPEG_PATH=%BASE_DIR%\ffmpeg\ffmpeg.exe
set TEST_OUT=%BASE_DIR%\record\ffmpeg_test_output.webm
set ERR_FILE=%BASE_DIR%\logs\ffmpeg_test.err
set PID_FILE=%BASE_DIR%\record\ffmpeg_test.pid

echo [TEST] ffmpeg test recording...
echo Output file: %TEST_OUT%

:: Start ffmpeg
start "" /B "%FFMPEG_PATH%" ^
    -y ^
    -rtbufsize 1500M ^
    -f gdigrab -framerate 30 -i desktop ^
    -vf "scale=1280:720" ^
    -c:v libvpx-vp9 ^
    "%TEST_OUT%" 2>>"%ERR_FILE%"

:: Save PID of the newly launched process
echo !ERRORLEVEL! > "%PID_FILE%"

echo ffmpeg launched. PID saved at: %PID_FILE%
pause
exit /b 0
  • ffmpeg_test_stop.bat (화면 녹화 종료)
@echo off
setlocal enabledelayedexpansion

set BASE_DIR=C:\rdp_monitor
set PID_FILE=%BASE_DIR%\record\ffmpeg_test.pid
set LOG_FILE=%BASE_DIR%\logs\ffmpeg_test_stop.log

echo [TEST] ffmpeg termination by PID...

if not exist "%PID_FILE%" (
    echo No PID file found! ffmpeg may not be running.
    echo [%date% %time%] NO_PID_FILE >> "%LOG_FILE%"
    pause
    exit /b 0
)

set /p PID=<"%PID_FILE%"

echo Trying to kill PID=%PID%
echo [%date% %time%] TRY_KILL PID=%PID% >> "%LOG_FILE%"

taskkill /PID %PID% /F >nul 2>&1

if %ERRORLEVEL%==0 (
    echo [SUCCESS] ffmpeg (PID=%PID%) terminated.
    echo [%date% %time%] SUCCESS PID=%PID% >> "%LOG_FILE%"
    del "%PID_FILE%"
) else (
    echo [FAILED] Could not terminate ffmpeg. It may not be running.
    echo [%date% %time%] FAIL PID=%PID% >> "%LOG_FILE%"
)

pause
exit /b 0

테스트 방법

  1. ffmpeg_test.bat 실행
  2. rdp_monitor/ffmpeg_test.pid 생성 확인
  3. 출력 및 err 로그 생성 확인
  4. ffmpeg_test_stop.bat 실행
  5. 작업관리자에 ffmpe 종료 확인
  6. 로그 파일 ffmpeg_test_stop.log 확인

녹화 Batch Script

record_start.bat

@echo off
setlocal enabledelayedexpansion

:: Base paths
set BASE_DIR=C:\rdp_monitor
set RECORD_DIR=%BASE_DIR%\record
set LOG_DIR=%BASE_DIR%\logs
set FFMPEG_PATH=%BASE_DIR%\ffmpeg\ffmpeg.exe

:: Event Variables
set USER_NAME=%1
set SESSION_ID=%2

:: Date folder (YYYYMMDD)
for /f "tokens=1-3 delims=- " %%a in ("%date%") do (
    set YYYY=%%c
    set MM=%%a
    set DD=%%b
)
set TODAY=%YYYY%%MM%%DD%

:: Build folder structure
set USER_FOLDER=%RECORD_DIR%\%TODAY%\%USER_NAME%
set LOG_FOLDER=%LOG_DIR%\%TODAY%
set PID_FILE=%USER_FOLDER%\%SESSION_ID%.pid
set ERR_FILE=%LOG_FOLDER%\ffmpeg_%USER_NAME%_%SESSION_ID%.err

:: Create folders if not exists
if not exist "%USER_FOLDER%" mkdir "%USER_FOLDER%"
if not exist "%LOG_FOLDER%" mkdir "%LOG_FOLDER%"

:: Timestamp for filename
for /f "tokens=1-3 delims=:." %%a in ("%time%") do (
    set HH=%%a
    set MI=%%b
    set SS=%%c
)
set TS=%YYYY%%MM%%DD%%HH%%MI%%SS%

:: Output video file
set OUT_FILE=%USER_FOLDER%\%USER_NAME%_%TS%.webm

:: Start ffmpeg with VP9, 30fps, 1280x720
start "" /B "%FFMPEG_PATH%" ^
    -y ^
    -rtbufsize 1500M ^
    -f gdigrab -framerate 30 -i desktop ^
    -vf "scale=1280:720" ^
    -c:v libvpx-vp9 ^
    "%OUT_FILE%" 2>>"%ERR_FILE%"

:: Save PID (ffmpeg process id)
echo !ERRORLEVEL! > "%PID_FILE%"

:: Logging
echo [%date% %time%] START USER=%USER_NAME% SESSION=%SESSION_ID% FILE=%OUT_FILE% >> "%LOG_FOLDER%\logon.log"

exit /b 0

 

record_stop.bat

@echo off
setlocal enabledelayedexpansion

:: Base paths
set BASE_DIR=C:\rdp_monitor
set RECORD_DIR=%BASE_DIR%\record
set LOG_DIR=%BASE_DIR%\logs

:: Event args
set USER_NAME=%1
set SESSION_ID=%2

:: Today folder
for /f "tokens=1-3 delims=- " %%a in ("%date%") do (
    set YYYY=%%c
    set MM=%%a
    set DD=%%b
)
set TODAY=%YYYY%%MM%%DD%

set USER_FOLDER=%RECORD_DIR%\%TODAY%\%USER_NAME%
set LOG_FOLDER=%LOG_DIR%\%TODAY%
set PID_FILE=%USER_FOLDER%\%SESSION_ID%.pid

if not exist "%LOG_FOLDER%" mkdir "%LOG_FOLDER%"

:: Kill ffmpeg process if PID exists
if exist "%PID_FILE%" (
    set /p PID=<"%PID_FILE%"
    taskkill /PID !PID! /F >nul 2>&1

    del "%PID_FILE%"
    echo [%date% %time%] STOP USER=%USER_NAME% SESSION=%SESSION_ID% PID=!PID! >> "%LOG_FOLDER%\logoff.log"
) else (
    echo [%date% %time%] STOP FAILED(NO PID) USER=%USER_NAME% SESSION=%SESSION_ID% >> "%LOG_FOLDER%\logoff.log"
)

exit /b 0