搜尋此網誌

2026年3月18日 星期三

Raspberry Pi MotionEyes & mediamtx+ffmpeg

緣起:


    再接續這篇,我後來沒了監視有無狗子的需求,所以就把它當成一般的監視器使用了,如果要可以紀錄影像的話,我還需要有軟體幫我把監視器的畫面給錄下來。問了 gpt 後,選了 MotionEye 來用


    它有提供 docker image,雖然錄影功能陽春了些,但對我來說夠用了,設定也很直覺。

    除了使用正規的 wifi 監視器之外,我還有使用之前買的 Raspberry pi zero 2w 搭配 usb webcamera,使用 mediamtx + ffmpeg,把 Raspberry pi zero 2w 變成一個支援 rtsp 的 network camera。


MotionEye:


    參考文章,直接貼上 docker-compose file

services:
  motioneye:
    image: ccrisan/motioneye:master-armhf
    container_name: motioneye
    restart: always
    mem_limit: 2G
    logging:
      driver: "json-file"
      options:
        max-size: "1k"
        max-file: "3"
    ports:
      - "8765:8765"
      - "8085:8081"
      - "7999:7999"
    volumes:
      - ./config:/etc/motioneye
      - ./record:/var/lib/motioneye
      - /etc/localtime:/etc/localtime:ro

    container 啟動後,開瀏覽器到 8765 port,它會要你登入,預設是 admin,密碼留空即可。


    左上有 settings,可以展開,可以更換密碼與新增、設定監視器


    要新增網路攝影機,選擇 add camera,然後選擇 Camera Type 為 Network Camera,輸入你監視器的 rtsp 網址、帳密,都輸入完後它會自動連線測試,如果能連上的話,那個 Camera 的欄位會出現 UDP 跟 TCP 的選項讓你選 (我選 UDP)。按下 OK 後,你應該就能在主面板看到監視器的方格畫面了


    再來可以針對每個監視器做設定



監視器參數設定:


    首先是 Video Device 區塊,修改監視器的解析度跟幀率,調整成合適的值


    Movie 那邊的設定,設定成偵測到動作後才錄製,最多錄 180 秒,影像保留一星期 (依自己需求調整)。我有勾 Movie Passthrough,它說這能減輕 cpu 的負擔,不過對 ram 的需求會變大些


    再來是重點的 Motion Detection,我這邊調很多次,覺得最重要的是那個 Auto Noise Detection 要關,然後調成 10,不然很常發生明明畫面沒什麼變化,它卻還是一直錄製。其它的參數在我多次測試後,覺得這樣最合適


    它還能設定其它觸發的事件跟排程,不過我當前還用不到就是了。


Mediamtx:


    我後來還想在我們神民廳裝個監視器,但是沒錢,所以我把目光放到之前買的那台 Raspberry pi zero 2W,想說該是發揮它功用的時候了,使用 usb camera,再搭配個什麼程式之類的,應該就能把它變成一個網路監視器對吧(?

    問了 gpt,它說可以用一個叫 mediamtx 的程式,搭配 ffmpeg 來達到這功能。首先下載 mediamtx

wget https://github.com/bluenviron/mediamtx/releases/download/v1.15.4/mediamtx_v1.15.4_linux_arm64.tar.gz
tar -xvf mediamtx_v1.15.4_linux_arm64.tar.gz
sudo mv mediamtx /usr/local/bin/

    它是一個可執行檔,直接跑的話它會開 RTSP port,預設是 rtsp://<Pi 的 IP>:8554/,接著用 ffmpeg 推流。

    我的 webcam 是 Logitech C270,先查看它可用的格式

v4l2-ctl --list-formats-ext


    我調整了一陣子的 ffmpeg 參數,最後是採用這個,串流才能正常且持續不斷地運行

ffmpeg -f v4l2 -thread_queue_size 512 -input_format yuyv422 -video_size 1280x720 -framerate 10 -i /dev/video0 -c:v h264_v4l2m2m -b:v 2000k -f rtsp rtsp://127.0.0.1:8554/stream

  1. -f v4l2指定輸入格式(input format)為 Video4Linux2,Linux 下 USB camera 的標準接口。
  2. -thread_queue_size 512:設定輸入線程的 隊列大小(thread queue),避免 ffmpeg 解碼時 frame 堆疊 overflow。那時發現不加這個容易出現 buffer overflow, dropping frames。
  3. -input_format yuyv422:告訴 ffmpeg camera 輸出格式為 YUYV 4:2:2(raw video format)。那時發現用 MJPEG,Pi 會跑不太動。
  4. -video_size 1280x720:解析度。
  5. -framerate 10:幀率。
  6. -i /dev/video0:指定輸入裝置。
  7. -c:v h264_v4l2m2m:設定 video codec 為 h264_v4l2m2m,産生 H264 RTSP 影片。
  8. -b:v 2000k:設定影片位元率為 2000kbps (2Mbps)。
  9. -f rtsp:告訴 ffmpeg 不是存檔,而是直接推到 RTSP server

    執行後,pi 就能跟網路監視器一樣,給 MotionEye 使用。最後還要設定 service,讓 pi 每次重新啟動後都會自動跑 mediamtx 跟 ffmpeg。

    在 /etc/systemd/system/ 下新增一個 mediamtx.service,加入以下內容

[Unit]
Description=Mediamtx RTSP Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mediamtx
Restart=always
RestartSec=5
User=birdshiu
WorkingDirectory=/home/birdshiu

[Install]
WantedBy=multi-user.target

    存檔後,讓 service 生效

sudo systemctl daemon-reload
sudo systemctl enable mediamtx
sudo systemctl start mediamtx

    再來是 ffmpeg,我在家目錄下新增一個 startffmpeg.sh

#!/bin/bash
ffmpeg -f v4l2 -thread_queue_size 512 -input_format yuyv422 -video_size 1280x720 -framerate 10 -i /dev/video0 -c:v h264_v4l2m2m -b:v 2000k -f rtsp rtsp://127.0.0.1:8554/stream

    在 /etc/systemd/system/ 下新增一個 startffmpeg.service,加入以下內容

[Unit]
Description=Rtsp
After=mediamtx.service
Requires=mediamtx.service

[Service]
Type=simple
ExecStart=/home/birdshiu/startffmpeg.sh
User=birdshiu
WorkingDirectory=/home/birdshiu
Restart=no

[Install]
WantedBy=multi-user.target

    重點是第三跟第四行,確保 mediamtx 有先啟動,才執行 ffmpeg 的 script。存檔後一樣啟動 service,這樣就完成了

sudo systemctl daemon-reload
sudo systemctl enable startffmpeg
sudo systemctl start startffmpeg


沒有留言:

張貼留言