緣起:
再接續這篇,我後來沒了監視有無狗子的需求,所以就把它當成一般的監視器使用了,如果要可以紀錄影像的話,我還需要有軟體幫我把監視器的畫面給錄下來。問了
gpt 後,選了 MotionEye 來用
除了使用正規的 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,密碼留空即可。
要新增網路攝影機,選擇 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 -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
- -f v4l2:指定輸入格式(input format)為 Video4Linux2,Linux 下 USB camera 的標準接口。
- -thread_queue_size 512:設定輸入線程的 隊列大小(thread queue),避免 ffmpeg 解碼時 frame 堆疊 overflow。那時發現不加這個容易出現 buffer overflow, dropping frames。
- -input_format yuyv422:告訴 ffmpeg camera 輸出格式為 YUYV 4:2:2(raw video format)。那時發現用 MJPEG,Pi 會跑不太動。
- -video_size 1280x720:解析度。
- -framerate 10:幀率。
- -i /dev/video0:指定輸入裝置。
- -c:v h264_v4l2m2m:設定 video codec 為 h264_v4l2m2m,産生 H264 RTSP 影片。
- -b:v 2000k:設定影片位元率為 2000kbps (2Mbps)。
- -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









沒有留言:
張貼留言