move_detect/docs/영상-브리프.md
유창욱 dea12a2931 feat(deck): P0 클립 2종 배치 — 브라우저 재생 형식으로 변환 + 포스터 자동 추출
받은 v01(넘어짐·경광등)·v02(앉기·정상)는 내용상 브리프대로였다. 컨택트
시트로 확인: v01 0.79초 쓰러짐 → 1.58초 경광등 점등 → 유지, v02 4초 내내
경광등 꺼짐. 둘 다 CCTV 앵글, 얼굴 식별 불가.

다만 HEVC(H.265)로 인코딩돼 있어 브라우저가 디코딩하지 못했다. 같은 페이지
같은 브라우저에서 대조:

    HEVC  .mp4  -> readyState 0, videoWidth 0, duration NaN, error 이벤트 없음
    VP9   .webm -> readyState 1+, videoWidth 1600, duration 4.04

서버(Range 미지원 가능성)를 배제하려 blob 으로 통째로 올려도 HEVC 는 같았다.
오류를 내지 않는 실패라 리허설 없이는 회의실에서야 알게 되는 종류다.

docs/deck/prepare_clips.py 신설 — 원본을 VP9/WebM 으로 변환(ffmpeg·openh264
없어 H.264 인코딩 불가, avc1/H264/X264 전부 VideoWriter 열기 실패)하고 클립
자신의 마지막 프레임을 포스터로 뽑는다. 원본 mp4 도 clips/ 에 남겨 두고
build_deck 이 <source> 를 webm→mp4 순으로 내보내 환경에 맞는 쪽이 재생된다.

포스터를 클립에서 뽑는 이유: deck.json 의 포스터는 클립이 없을 때 쓰는 대체
도판이라 클립이 생기면 어긋난다 — 비교 슬라이드에서 좌우 비교 도판이 좌우
패널 각각에 들어가 비교가 두 겹이 됐다.

cv2.imwrite 는 Windows 에서 한글 경로에 쓰지 못한다(예외 없이 False). 이
프로젝트는 파일명이 전부 한글이라 포스터가 조용히 하나도 안 만들어졌다.
imencode + write_bytes 로 우회.

확인하지 못한 것: 재생 진행 여부. 자동화 브라우저 컨텍스트가 디코딩까지만
허용하고 currentTime 이 0 에서 움직이지 않는다(자기가 MediaRecorder 로 만든
WebM 도 동일). 발표 노트북에서 한 번 눌러 확인해야 한다. 재생이 안 되더라도
poster 가 남아 슬라이드가 비지는 않는다.

영상 브리프에 형식 요구(H.264, HEVC 금지)와 변환 절차를 반영. 남은 P1 2종
(v04 구역진입·v05 카메라 건드림) 자리는 계속 스틸로 대체된다.
2026-08-30 22:52:23 +09:00

201 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 경영진 보고용 3초 영상 브리프
> 대상: `docs/deck/` 경영진 보고 덱에 들어갈 짧은 클립.
> 이미 확보된 스틸 11장(`docs/images/`)은 그대로 씁니다 — 영상은 **스틸이 못 하는 것**만 발주합니다.
---
## 0. 먼저 읽을 것
### 0-1. ⚠ 모든 클립은 "재현 영상"입니다
이 클립들은 실제 제품이 동작하는 화면 녹화가 아니라 **연출된 재현**입니다.
경영진 보고에서 이를 실제 동작 영상처럼 보여주면 그건 허위 시연입니다.
**덱 템플릿이 모든 클립에 `재현` 배지를 자동으로 붙이도록 만들었습니다.** 지워지지 않게
코드에 박아 뒀습니다 — 발표자가 깜빡할 수 있는 종류의 것이라서요.
실제 제품 화면이 필요한 자리에는 **실화면 캡처 8장**(`server/deploy/manual/shots/`)이 이미
있습니다. 그건 진짜입니다. 재현 클립과 실화면을 덱에서 시각적으로 구분해 두었습니다.
### 0-2. 스틸로 충분한 것은 발주하지 않았습니다
판정 조건·구성도·타임라인은 정지 이미지가 더 잘 전달합니다(읽을 시간이 필요하므로).
아래 6종은 **움직임이 있어야만 전달되는 것**만 골랐습니다.
### 0-3. 공통 사양
| 항목 | 값 |
|---|---|
| 길이 | **3초** (±0.3초). 받은 v01·v02 는 4.04초 — 쓸 수는 있으나 슬라이드당 3초 전제로 짠 흐름보다 깁니다 |
| 컷 | **단일 컷, 편집 없음.** 카메라 고정 — CCTV 시점이어야 설득력이 있습니다 |
| 화면비 | 16:9, **1920×1080 이상** |
| 형식 | **`.mp4` (H.264 + yuv420p)** — HEVC/H.265 로 뽑지 마십시오. 브라우저가 디코딩하지 못하면서 오류도 내지 않아, 회의실에서야 검은 화면을 보게 됩니다. (받은 v01·v02 가 HEVC 였고 `prepare_clips.py` 로 VP9/WebM 변환해 넣었습니다 — H.264 로 주시면 변환 없이 그대로 씁니다.) |
| 소리 | **없음.** 회의실에서 음소거로 재생합니다 |
| 재생 | 1회 재생 후 **마지막 프레임 정지**. 넘어지는 장면이 무한 반복되면 보기 불편합니다 |
| 얼굴 | **식별 불가**. 뒷모습·측면·헬멧·바닥을 향한 얼굴 |
| 조명 | 실제 공장 조도. 지나치게 영화적인 조명은 재현 티가 나서 오히려 신뢰를 깎습니다 |
| 색 | 스틸 11장과 같은 톤 — 네이비 작업복, 흰 헬멧, 회색 콘크리트 바닥, 노란 안전선 |
### 0-4. 카메라 시점을 고정하세요
**모든 클립이 같은 공장, 같은 높이(약 3~4m), 같은 앵글이면 가장 좋습니다.**
클립마다 장소가 바뀌면 "여러 곳에서 찍은 홍보 영상"처럼 보이고, 한 곳에서 이어지면
**"이 시스템이 이 공장을 보고 있다"** 로 읽힙니다. 후자가 훨씬 강합니다.
가능하면 `08-넘어짐-감지-시퀀스.png` 의 공장을 그대로 쓰세요.
---
## A. 발주 목록
### A-1. `v01-넘어짐-경광등.mp4` ★P0 — 이 덱에서 가장 중요한 3초
**이 클립이 말해야 하는 것**
> 사람이 쓰러지고, **경광등이 켜진다.** 그 사이에 아무도 없다.
**왜 필요한가** — 이 제품의 전부입니다. 감지가 대응으로 이어지는 순간을 정지 이미지로는
보여줄 수 없습니다. 경영진이 기억할 3초가 있다면 이것입니다.
**타임라인**
| 시각 | 화면 |
|---|---|
| 0.0s | 작업자가 기계 앞에 서 있음. 화면 한쪽 상단에 **꺼진 경광등**이 보임 |
| 0.5s | 무너지기 시작 |
| 1.2s | 바닥에 쓰러짐. 헬멧이 굴러감 |
| 2.0s | **경광등 점등** — 붉은 빛이 주변 바닥·기계에 반사 |
| 3.0s | 경광등 켜진 채 정지 |
**꼭** — **경광등이 처음부터 프레임 안에 있어야 합니다.** 꺼진 상태에서 켜지는 것이 보여야
하고, 컷을 나눠 경광등을 따로 보여주면 효과가 절반이 됩니다.
**피할 것** — 슬로모션, 극적인 음악용 편집, 카메라 흔들림(핸드헬드), 유혈.
---
### A-2. `v02-앉기-정상.mp4` ★P0 — 반드시 A-3과 한 쌍
**한 문장**
> 쭈그려 앉아 작업해도 **아무 일도 일어나지 않는다.**
**타임라인** — 작업자가 자연스럽게 쭈그려 앉아 바닥의 부품을 만짐. 3초 내내 경광등 꺼진 채.
**꼭** — **A-1과 완전히 같은 앵글·같은 장소.** 나란히 틀어서 "차이는 자세뿐"이 보여야 합니다.
경광등이 프레임 안에 있고 **끝까지 꺼져 있어야** 합니다.
**왜 필요한가** — "앉으면 오탐 나는 거 아니냐"가 도입 검토의 첫 질문입니다. 말로 답하는 것과
3초를 보여주는 것은 설득력이 다릅니다.
---
### A-3. `v03-허리굽힘-정상.mp4` ★P1
**한 문장**
> 허리를 굽혀 물건을 들어도 울리지 않는다.
A-2와 같은 목적, 다른 자세. 여유가 없으면 A-2만으로도 성립합니다.
---
### A-4. `v04-구역진입.mp4` ★P1
**한 문장**
> **발이 선을 넘는 순간** 판정된다.
**타임라인**
| 시각 | 화면 |
|---|---|
| 0.0s | 바닥에 노란 안전선. 작업자가 선 밖에서 걸어옴 |
| 1.5s | **발이 선을 넘음** |
| 2.5s | 경광등 점등 (또는 주의색) |
| 3.0s | 정지 |
**꼭** — **발과 선이 함께 프레임 안에** 있어야 합니다. 상반신만 잡으면 이 클립의 의미가 사라집니다.
카메라를 조금 낮추거나 각도를 눕혀 바닥이 넓게 보이게.
---
### A-5. `v05-카메라-건드림.mp4` ★P1 — 차별점
**한 문장**
> 카메라를 건드리면 **시스템이 그 사실을 스스로 신고한다.**
**타임라인**
| 시각 | 화면 |
|---|---|
| 0.0s | 정상적인 공장 화면 |
| 1.0s | 화면 전체가 **한 번 흔들리며 각도가 틀어짐** (누군가 청소하다 스친 것처럼) |
| 1.5s | 틀어진 채로 안정 — **화면은 여전히 멀쩡해 보임** |
| 3.0s | 정지 |
**꼭** — 카메라 **자체 시점**입니다(1인칭). 삼각대를 밖에서 찍는 게 아니라, 화면이 흔들려야 합니다.
틀어진 뒤에도 영상이 정상적으로 나오는 것이 핵심 — "고장난 게 아니라서 아무도 모른다"가
이 제품이 잡는 조용한 실패입니다.
**피할 것** — 화면이 까매지거나 노이즈가 끼면 안 됩니다. 그건 누구나 아는 고장입니다.
---
### A-6. `v06-2인1조.mp4` ★P2
**한 문장**
> 한 명이 나가면 **혼자 남은 것**이 판정된다.
**타임라인** — 0.0s 두 사람이 함께 작업 → 1.5s 한 명이 프레임 밖으로 걸어 나감 →
3.0s 남은 한 명 혼자. (실제로는 30초 지속 후 이벤트이므로 클립에 경광등은 켜지 **않습니다.**)
**꼭** — 경광등을 켜지 마세요. 30초 규칙이라 즉시 울리지 않습니다. 덱의 자막이 설명합니다.
---
## B. 우선순위
| | 파일 | 없으면 안 되는가 |
|---|---|---|
| **P0** | `v01-넘어짐-경광등.mp4` | **덱의 핵심.** 이것만 있어도 보고가 됩니다 |
| **P0** | `v02-앉기-정상.mp4` | v01과 쌍. 단독으로는 의미 없음 |
| P1 | `v04-구역진입.mp4` | 구역 기능 설명이 크게 살아납니다 |
| P1 | `v05-카메라-건드림.mp4` | 차별점 슬라이드용 |
| P1 | `v03-허리굽힘-정상.mp4` | v02의 보강 |
| P2 | `v06-2인1조.mp4` | 있으면 좋음 |
**P0 2개만 있어도 덱은 성립합니다.** 나머지 자리는 스틸 이미지로 자동 대체됩니다.
---
## C. 전달 방법
`image/` 또는 `docs/deck/clips/` 에 위 파일명 그대로 넣어주십시오.
```
python docs/deck/prepare_clips.py # 브라우저용 변환 + 포스터 추출
python docs/deck/build_deck.py # 덱 재생성
```
덱 생성기(`docs/deck/build_deck.py`)가 **파일이 있으면 영상을, 없으면 해당 스틸 이미지를**
자동으로 넣습니다. 그래서 지금 P0 2개만 먼저 주셔도 되고, 나중에 하나씩 추가해도
생성기만 다시 돌리면 반영됩니다.
```
python docs/deck/build_deck.py
```
---
## D. 넣지 않기로 한 것
| 제외 | 이유 |
|---|---|
| 대시보드 화면 녹화 | **실화면 캡처 8장이 이미 있고 그건 진짜입니다.** 재현 영상으로 대체하면 진짜를 가짜로 바꾸는 셈 |
| 골격(스켈레톤) 오버레이 애니메이션 | 작업자를 추적한다는 인상을 키움 — 스틸 브리프와 같은 이유 |
| 드론·타임랩스·기업 홍보 톤 | 이건 안전 설비 보고이지 브랜드 필름이 아닙니다. 화려할수록 "실제로 되는 건가"라는 의심을 삽니다 |
| 3초를 넘는 서사형 영상 | 경영진 보고에서 한 장면에 쓸 수 있는 시간은 3초입니다 |