Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- LLM
- javascirpt
- build
- Algorithm
- dfs
- 알고리즘
- modbus
- frontend
- javascript
- RDP
- Infra
- turbo
- queue
- React
- monorepo
- jenkins
- DP
- python
- VectoreStore
- rag
- Two Pointer
- docker
- BFS
- Flask
- typescript
- 파이썬
- 프로그래머스
- CI/CD
- ansible
- AI
Archives
- Today
- Total
DM Log
[RDP 모니터링 프로젝트 #2] ffmpeg 기반 화면 녹화 Batch 스크립트 구현 본문
개요
사용자 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
테스트 방법
- ffmpeg_test.bat 실행
- rdp_monitor/ffmpeg_test.pid 생성 확인
- 출력 및 err 로그 생성 확인
- ffmpeg_test_stop.bat 실행
- 작업관리자에 ffmpe 종료 확인
- 로그 파일 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
'PJT > 영상 파일 재생 PJT' 카테고리의 다른 글
| [RDP 모니터링 프로젝트 #4] Window Scheduler + SFTP 자동 전송 시스템 구축 (0) | 2025.11.30 |
|---|---|
| [RDP 모니터링 프로젝트 #3] 다중 RDP 접속 대응 및 세션별 PID 관리 전략 (0) | 2025.11.30 |
| [RDP 모니터링 프로젝트 #1] Window Server - RDP 접속 이벤트 기반 녹화 구조 설계 (0) | 2025.11.30 |
| [RDP 모니터링 프로젝트 #0] RDP 화면 녹화 프로젝트 개요 (0) | 2025.11.29 |
| [RDP 모니터링 PJT] RDP 화면 녹화 프로젝트 (3) | 2025.11.23 |
