Skip to content

ddonyo/camera

Repository files navigation

Delayed Show

🌐 Overview


✨ v1 : Delayed Camera Show

이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ‹€μ‹œκ°„ 카메라 μŠ€νŠΈλ¦¬λ°μ— μ§€μ—° 좜λ ₯ κΈ°λŠ₯을 μΆ”κ°€ν•œ Electron 기반 λ°μŠ€ν¬ν†± μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μ„€μ •ν•œ μ‹œκ°„λ§ŒνΌ μ§€μ—°λœ μ˜μƒμ„ λ³Ό 수 있으며, λ…Ήν™” 및 μž¬μƒ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

Delayed Show Demo

Dev. JIRA URL : http://jira.lge.com/issue/browse/SICDTV-15711


Clone Repository

git clone ssh://[email protected]:2222/media_bsp/apps/camera.git

Add your files

cd existing_repo
git remote add origin http://source.lge.com/gitlab/media_bsp/apps/camera.git
git branch -M main
git push -uf origin main

πŸ›  Technical Stack

HTML5 JavaScript TailwindCSS NodeJS Electron.js C

Frontend

  • HTML5 Canvas: λΉ„λ””μ˜€ ν”„λ ˆμž„ λ Œλ”λ§
  • Vanilla JavaScript (ES6+): λͺ¨λ“ˆ μ‹œμŠ€ν…œ μ‚¬μš©
  • Tailwind CSS: User Interface / User Experience μŠ€νƒ€μΌλ§

Backend

  • Node.js: v18.0.0+
  • Electron: v36.2.1 - 크둜슀 ν”Œλž«νΌ λ°μŠ€ν¬ν†± μ•± ν”„λ ˆμž„μ›Œν¬
  • Chokidar: v4.0.3 - 파일 μ‹œμŠ€ν…œ κ°μ‹œ

Native (Linux)

  • V4L2 API: Linux λΉ„λ””μ˜€ 캑처
  • C: μ €μˆ˜μ€€ 카메라 μ œμ–΄

πŸ’» System Requirements

Operating System

  • Linux (V4L2 카메라 지원)
  • Windows (카메라 캑처 κΈ°λŠ₯ μ œν•œ)

Software

  • Node.js v18.0.0+
  • npm v8.0.0+
  • Linux: gcc, make (λ„€μ΄ν‹°λΈŒ λͺ¨λ“ˆ λΉŒλ“œμš©)

πŸ“¦ Installation Instructions

0. Preparation for the TV Board

1. Clone Repository

git clone ssh://[email protected]:2222/media_bsp/apps/camera.git

2. Install Dependencies

cd camera
npm install

λ³΄λ“œμƒμ—μ„œλŠ” bulssi_install.sh λ₯Ό μˆ˜ν–‰ν•˜μ—¬ μΆ”κ°€ νŒ¨ν‚€μ§€ μžλ™ μ„€μΉ˜

3. Native Code Build (Linux)

npm run build

πŸš€ How to Run

Linux

λ³΄λ“œμƒμ—μ„œλŠ” λΆ€νŒ… ν›„ bulssi_init.sh λ¨Όμ € μˆ˜ν–‰

npm start

Windows

npm run start:win

πŸ—οΈ System Architecture

graph LR
    subgraph "Native Layer"
        V4L2[V4L2 Camera API]
        CAP[capture_interface.h]
        VCAP[v4l2_capture.c]
    end

    subgraph "Backend Process"
        MAIN[electron/main.js<br/>Main Process]
        FH[FrameHandler<br/>ν”„λ ˆμž„ 처리]
        CAPTURE[capture.js<br/>카메라 μ œμ–΄]
        FW[frame-watcher.js<br/>파일 κ°μ‹œ]
        PRELOAD[preload.js<br/>IPC Bridge]
    end

    subgraph "Frontend (Renderer)"
        HTML[index.html]
        APP[app-init.js]
        VIEWER[mjpeg-viewer.js<br/>메인 컨트둀러]
        FM[frame-manager.js<br/>ν”„λ ˆμž„ 관리]
        UI[ui-controller.js<br/>UI μ œμ–΄]
        CONFIG[config.js<br/>μ„€μ •]
        UTILS[utils.js<br/>μœ ν‹Έλ¦¬ν‹°]
    end

    subgraph "File System"
        LIVE[(live/)]
        RECORD[(record/)]
    end

    V4L2 --> VCAP
    VCAP --> CAP
    CAP --> CAPTURE
    CAPTURE --> FH
    FH --> FW
    FW --> LIVE
    FH --> RECORD

    MAIN --> FH
    MAIN --> PRELOAD

    PRELOAD -.IPC.-> VIEWER
    FW -.파일 λ³€κ²½ μ•Œλ¦Ό.-> MAIN
    MAIN -.ν”„λ ˆμž„ 데이터.-> VIEWER

    HTML --> APP
    APP --> VIEWER
    APP --> FULLSCREEN[fullscreen-manager.js<br/>전체화면 관리]
    VIEWER --> FM
    VIEWER --> UI
    VIEWER --> CONFIG
    VIEWER --> UTILS
    FM --> UTILS
    UI --> UTILS
Loading

πŸ—‚οΈ Project Structure

camera/
β”œβ”€β”€ πŸ“ electron/
β”‚   └── main.js              # Electron 메인 ν”„λ‘œμ„ΈμŠ€
β”œβ”€β”€ πŸ“ frontend/
β”‚   β”œβ”€β”€ πŸ“ public/
β”‚   β”‚   β”œβ”€β”€ index.html       # 메인 UI
β”‚   β”‚   β”œβ”€β”€ πŸ“ styles/       # CSS μŠ€νƒ€μΌ
β”‚   β”‚   β”‚   └── main.css
β”‚   β”‚   β”œβ”€β”€ πŸ“ resources/    # UI μ•„μ΄μ½˜, wardrobe
β”‚   β”‚   β”œβ”€β”€ πŸ“ live/         # 라이브 ν”„λ ˆμž„ μž„μ‹œ μ €μž₯
β”‚   β”‚   └── πŸ“ record/       # λ…Ήν™” ν”„λ ˆμž„ μ €μž₯
β”‚   └── πŸ“ src/
β”‚       β”œβ”€β”€ app-init.js             # μ•± μ΄ˆκΈ°ν™”
β”‚       β”œβ”€β”€ mjpeg-viewer.js         # 메인 컨트둀러
β”‚       β”œβ”€β”€ frame-manager.js        # ν”„λ ˆμž„ 관리
β”‚       β”œβ”€β”€ ui-controller.js        # UI μ œμ–΄
β”‚       β”œβ”€β”€ fullscreen-manager.js   # 전체화면 λͺ¨λ“œ 관리
β”‚       β”œβ”€β”€ config.js               # μ„€μ • μƒμˆ˜
β”‚       β”œβ”€β”€ utils.js                # μœ ν‹Έλ¦¬ν‹°
β”‚       β”œβ”€β”€ dom.js                  # $, on, show, wait λ“± DOM μœ ν‹Έ
β”‚       β”œβ”€β”€ number-input.js         # Delay/Speed μŠ€ν”Όλ„ˆ 바인딩
β”‚       β”œβ”€β”€ capture-helper.js       # ν˜„μž¬ ν”„λ ˆμž„ 캑처(webcam/mjpeg)
β”‚       β”œβ”€β”€ vton-ui.js              # λ‘œλ”©/ν”„λ‘œκ·Έλ ˆμŠ€/μ—λŸ¬ UI
β”‚       β”œβ”€β”€ vton-service.js         # μ‹€μ œ API + 폴백(Mock) 톡합
β”‚       └── wardrobe-controller.js  # μ›Œλ“œλ‘œλΈŒ 클릭 β†’ VTON μ‹€ν–‰
β”œβ”€β”€ πŸ“ backend/
β”‚   └── πŸ“ src/
β”‚       β”œβ”€β”€ capture.js       # 카메라 캑처 μ œμ–΄
β”‚       β”œβ”€β”€ frame-watcher.js # 파일 μ‹œμŠ€ν…œ κ°μ‹œ
β”‚       β”œβ”€β”€ preload.js       # Electron IPC
β”‚       β”œβ”€β”€ server.js        # μ„œλ²„ (ν™•μž₯용)
β”‚       └── πŸ“ routes/
β”‚           └── vton.js      # /api/v1/vton/jobs
β”œβ”€β”€ πŸ“ native/
β”‚   └── πŸ“ linux/
β”‚       β”œβ”€β”€ capture_interface.h
β”‚       β”œβ”€β”€ v4l2_capture.c   # V4L2 카메라 κ΅¬ν˜„
β”‚       └── Makefile
└── package.json

πŸ”„ State Management

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 4κ°€μ§€ μ£Όμš” μƒνƒœλ₯Ό κ°€μ§‘λ‹ˆλ‹€:

stateDiagram-v2
    [*] --> IDLE
    IDLE --> LIVE: Live λ²„νŠΌ
    LIVE --> RECORD: Record λ²„νŠΌ
    LIVE --> IDLE: Live λ²„νŠΌ
    RECORD --> PLAYBACK: Record λ²„νŠΌ
    PLAYBACK --> IDLE: Playback λ²„νŠΌ
    IDLE --> PLAYBACK: Play/Playback λ²„νŠΌ

    state IDLE {
        [*] --> λŒ€κΈ°μ€‘
        λŒ€κΈ°μ€‘: 초기 μƒνƒœ
    }

    state LIVE {
        [*] --> 슀트리밍
        슀트리밍: μ‹€μ‹œκ°„ 카메라 좜λ ₯
        슀트리밍: μ§€μ—° μ‹œκ°„ 적용 κ°€λŠ₯
    }

    state RECORD {
        [*] --> 녹화쀑
        녹화쀑: 슀트리밍 + 파일 μ €μž₯
    }

    state PLAYBACK {
        [*] --> μž¬μƒ
        μž¬μƒ: λ…Ήν™”λœ μ˜μƒ μž¬μƒ
        μž¬μƒ --> μΌμ‹œμ •μ§€
        μΌμ‹œμ •μ§€ --> μž¬μƒ
    }
Loading

State Information

1. IDLE (λŒ€κΈ°)

  • 초기 μƒνƒœ
  • Live λ˜λŠ” Playback λͺ¨λ“œ μ§„μž… κ°€λŠ₯

2. LIVE (라이브)

  • μ‹€μ‹œκ°„ 카메라 슀트리밍
  • μ§€μ—° 좜λ ₯: 0~10초 μ„€μ • κ°€λŠ₯
  • μ‹€μ‹œκ°„ μ§€μ—° λ³€κ²½: 슀트리밍 쀑단 없이 Delay κ°’ 쑰절 κ°€λŠ₯
  • ν”„λ ˆμž„μ€ frontend/public/live/ 디렉토리에 μž„μ‹œ μ €μž₯

3. RECORD (λ…Ήν™”)

  • Live λͺ¨λ“œμ—μ„œ 무쀑단 μ „ν™˜
  • 슀트리밍 κ³„μ†ν•˜λ©΄μ„œ ν”„λ ˆμž„μ„ frontend/public/record/에 μ €μž₯
  • λ…Ήν™” 정보λ₯Ό rec_info.json에 기둝

4. PLAYBACK (μž¬μƒ)

  • λ…Ήν™”λœ ν”„λ ˆμž„ μ‹œν€€μŠ€ μž¬μƒ
  • λ‹€μ–‘ν•œ μž¬μƒ μ œμ–΄:
    • μ •λ°©ν–₯/μ—­λ°©ν–₯ μž¬μƒ
    • 속도 쑰절 (0.2x ~ 4.0x)
    • ν”„λ ˆμž„ λ‹¨μœ„ 이동
    • 처음/끝으둜 이동
    • 반볡 μž¬μƒ

⭐ Key Features

πŸ“Ή Live Mode (라이브 λͺ¨λ“œ)

  • μ‹€μ‹œκ°„ 카메라 슀트리밍
  • μ§€μ—° 좜λ ₯ κΈ°λŠ₯: 0~10초 사이 μ„€μ •
  • μ‹€μ‹œκ°„ Delay λ³€κ²½: 슀트리밍 쀑에도 μ§€μ—° μ‹œκ°„ 쑰절 κ°€λŠ₯
  • Linuxμ—μ„œ V4L2 카메라 μžλ™ 감지

πŸ”΄ Record Mode (λ…Ήν™” λͺ¨λ“œ)

  • Live λͺ¨λ“œμ—μ„œ μ¦‰μ‹œ λ…Ήν™” μ‹œμž‘
  • 슀트리밍 쀑단 없이 무쀑단 λ…Ήν™”
  • JPEG μ‹œν€€μŠ€λ‘œ μ €μž₯
  • λ…Ήν™” 메타데이터 μžλ™ μ €μž₯

▢️ Playback Mode (μž¬μƒ λͺ¨λ“œ)

  • λ…Ήν™”λœ μ˜μƒ μž¬μƒ
  • μž¬μƒ μ œμ–΄:
    • Play/Pause (μž¬μƒ/μΌμ‹œμ •μ§€)
    • Reverse (μ—­μž¬μƒ)
    • Next/Previous Frame (ν”„λ ˆμž„ 이동)
    • Rewind/Fast Forward (처음/끝)
  • μž¬μƒ μ˜΅μ…˜:
    • Speed: 0.2x ~ 4.0x (0.2 λ‹¨μœ„)
    • Repeat: 반볡 μž¬μƒ
    • Flip: 쒌우 λ°˜μ „
  • ν”„λ‘œκ·Έλ ˆμŠ€ λ°”λ‘œ νŠΉμ • μœ„μΉ˜ 이동

πŸ–₯️ Fullscreen Mode (전체화면 λͺ¨λ“œ)

  • F11 ν‚€ λ˜λŠ” Full λ²„νŠΌμœΌλ‘œ 전체화면 μ „ν™˜
  • μ „μ²΄ν™”λ©΄μ—μ„œ Escape ν‚€λ‘œ μ’…λ£Œ
  • μžλ™ 컨트둀 μˆ¨κΉ€: 마우슀 μ •μ§€ μ‹œ μžλ™μœΌλ‘œ 컨트둀 μ˜μ—­ μˆ¨κΉ€
  • 마우슀 ν˜Έλ²„ 감지: ν™”λ©΄ ν•˜λ‹¨ 100px μ΄λ‚΄λ‘œ 마우슀 이동 μ‹œ 컨트둀 ν‘œμ‹œ
  • λͺ¨λ“  λͺ¨λ“œ(Live, Record, Playback)μ—μ„œ μ‚¬μš© κ°€λŠ₯

⏱️ Live Delay Control (μ‹€μ‹œκ°„ μ§€μ—° μ œμ–΄)

  • Live λͺ¨λ“œ 쀑 μ§€μ—° μ‹œκ°„ λ³€κ²½ κ°€λŠ₯
  • Delay κ°’ λ³€κ²½ μ‹œ μžλ™μœΌλ‘œ 슀트리밍 μž¬μ‹œμž‘
  • 0~10초 λ²”μœ„μ—μ„œ μ‹€μ‹œκ°„ 쑰절

πŸ”‘ Key Components

Backend Components

FrameHandler (electron/main.js)

  • 카메라 캑처 ν”„λ‘œμ„ΈμŠ€ 관리
  • Live/Record λͺ¨λ“œ μ „ν™˜ μ œμ–΄
  • ν”„λ ˆμž„ 파일 관리 및 정리

Capture Device (backend/src/capture.js)

  • V4L2 카메라와 톡신
  • Unix Socket 기반 IPC
  • 카메라 μ„€μ • 및 μ œμ–΄

FrameWatcher (backend/src/frame-watcher.js)

  • Chokidar 기반 파일 κ°μ‹œ
  • μƒˆ ν”„λ ˆμž„ 감지 및 전달
  • μžλ™ μž¬μ‹œμž‘ λ©”μ»€λ‹ˆμ¦˜ (μ΅œλŒ€ 3회)

Frontend Components

MJPEGViewer (frontend/src/mjpeg-viewer.js)

  • 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 컨트둀러
  • μƒνƒœ 관리 및 μ „ν™˜ 둜직
  • μ‚¬μš©μž μž…λ ₯ 처리

FrameManager (frontend/src/frame-manager.js)

  • ν”„λ ˆμž„ 데이터 관리
  • 이미지 λ‘œλ”© 및 캐싱
  • ν”„λ ˆμž„ 탐색 및 인덱싱

UIController (frontend/src/ui-controller.js)

  • DOM μš”μ†Œ μ œμ–΄
  • Canvas λ Œλ”λ§
  • λ²„νŠΌ μƒνƒœ μ—…λ°μ΄νŠΈ
  • μ• λ‹ˆλ©”μ΄μ…˜ 효과

FullscreenManager (frontend/src/fullscreen-manager.js)

  • 전체화면 λͺ¨λ“œ μ „ν™˜ 관리
  • F11 ν‚€ 및 λ²„νŠΌ 이벀트 처리
  • μžλ™ 컨트둀 μˆ¨κΉ€/ν‘œμ‹œ
  • 마우슀 μ›€μ§μž„ 감지

Camera Settings

// electron/main.js - FrameHandler.startCapture()
const device = new capture.Device({
    width: 640,      // 해상도 λ„ˆλΉ„
    height: 360,     // 해상도 높이
    fps: 24,         // μ΄ˆλ‹Ή ν”„λ ˆμž„
    numFiles: 28     // 버퍼 파일 수 (fps * delay + 4)
});

πŸ“œ License

이 ν”„λ‘œμ νŠΈλŠ” LG Electronics Inc. CTO SoC Center λ‚΄λΆ€ ν”„λ‘œμ νŠΈλ‘œ 아직 λ°°ν¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ“ž 지원

κ°œλ°œνŒ€: LG Electronics SoC Media BSP Task

이메일: [email protected]

JIRA: http://jira.lge.com/issue/browse/SICDTV-15711

About

camera

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •