행사 부스용 360도 회전 촬영·자동 편집·QR 전달 시스템 — 안드로이드 촬영 앱과 Electron 제어 앱

(주)하우두유두 이벤트 부스에서 사용된 360도 회전 촬영 시스템입니다. 행사장에 설치한 회전 암(arm)에 스마트폰을 장착해 참여자를 촬영하고, 촬영된 영상을 자동으로 편집·업로드한 뒤 QR 코드로 전달합니다.

시스템은 같은 무선 네트워크에서 동작하는 두 개의 애플리케이션으로 구성됩니다.
:8080)와 HTTP 파일 서버(:8081)를 자동으로 띄우고, PC가 접속하면 즉시 연결을 수락합니다.제어 신호는 Electron(클라이언트) → 안드로이드(서버)로 ws://<안드로이드 IP>:8080을 통해 오가고, 녹화 원본은 안드로이드의 HTTP 파일 서버에서 PC로 전송됩니다. 참여자는 생성된 QR 코드로 편집 영상을 열람·다운로드합니다.


HashRouter 기반 메인 / 촬영 / 결과 세 화면으로 구성됩니다.
촬영 화면은 연결 중 / 연결 실패 / 촬영 대기 / 촬영 중 / 영상 전송 중 / 촬영 완료 / 편집 중 상태에 따라 UI가 전환됩니다.
.env 설정을 읽어(없으면 기본 파일 생성) 전체 화면 창을 엽니다..env의 WIRELESS_ADDRESS로 WebSocket 연결을 시도합니다. 실패 시 최대 2회 자동 재시도하고 이후 수동 재연결 버튼을 노출합니다.startRecording 신호로 안드로이드가 20초간 녹화합니다. 양쪽이 각각 20초 타이머를 두어 자동 종료합니다.video-saved 이벤트로 파일명을 알리고, Electron이 http://IP:8081/video/<파일명>에서 파일을 내려받아 BASE_DIRECTORY/YYYYMMDD/에 저장한 뒤 원본 삭제를 요청합니다.edited_VIDEO_YYYYMMDD_HHMMSS.mp4를 생성합니다.{ channel, payload }(startRecording, stopRecording, deleteFile 등), 안드로이드 → PC는 { eventName, data }(camera-connect-reply, camera-recording-status, video-saved 등) 형식을 사용합니다.GET /video/<파일명>으로 녹화 mp4를 청크 응답으로 내려받습니다. 파일명에 ..나 경로 구분자가 포함되면 거부합니다.MobileControl(촬영·다운로드), VideoControl(로컬 영상 관리), DriveControl(편집·업로드·OAuth), SettingControl(설정 파일)로 모듈화했습니다.edit-video 요청 시 FFmpeg가 두 단계로 실행되며 모든 출력은 1080×1920 세로로 크롭·스케일됩니다.
2.5–6.5s, 8.5–12.5s 구간은 0.5배속, 6.5–8.5s, 12.5–17.5s 구간은 1.0배속으로 잘라 이어 붙여 약 23초 본편을 만듭니다. libx264, CRF 22, 오디오 제거.intro.mp4 + 본편 + outro.mp4를 연결하고, bgm.mp3를 0~35초로 잘라 앞뒤 1초 페이드·볼륨 0.8로 믹스합니다. libx264 CRF 20, -tune film, aac 192k, +faststart.임시 파일(temp_main_*.mp4)은 합성 후 삭제됩니다.
oauth2_credentials.json의 OAuth 2.0 클라이언트로 인증하고, 발급된 토큰은 사용자 데이터 폴더의 google_drive_token.json에 저장합니다. 만료 시 refresh token으로 자동 갱신하며, 실패하면 재인증 흐름으로 넘어갑니다. 업로드된 영상·QR 이미지에는 "링크가 있는 모든 사용자" 읽기 권한이 부여됩니다.
ws, axios, 번들 FFmpeg, googleapis(Drive v3), qrcode / react-qr-codecamera-video / camera-lifecycle / camera-view), Java-WebSocket, NanoHTTPD, AndroidX Lifecycle(ViewModel / LiveData), Foreground Service + Wi-Fi Lock + WakeLock
2025.08.14 성암아트홀에서 열린 설윤 하이볼 팬미팅 부스에 설치해 운영했습니다.
가장 아쉬운 부분은 저장소 선택입니다. 초기에 대용량 오브젝트 스토리지가 필요하다고 회사 측에 제안했으나, 큰 용량을 부담 없이 쓸 수 있다는 이유로 Google Drive를 쓰기로 결정됐습니다. 이에 맞춰 편집 영상 저장, 원본 다운로드, QR 이미지 저장을 모두 Drive API 위에서 처리했습니다.
문제는 마무리 단계였습니다. 편집 → 업로드 → QR 생성으로 이어져 결과 페이지가 뜨기까지 시간이 걸렸고, 특히 Drive의 저장·조회 응답이 느려 체감 대기 시간이 길었습니다. 현장에서 체험자와 사측은 "쓸 만한 속도"라고 평가했지만, 사용자 입장에서는 답답했을 것이라고 생각합니다. 오브젝트 스토리지(S3, R2 등)를 사용했다면 업로드·조회 지연을 줄여 결과 페이지를 훨씬 빠르게 보여줄 수 있었을 것이라는 아쉬움이 남습니다.