- 제주 DJI 시간기반 비행로그(CSV) 파싱 어댑터: 세그먼트 창 정렬, 가상 fps 환산 - 분할 영상(이름 오름차순) 연속재생 + 좌상단 영상목록 콤보(선택 재생), 세그먼트별 드론 로그 재정렬 - KML 다중 파일 병합 파싱: STA 체이니지 측점(71개) + 지장물 신포맷(타입/이름/텍스트박스_색상) - 시설물 라벨: 지정색 배경 박스 + 흰 글자, 팝업 중앙 정렬, 호버 구간 깜빡임 수정 - 카메라 자동감지(djmd: ZenmuseP1, focal 29.9mm) + <영상명>.camera.json PC 저장/폴더 자동 적용 - Yaw 자동추정(GPS 진행방위 기반) + 라벨 드래그 Yaw 역산 모드 - 스테이션바: GPS 이동거리 진행도(호버 시 정지), 노선밖 거리 표기, 원거리 구조물 마크 제외 - 서버: /api/camera 라우트, ecosystem 포트 54000·제주 데이터 경로 - docs/history: 작업 이력 21건 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
49 lines
2.7 KiB
Markdown
49 lines
2.7 KiB
Markdown
# 2026-07-09 분할 영상 연속재생 (이름 오름차순 자동 전환)
|
|
|
|
**소요 시간**: 25분
|
|
**Context 사용량**: input 210k / output 8k tokens
|
|
|
|
## 작업 내용
|
|
|
|
폴더 내 분할 영상(DJI _0002~_0005)이 끝나면 이름 오름차순으로 다음 영상을 자동 재생.
|
|
전환 시 드론 로그(시간 기반)를 해당 세그먼트의 누적 오프셋으로 재정렬해 궤적 정합 유지.
|
|
|
|
## 수정 파일
|
|
|
|
### client/src/types/geo.ts
|
|
- `FolderGeoData`에 `videoFiles`(이름 오름차순), `videoDurations`, `folderFiles` 추가
|
|
|
|
### client/src/utils/geoData.ts
|
|
- `loadFolderGeoData`: 폴더 내 **모든** 영상 길이를 메타데이터로 측정(기존엔 첫 영상만),
|
|
분할본 감지 시 재생 순서 콘솔 로그. 측정값·원본 파일 목록을 반환값에 포함
|
|
|
|
### client/src/store/geoStore.ts
|
|
- 상태 추가: `videoFiles` / `videoDurations` / `videoIndex` / `folderFiles`
|
|
- **`loadSegment(index)` 액션 신설**: 누적 오프셋(앞 세그먼트 길이 합) 계산 →
|
|
`parseDroneFrames`를 세그먼트 창으로 재실행해 frames 교체, videoIndex 갱신, 재생할 File 반환
|
|
- 길이 측정 실패 세그먼트가 있으면 궤적만 비우고(frames=[]) 재생은 계속
|
|
- `baseName`은 폴더(첫 영상) 기준 유지 — 카메라 보정 localStorage 연속성
|
|
- `origin`도 폴더 로드 시점 값 유지 — ENU 기준점 일관성(전환 시 투영 점프 방지)
|
|
|
|
### client/src/components/player/VideoPlayer.tsx
|
|
- Video.js `ended` 이벤트 핸들러 추가: 폴더 기반 로컬 재생 + 분할본 2개 이상일 때만
|
|
`loadSegment(next)` → `loadLocalFile(file)` → `player.play()` (ended 직후는 paused라 직접 재생)
|
|
- 서버 스트림/단일 파일 재생은 대상 아님 (source.kind !== 'local' 가드)
|
|
|
|
## 검증
|
|
|
|
- `npm run build -w client` (tsc + vite) 통과, 54000 포트 새 번들(index-BA4g81-1.js) 서빙 확인
|
|
- 실제 CSV로 4개 세그먼트 오프셋 시뮬레이션:
|
|
- 세그먼트 1: offset 0s, 1947행, effFps 59.925 → 59.94 스냅 ✓
|
|
- 세그먼트 2: offset 197.1s, 1963행, effFps 59.935 ✓
|
|
- 세그먼트 3: offset 394.2s, 1936행, effFps 59.920 ✓
|
|
- 세그먼트 4: offset 591.5s, 793행, effFps 59.877 ✓ (±10% 스냅 범위 내)
|
|
- 행 합계 6639/6649 — 경계 인접 소수 행만 제외, 정상
|
|
|
|
## 다음 단계 참고
|
|
|
|
- 세그먼트 수동 선택 UI(목록에서 특정 세그먼트로 점프)는 미구현 — `loadSegment`가 이미 있어
|
|
UI만 붙이면 됨 (`useGeoStore.getState().loadSegment(i)` + `loadLocalFile`)
|
|
- 마지막 세그먼트(_0005) 종료 시 정지 (반복 재생 없음 — 요구사항 밖)
|
|
- 전환 시 1~2초 로딩 공백 가능(objectURL 교체) — 프리로드 최적화는 필요 시
|