# 라즈베리 파이 기반 오픈 소스 보안 카메라

> Clean Markdown view of GeekNews topic #16807. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=16807](https://news.hada.io/topic?id=16807)
- GeekNews Markdown: [https://news.hada.io/topic/16807.md](https://news.hada.io/topic/16807.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-09-17T09:56:56+09:00
- Updated: 2024-09-17T09:56:56+09:00
- Original source: [github.com/TzuHuanTai](https://github.com/TzuHuanTai/RaspberryPi_WebRTC)
- Points: 1
- Comments: 1

## Topic Body

- Raspberry Pi를 저지연 홈 보안 카메라로 변환하는 프로젝트
  - v4l2DMA 하드웨어 인코더와 WebRTC를 사용
  - 미디어 서버 없이 순수 P2P 기반 카메라로 비디오 재생 및 다운로드 가능
  - 여러 사용자가 동시에 라이브 스트림 시청 가능
  - Raspberry Pi 5 또는 다른 SBC는 v4l2 하드웨어 인코딩을 지원하지 않음, 소프트웨어 인코딩 모드에서 실행 필요

#### 사용 방법
- 최신 바이너리 파일을 Releases에서 다운로드
- Pi Camera 앱 설치 및 지침 따르기

#### 하드웨어 요구 사항
- Raspberry Pi (Zero 2W 이상)
- CSI 카메라 모듈
- 최소 4GB의 micro SD 카드
- USB 디스크 및 Micro-USB Male to USB-A Female 어댑터

#### 환경 설정
1. Raspberry Pi Imager를 사용하여 Lite OS (Bookworm 64-bit)를 micro SD 카드에 쓰기
2. 필수 라이브러리 설치
    ```bash
    sudo apt install libmosquitto1 pulseaudio libavformat59 libswscale6
    ```
3. `/boot/firmware/config.txt`에 아래 내용 추가하여 Raspberry Pi 하드웨어 활성화
    ```txt
    camera_auto_detect=0
    start_x=1
    gpu_mem=16
    ```
    `camera_auto_detect=0` 설정하여 v4l2로 카메라 읽기
4. USB 디스크 마운트 [참조]
    - 비디오 녹화를 원하지 않으면 이 단계를 건너뛰고 실행 시 `record_path` 플래그 설정하지 않기
    - 디스크 드라이브가 감지되면 자동으로 `/mnt/ext_disk`에 마운트됨
    ```bash
    sudo apt-get install autofs
    echo '/- /etc/auto.usb --timeout=5' | sudo tee -a /etc/auto.master > /dev/null
    echo '/mnt/ext_disk -fstype=auto,nofail,nodev,nosuid,noatime,umask=000 :/dev/sda1' | sudo tee -a /etc/auto.usb > /dev/null
    sudo systemctl restart autofs
    ```

#### 애플리케이션 실행
- 현재 MQTT가 유일한 신호 메커니즘으로 사용되므로, 애플리케이션 시작 전에 MQTT 서버 준비 필요
- 애플리케이션이 LAN 내에서만 사용될 경우, 같은 Pi에 Mosquitto와 같은 MQTT 서버 설치 가능
- 원격 액세스가 필요한 경우, 클라우드 기반 MQTT 서버 사용 권장 (예: HiveMQ, EXMQ)
- 원격 신호 서버에 모바일 데이터로 접근하려면 DDNS 및 포트 포워딩 설정 필요

##### 실행
- `pi_webrtc` 바이너리 파일을 `-h` 플래그와 함께 실행하여 모든 옵션 확인 가능
- 설정을 적용하여 애플리케이션 시작
    ```bash
    pulseaudio --start
    /path/to/pi_webrtc --device=/dev/video0 --fps=30 --width=1280 --height=960 --v4l2_format=h264 --hw_accel --mqtt_host=example.s1.eu.hivemq.cloud --mqtt_port=8883 --mqtt_username=hakunamatata --mqtt_password=Wonderful --uid=home-pi-zero2w --record_path=/mnt/ext_disk/video/
    ```
    **힌트 1:** Pi 5는 하드웨어 인코딩을 지원하지 않으므로 `--hw_accel` 플래그 제거하고 `--v4l2_format`을 `mjpeg`로 설정. 비디오 인코딩은 OpenH264로 처리됨
    **힌트 2:** `1920x1080` 설정 시 하드웨어 디코더 펌웨어가 `1920x1088`로 변경되지만, isp/인코더가 조정되지 않아 메모리 범위를 벗어남. `1920x1088`로 설정하면 문제 없음

##### Linux 서비스로 실행
###### 1. `pulseaudio`를 시스템 전역 데몬으로 실행 [참조]
- `/etc/systemd/system/pulseaudio.service` 파일 생성
    ```txt
    [Unit]
    Description= Pulseaudio Daemon
    After=rtkit-daemon.service systemd-udevd.service dbus.service

    [Service]
    Type=simple
    ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disallow-module-loading
    Restart=always
    RestartSec=10

    [Install]
    WantedBy=multi-user.target
    ```
- 클라이언트 설정에 `autospawn = no` 추가
    ```bash
    echo 'autospawn = no' | sudo tee -a /etc/pulse/client.conf > /dev/null
    ```
- root를 pulse 그룹에 추가
    ```bash
    sudo adduser root pulse-access
    ```
- 서비스 활성화 및 시작
    ```bash
    sudo systemctl daemon-reload
    sudo systemctl enable pulseaudio.service
    sudo systemctl start pulseaudio.service
    ```

###### 2. `pi_webrtc` 실행 및 재부팅 시 자동 시작 설정
- `/etc/systemd/system/pi-webrtc.service` 파일 생성
    ```txt
    [Unit]
    Description= The p2p camera via webrtc.
    After=systemd-networkd.service

    [Service]
    Type=simple
    WorkingDirectory=/path/to
    ExecStart=/path/to/pi_webrtc --device=/dev/video0 --fps=30 --width=1280 --height=960 --v4l2_format=h264 --hw_accel --mqtt_host=example.s1.eu.hivemq.cloud --mqtt_port=8883 --mqtt_username=hakunamatata --mqtt_password=wonderful --record_path=/mnt/ext_disk/video/
    Restart=always
    RestartSec=10

    [Install]
    WantedBy=multi-user.target
    ```
- 서비스 활성화 및 시작
    ```bash
    sudo systemctl daemon-reload
    sudo systemctl enable pi-webrtc.service
    sudo systemctl start pi-webrtc.service
    ```

#### 고급 설정
- 양방향 통신을 위해 마이크와 스피커 추가 필요

##### 마이크
- 마이크 배선 및 테스트에 대한 지침은 링크 참조

##### 스피커
- 스피커 설정에 대한 지침은 링크 참조

#### 라이선스
- 이 프로젝트는 Apache License, Version 2.0에 따라 라이선스 부여됨. 자세한 내용은 LICENSE 파일 참조

### GN⁺의 정리
- 이 프로젝트는 Raspberry Pi를 저지연 홈 보안 카메라로 변환하는 방법을 제공함
- v4l2DMA 하드웨어 인코더와 WebRTC를 사용하여 미디어 서버 없이 순수 P2P 기반으로 동작함
- 여러 사용자가 동시에 라이브 스트림을 시청할 수 있어 가정용 보안 카메라로 유용함
- MQTT를 사용한 신호 메커니즘으로 LAN 및 원격 액세스 모두 지원 가능
- 유사한 기능을 가진 다른 프로젝트로는 MotionEye 및 ZoneMinder가 있음

## Comments



### Comment 28960

- Author: neo
- Created: 2024-09-17T09:56:56+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41547405) 
- 한 사용자는 집 수리 중 원격 감시를 위해 보안 시스템을 설치하려 했으나, 대부분의 기능이 광대역 인터넷을 필요로 한다는 사실을 알게 되었음
  - 대신 Raspberry Pi 카메라와 RPi Zero 2W, LTE 핫스팟, T-Mobile의 $5/월 선불 SIM을 사용하여 자체 시스템을 구축했음
  - 소프트웨어로는 imgcomp를 사용하여 매초 사진을 찍고, 변경된 사진을 VPS에 업로드하여 Gotify를 통해 휴대폰으로 알림을 받았음

- 다른 사용자는 집을 짓는 동안 아파트에 살면서 타임랩스 비디오를 만들고 인터넷을 통해 작업 상황을 확인하려 했음
  - AliExpress에서 더 나은 품질의 카메라를 찾았음

- 또 다른 사용자는 Raspberry Pi Zero WH를 사용하여 mediamtx 프로젝트를 고려했음
  - WebRTC를 활용한 좋은 예시로, DDNS와 포트 포워딩 설정이 필요할 수 있음
  - 오픈 소스 솔루션을 사용하여 Pi와 서버 간의 비공개 연결을 만들 수 있음

- 한 사용자는 Raspberry Pi 5가 v4l2 하드웨어 인코딩을 지원하지 않는 점에 의문을 가졌음

- 다른 사용자는 yolov3-tiny 모델을 사용하여 실시간 사람 감지를 시도하고 있었음
  - C++로 성능을 최대화하려고 노력 중임

- 또 다른 사용자는 Sentry-Picam을 사용하여 유사한 목적을 달성했으며, Syncthing을 통해 3대의 다른 기기와 동기화하고 sendxmpp를 기반으로 푸시 알림 스크립트를 연결했음

- 한 사용자는 Nvidia Jetson을 사용하여 유사한 프로젝트를 진행했으며, 현재 reCamera에 관심을 가지고 있음

- 또 다른 사용자는 오픈 소스 펌웨어를 사용하는 보드를 찾고 있었음

- 마지막으로, 한 사용자는 소리만 녹음하려면 WebRTC가 좋은 솔루션인지 궁금해했음
