1P by GN⁺ | ★ favorite | 댓글 1개
  • Raspberry Pi WebRTC는 Raspberry Pi 또는 NVIDIA Jetson을 약 200ms 지연의 WebRTC 스트리밍 플랫폼으로 바꾸는 C++20 기반 프로젝트임
  • 네이티브 WebRTC를 사용하며 하드웨어/소프트웨어 인코딩, 스냅샷, 녹화, 방송, WebRTC DataChannel을 통한 원격 제어와 IoT 메시징을 지원함
  • 신호 방식은 MQTT, WHEP, WebSocket을 지원하며, MQTT는 Pi 카메라와 클라이언트가 WebRTC 연결 정보를 교환하는 데 사용됨
  • 지원 장치는 Raspberry Pi Zero/3/4/5와 NVIDIA Jetson Nano/NX/Orin이며, 카메라는 CSI 또는 USB를 사용할 수 있고 libcamera, libargus, V4L2를 지원해야 함
  • Pi 5 또는 하드웨어 인코더가 없는 장치에서는 실행 옵션에서 --hw-accel을 제거해야 하며, WHEP는 브로커가 필요 없지만 공개 호스트명이 필요함

프로젝트 개요

  • Raspberry Pi WebRTC는 Raspberry Pi 또는 NVIDIA Jetson을 저지연 WebRTC 스트리밍 플랫폼으로 바꾸는 프로젝트임
  • 목표 지연 시간은 약 200ms로 제시됨
  • 주요 기술 표기는 다음과 같음
    • libwebrtc m146.7680

    • C++20

      • Apache 2.0 라이선스

지원 기능

  • 네이티브 WebRTC 기반 스트리밍을 제공함
  • 영상 인코딩은 하드웨어 인코딩과 소프트웨어 인코딩을 지원함
  • 카메라 기능은 스냅샷, 녹화, 방송을 포함함
  • WebRTC DataChannel을 통해 원격 제어와 IoT 메시징을 지원함

신호 방식과 클라이언트

요구 사항

  • 지원 보드는 Raspberry Pi Zero/3/4/5 또는 NVIDIA Jetson Nano/NX/Orin
  • 카메라는 CSI 또는 USB 카메라를 사용할 수 있음
  • 카메라 입력은 libcamera, libargus 또는 V4L2를 지원해야 함

Raspberry Pi 빠른 시작

  • Raspberry Pi OS 설치
  • 의존성 설치
    • libmosquitto1, pulseaudio, libavformat61, libswscale8, libyaml-cpp0.8을 설치함
  • 바이너리 다운로드
  • MQTT 신호 처리
    • HiveMQ, EMQX, 또는 자체 호스팅 브로커를 사용할 수 있음
    • MQTT는 Pi 카메라와 클라이언트가 WebRTC 연결 정보를 교환하게 함
    • WHEP는 브로커가 필요 없지만 공개 호스트명이 필요함

실행 방식과 주의점

  • picamera-web을 열고 MQTT 설정을 추가한 뒤 UID를 생성함
  • Pi에서 ./pi-webrtc를 실행하며 카메라, FPS, 해상도, MQTT 호스트, 포트, 사용자명, 비밀번호, UID 등을 옵션으로 지정함
  • 예시 옵션은 --camera=libcamera:0, --fps=30, --width=1280, --height=960, --use-mqtt, --no-audio 등을 포함함
  • --hw-accelPi Zero 2W, 3B, 4B에서 하드웨어 인코딩을 사용할 때 붙이는 옵션임
  • Pi 5 또는 하드웨어 인코더가 없는 장치에서는 --hw-accel을 제거해야 함

고급 사용

댓글과 토론

Hacker News 의견들
  • 예전에 리노베이션 중인 집을 원격으로 감시해야 해서, 지인들이 추천한 광고 많이 하는 보안 시스템을 설치해 보려 했는데 싸지 않았고, 원하는 기능 대부분이 브로드밴드 인터넷을 요구한다는 걸 설정 중에야 알게 됐음
    마케팅 자료 어디에도 이 조건이 없었고, 그 집에는 인터넷이 없었으며 보안 시스템 월 40달러에 인터넷 최소 60달러를 더 낼 생각은 없었음
    대신 Raspberry Pi 카메라를 갖고 있던 RPi Zero 2W에 붙이고, LTE 핫스팟과 T-Mobile 월 5달러 선불 SIM을 샀음
    소프트웨어는 imgcomp로 매초 사진을 찍어 RAM 디스크에 저장했고, 두 사진이 노이즈를 제외하고 달라지면 Pi가 바뀐 사진을 VPS 디렉터리에 올리게 했으며, 그걸 트리거로 Gotify가 사진 링크를 휴대폰에 알림으로 보내게 구성함
    전체적으로 루브 골드버그식 구성이긴 했지만 몇 년 동안 거의 완벽하게 동작했음

    • “보안 시스템이 싸지 않았다”와 “시스템이 40달러 정도였다”가 잘 연결되지 않음. 보안 시스템이 얼마나 싸야 한다고 기대한 건지 궁금함
    • 이건 땜장이와 해커 정신에 딱 맞는 방식이라고 봄. 필요한 게 있으면 가진 것으로 직접 해결책을 만들었고, 딱히 루브 골드버그식이라고 느껴지지도 않음
    • 인터넷 연결 없이 카메라를 인터넷으로 모니터링할 수 있을 거라고 기대한 건가? 구독 없이 카메라에 LTE가 내장돼 있길 기대한 것처럼 읽힘
    • 꽤 괜찮은 구성임. 요즘이라면 그 뒤에 codeproject.ai의 GPU나 TPU 기반 Coral 모듈을 붙여 처리할 수도 있을 듯함
  • 예전에 비슷한 걸 만들고 있었음 https://youtube.com/watch?v=5E7_40PWqiQ
    집을 짓는 동안 아파트에 살고 있었고, 카메라로 타임랩스 영상을 만들면서 부가적으로 인터넷에서 접속해 작업자들이 어떻게 하고 있는지 볼 수 있게 하려 했음
    안타깝게도 떠올리는 아이디어마다 이미 누군가, 이 경우에는 중국 쪽에서 만들어 둔 상태였음. AliExpress에는 이런 기능과 그 이상을 해 주는 꽤 괜찮은 카메라들이 있고, 3D 프린트한 엉성한 케이스보다 마감도 더 좋음

    • 이런 장치들 중 일부, 어쩌면 대부분이나 전부는 외부 서비스를 필요로 함. 즉 그 서비스가 존재하는 동안만 동작하고 벤더 손에 맡겨지는 구조임
      이런 장치를 만들고 Tor를 통해 원격 접근 가능하게 하는 게 꿈임. 그러면 완전히 로컬로 두면서도 전 세계 어디서나 원격 접속할 수 있음
  • Raspberry Pi Zero WH에서 써 보려고 보던 대안 프로젝트로 mediamtx가 있음
    https://github.com/bluenviron/mediamtx?tab=readme-ov-file#raspberry-pi-cameras

  • WebRTC를 잘 활용한 사례이고, 이상하게도 아직 WebRTC는 충분히 쓰이지 않는 편임
    자체 호스팅하면서 모바일 데이터로 시그널링 서버에 원격 접속하려면, ISP가 동적 IP를 제공할 경우 DDNS와 포트 포워딩을 설정해야 할 수 있음
    다만 이 방식은 서버를 인터넷에 노출함. 대신 Pi와 서버 사이에 비공개 연결을 만들어 주는 오픈소스 솔루션을 쓰면 됨. 그러면 서버에 네트워크 접근을 열지 않아도 되고, 정적 IP나 포트 포워딩도 필요 없음

    • WebRTC가 잠재력을 최대한 발휘하는 걸 보는 게 인생의 열정임. P2P/NAT 통과를 알고 나서는 예전으로 돌아갈 수 없었음
      왜 WebRTC가 널리 자리 잡는 데 어려움을 겪었다고 보는지 궁금함. 소프트웨어 품질, 교육 자료 같은 문제인지 늘 새 프로젝트를 찾고 있음
    • Pi 위에 MQTT 서버를 만들면 문제가 해결됨 :)
  • Raspberry Pi 5가 v4l2 하드웨어 인코딩을 지원하지 않는다는 부분이 잘 이해되지 않음. 동영상 디코딩은 그렇게 공들여 넣었는데 왜 인코더는 없는 걸까?

    • 인코딩하는 사람이 디코딩하는 사람보다 훨씬 적어서라고 추정함
      인코딩과 디코딩에는 겹치는 부분이 있지만, Opus 코덱 작업을 할 때도 한쪽 경로에만 해당하는 코드가 꽤 있었음
    • 실리콘 면적을 다른 데 쓰기로 결정한 것임. Pi 5 CPU는 대부분의 H.264 스트림을 소프트웨어로 디코딩할 만큼 강력하고, Pi 5에는 H.265 하드웨어 디코더가 있음
  • 딱 찾고 있던 물건임. 사람 감지를 돌리려고 했음
    yolov3-tiny를 쓰고 있는데, 최신은 아니지만 매우 가벼운 컴퓨터 비전 머신러닝 모델이고, 지금은 집 주변에서 실시간 사람 감지를 하기 위해 C++로 추론 성능을 최대화하는 중임
    밤에 누가 부지에 들어오면 사이렌과 조명이 자동으로 켜져 침입자를 쫓아내게 하고 싶음
    https://github.com/jmaczan/yolov3-tiny-openvino

    • 한밤중에 알람이 랜덤하게 울리는 장면이 떠오름
      접근할수록 조명과 사이렌을 점진적으로 켜는 방식을 상상해 봤음. 그러면 훨씬 일찍 반응하면서 잠재적 침입자에게 물러나라는 신호를 충분히 줄 수 있음
      피드백 루프 안에서 아드레날린을 서서히 올리는 쪽이 더 효과적일 것 같음. 갑작스러운 효과는 한 번만 판단하면 되기 때문임
  • 최근 항상 켜져 있는 녹음 장치를 만들었음. 주 목적은 오디오를 꾸준히 계속 녹음하는 것이고, 감시용이 아니라 훌륭한 연주 중간에 녹음 버튼 누르는 걸 기억하고 싶지 않은 음악가와 창작자를 위한 것임
    Zero-W와 arecord/aplay를 다루는 약간 까다로운 셸 스크립트, turboLua 프런트엔드를 사용했고 꽤 잘 동작함
    계속 녹음하되 사용자가 정한 보존 기간이 지나 “오래된” 오디오만 삭제하도록 했고, 선택지는 1분, 5분, 15분, 30분, 1시간, 3시간, 5시간, 24시간까지 둠
    사용자가 뭔가 좋은 걸 담았다고 느낀 시간 구간을 Keep할 수 있는 프런트엔드도 만들었음. 이 휴리스틱은 많은 감시 제품의 데드맨 스위치/보안 카메라 메커니즘과 비슷함
    너무 잘 동작해서 왜 아직 표준처럼 자리 잡지 않았는지 궁금할 정도임. 저장 공간을 채우고 싶지 않아 하는 경제적 선호가 아직 남아 있는 것 같지만, 요즘은 128GB도 꽤 오래 버팀
    언젠가는 이런 방식이 일반화될 것 같음. 설치해 두고 잊어버린 뒤 몇 시간 잼을 하고 돌아와 보관하고 싶은 것만 찾으면 나머지 정리는 알아서 끝나 있으니 꽤 영감을 줌

  • 오래된 RPi Cam Web Interface 프로젝트도 잊으면 안 됨. 꽤 오래됐지만 아직 내 Pi들에서 돌아가고 있음
    SD 카드를 망가뜨리지 않도록 지속 운용 환경에서 실행하고, 저장은 서버로 보내는 구조임. 인터페이스도 깔끔함
    https://elinux.org/RPi-Cam-Web-Interface

  • 비슷한 용도로 https://github.com/TinkerTurtle/Sentry-Picam을 매우 잘 쓰고 있음
    녹화된 이미지/동영상 폴더는 syncthing으로 다른 3대의 머신과 동기화해 중복성을 확보했고, sendxmpp 기반 푸시 알림 스크립트를 붙여 무슨 일이 생기면 모든 기기에서 실시간으로 알림을 받게 했음

  • 꽤 멋짐. 예전에 https://securade.ai에서 Nvidia Jetson을 엣지 장치로 써서 비슷한 걸 작업한 적이 있음
    지금은 reCamera가 기대됨: https://www.seeedstudio.com/blog/recamera/