Files
GhiVideo/docs/history/2026-07-02_영상fps-데이터기반-자동산출.md
T
b23042andClaude Opus 4.8 e0ff5dd6d0 feat: 지도 나침반(OSM/위성) 추가 + 측점 검색·마커 정확도 개선 + POI/영상 수정
- 지도 기반 나침반(노스업, 현재위치, 시야 역삼각형): 호버 확대·휠 줌·클릭 위성전환, OSM/Esri 타일 서버 프록시(/api/tile)
- 스테이션 검색: 실제 측점(chain) 기준 이동, 없으면 '측점 없음' 안내
- 역 마커: 직교 투영 측점 일치 시에만 표시, 미도착 종점은 추가 방식
- POI 팝업 겹침/재등장·라벨 정합 수정
- 영상 fps 데이터 기반 자동 산출
- 기술/발표/쉬운설명 문서 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 18:03:30 +09:00

35 lines
1.8 KiB
Markdown

# 영상 fps 데이터 기반 자동 산출 (고정 29.97 → 가변)
**소요 시간**: 약 20분
**Context 사용량**: input ~150k / output ~6k tokens
## 배경
프레임번호↔시간 변환이 `VIDEO_FPS = 30000/1001`(29.97)로 하드코딩 → 30fps 영상 전용.
24/60fps 등 다른 영상은 이름표가 어긋남. 어떤 fps 영상이 로드될지 미리 알 수 없음.
## 문제 데이터
드론 CSV(`frame_cnt,latitude,...`)엔 **시간이 없고 frame_cnt(프레임 번호)만** 있음.
→ fps 를 CSV 단독으로 못 구함. **영상 길이(duration)** 와 결합 필요.
## 해결
`effectiveFps = maxFrameCnt / duration` → 표준 fps(23.976/24/25/29.97/30/50/59.94/60) 중
±10% 이내면 스냅, 아니면 원시값. 데이터/길이 미확보 시 29.97 폴백.
### 변경 파일 (2개, 소규모)
- [VideoPlayer.tsx](../../client/src/components/player/VideoPlayer.tsx)
- `effectiveFps` useMemo 신설(storeFrames+duration). `VIDEO_FPS` 하드코딩 4곳 제거
(frame 계산 / HUD 표시 / 프레임입력 이동 / StationOverlay prop).
- useFrameStep 의 fps(VFC 감지, 31 오감지)는 미사용 → destructure 제거.
- [StationOverlay.tsx](../../client/src/components/overlay/StationOverlay.tsx)
- `fpsRef`(prop fps 기반) 추가. 프레임↔시간 변환 VIDEO_FPS 사용처(최근접 프레임 탐색, estFrame)를
fpsRef.current 로 교체. VIDEO_FPS 상수는 폴백 기본값으로만 유지.
## 주의/전제
- 드론 CSV 가 영상 전체 구간을 덮는다는 전제(마지막 frame_cnt ≈ 영상 끝). 부분만 덮으면 fps 과소 →
스냅 실패 시 원시값 사용. 필요 시 메타데이터/FFprobe 로 보강 가능.
- 표준 목록 밖 fps 는 스냅 없이 원시값 사용.
## 검증
- `tsc --noEmit` 통과
- `npm run build` 성공 → 새 해시 `index-BbUe4Gr4.js` :55000 서빙 확인