第 14 章 - 樹莓派 motion 錄影功能
上次更新日期 2022/12/19
上一章節我們談到了透過 USB 的 Webcam 搭配 mjpg-streamer 來進行監測畫面,這樣的好處是,可以降低延遲以及 CPU 負載, 影像速度超級快!只是,這種畫面使用的是 MJPG 的圖片格式,與一般 IPcam 的 mp4 格式還是有所差別! 另外,mjpg-streamer 也有可以儲存照片的功能,但是,儲存資料量會非常龐大!我們應該僅想要錄製畫面中有更動資料時, 才予以錄製!這時就得要用到移動偵測 (motion detection) 的功能了!
學習目標:
- 啟動與確認 mjpg_streamer 功能
- 使用 motion 進行動態偵測與錄影
- 觀察檔案系統容量
14.1: 使用 motion 進行移動偵測
在前一個章節,我們為了要讓 Magic Mirror 可以使用 Webcam,讓 Webcam 的鏡頭可以隨時展開,因為目前我們僅有螢幕, 沒有鏡子!所以可以使用這個方式來提供用戶一個自我觀察的界面。我們也知道 V4L2 是基本的 Linux 萬用鏡頭功能 (video), 經常使用的裝置名稱為 /dev/video0 這樣的格式。但是使用 V4L2 直接透過 ffmpeg 或 vlc 等軟體進行展示時,感覺上會有比較大的延遲, 所以,才會建議使用 mjpg-streamer 軟體進行影像處理的!相關的流程,可以參考前一章節的內容,這裡不再重複了!
- 確認串流資料流通沒問題
要確認串流沒問題,除了本機使用『 http://localhost:8888/?action=stream 』的瀏覽器界面環境之外, 也可以使用外部的瀏覽器來瀏覽。那如果想要將圖像抓下來?也可以透過抓取快照來處理!很簡單的使用如下的指令來處理:
$ wget http://localhost:8888/?action=snapshot -O check.jpg
這樣就會產生名為 check.jpg 的圖檔!你可以使用瀏覽器環境或者是秀圖軟體直接抓上述這張圖即可。 mjpg_streamer 本身也提供圖片的處理,只是挺麻煩的是,由於抓下來的資料為圖片,而我們一秒鐘可以產生 15 或 30 張圖片, 這會造成檔案數量太大!所以,可能我們會每隔幾秒鐘才去產生一張圖~做成類似縮圖攝影...
那如果想要直接轉成影片呢?例如 .mp4 的影片檔?此時可以透過 ffmpeg 的協助喔!簡單的處理方式如下:
$ ffmpeg -r 30 -i http://localhost:8888/?action=stream -preset ultrafast \ > -vcodec libx264 check.mp4 $ [ctrl]+c
這個動作會抓一陣子~記得要自己中斷才行!這樣就可以產生一個 check.mp4 的 h264 支援的錄影檔~ 播放之後,就可以看到該圖示了!如果一切都順利!那你的 Webcam 看起來就應該是正常的!
- 開始使用 motion
移動偵測,在 raspberry pi 上面,內建了 motion 的功能,安裝與設定也相當簡單,我們先來安裝一下:
# 1. 先讓系統安裝 motion 囉!
$ sudo apt-get -y install motion
.....
安裝完畢之後,我們可以開始修改 /etc/motion/motion.conf 這個設定檔!我們主要的設定,就是要讓 motion 主要是偵測 http://localhost:8888/?action=stream 這個網址,然後轉成 MP4 的格式檔案,大致上的處理方式, 會有點像這樣:
# 2. 開始修改 motion.conf 內容
$ sudo vim /etc/motion/motion.conf
; videodevice /dev/video0 # 大約是 34 行,加上註解
netcam_url http://localhost:8888/?action=stream # 大約是 40 行,加上網址列
width 352 # 大約是 53 行,跟你的 Webcam 有關
height 288 # 大約是 56 行
framerate 30 # 大約是 59 行
movie_codec mp4 # 大約是 132 行,輸出成為網頁可讀
movie_filename %Y-%m-%d-%H%M%S # 大約是 135 行,修改輸出檔名
webcontrol_port 8090 # 不要跟你的系統既有埠口衝突即可
webcontrol_localhost off
stream_port 8091
stream_localhost off
很快改完!因為鳥哥不喜歡簡體中文的輸出,所以建議修改一下系統服務設定檔:
$ sudo vim /usr/lib/systemd/system/motion.service [Unit] Description=Motion detection video capture daemon Documentation=man:motion(1) [Service] Environment="LANG=C" Type=simple User=motion ExecStart=/usr/bin/motion [Install] WantedBy=multi-user.target $ sudo systemctl daemon-reload
現在準備來啟動服務!啟動服務會怪怪的!沒關係!我們依序來處理:
# 啟動服務,好像會失敗的樣子!看起來是怪怪的! $ sudo systemctl start motion Message from syslogd@raspberrypi at Dec 19 20:49:44 ... motion[92366]: [0:motion] [EMG] [ALL] motion_startup: Exit motion, cannot create log file /var/log/motion/motion.log: Permission denied Broadcast message from systemd-journald@raspberrypi (Mon 2022-12-19 20:49:44 CST): motion[92366]: [0:motion] [EMG] [ALL] motion_startup: Exit motion, cannot create log file /var/log/motion/motion.log: Permission denied $ ll -d /var/log/motion ls: 無法存取 '/var/log/motion': 沒有此一檔案或目錄 # 竟然是不存在!非常詭異!所以,手動建立,並且修改成為 motion 會使用的權限 $ sudo mkdir /var/log/motion $ sudo chown motion:adm /var/log/motion $ ll -d /var/log/motion drwxr-xr-x 2 motion adm 4096 12月 19 20:51 /var/log/motion $ sudo systemctl restart motion $ systemctl status motion ● motion.service - Motion detection video capture daemon Loaded: loaded (/lib/systemd/system/motion.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-12-19 20:52:37 CST; 24s ago Docs: man:motion(1) Main PID: 92469 (motion) Tasks: 5 (limit: 950) CPU: 5.093s CGroup: /system.slice/motion.service └─92469 /usr/bin/motion systemd[1]: Started Motion detection video capture daemon. [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf [NTC] [ALL] motion_startup: Logging to file (/var/log/motion/motion.log) [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf [NTC] [ALL] motion_startup: Logging to file (/var/log/motion/motion.log) $ tail /var/log/motion/motion.log
確認一下所有的資料都是正常的之後,開始看看系統有沒有順利啟動監聽埠口在 8090 上面?然後測試一下, 到你的鏡頭前面去晃一晃~接下來,跑到系統錄影儲存的位置上,看看有沒有新增檔案?
$ ll /var/lib/motion/
總用量 4056
-rw-r--r-- 1 motion adm 3890226 12月 19 20:56 2022-12-19-205513.mp4
-rw-r--r-- 1 motion adm 259300 12月 19 20:57 2022-12-19-205613.mp4
會有發現有錄影的檔名出現了喔!依據『年-月-日-時分秒.mp4』來紀錄~因為預設紀錄時間最長為 1 分鐘, 超過 1 分鐘就會移動到新的檔案上!所以,檔案數量也會挺多的!上面這個目錄檔案比較小,是因為鳥哥的環境中, 設定的串流影像較小的緣故!這需要注意!
14.2: 設定與運作注意事項
雖然 motion 的設計非常簡單,不過,使用上得要特別注意!因為樹莓派的效能實在不怎麼樣,所以, 如果你使用了較高解析度的 Webcam 時,將串流資料抓下來轉成 mp4 的檔案時,很可能會造成 cpu 的 loading 增加! 所以,如果在不考慮影像傳輸頻寬限制的情況下,你可以將 motion 安裝到其他伺服器上,這樣在進行 ffmpeg 轉檔時, 儲存的壓力比較小!不過,頻寬的使用,就真的要考慮考慮囉!
- 檔案系統的注意
因為是錄影檔,如果解析度比較高時,檔案儲存容量會增加非常多!這時,你得要經常注意你的檔案系統, 因為,如果檔案系統充爆了,那系統運作一定會出問題!到時候整個樹莓派當機...是非常危險的! 因此,定期使用 df 觀察檔案系統,定期移除舊的紀錄檔,是有其必要的喔!
- 設定檔內的 daemon 設定項目
從網路教學文章看到,很多朋友都說,要讓 motion 變成服務在背景執行,一定要將 /etc/motion/motion.conf 裡面設定成 『daemon on』!但是,這是指在終端機的模式底下!我們現在通常使用 systemd 管理系統,因此,不能使用 daemon on 啊! 當你使用 daemon on 之後,systemd 的啟動就會失敗!這個問題困擾鳥哥很久!最後復原成為『 daemon off 』之後, 才能透過『 sudo systemctl restart motion 』啟動 motion 偵測!很注意!很注意!
- /var/log/motion 的權限
motion 的安裝腳本可能有點問題,因為安裝時,竟然無法自動建立 /var/log/motion,有時候則是建立了, 但是權限不對!所以啟動 motion 時,會有錯誤訊息發生啊!解決方法上面有談到!自己查一查! 總之,就是 motion 啟動者是 motion 用戶,群組是 adm !這樣去思考就對了!
- 儲存檔案的一些變數
你會發現到我們在設定檔裡面填寫了『 %Y-%m... 』之類的東西,這些變數內容個別代表什麼意思呢? 很簡單,自行『 man motion 』之後,找到最底下的說明,就會有變數的意義!事實上,我們只有 /var/lib/motion 目錄, 如果你沒有額外的子目錄,其實未來在管理上面,會相當麻煩!所以,建議可以將錄影檔的檔名改成類似這樣:
$ sudo vim /etc/motion/motion.conf movie_filename %Y-%m-%d/%Y-%m-%d-%H%M%S $ sudo systemctl restart motion.service $ ll -R /var/lib/motion/ /var/lib/motion/: drwxr-sr-x 2 motion adm 4096 12月 19 21:27 2022-12-19 /var/lib/motion/2022-12-19: -rw-r--r-- 1 motion adm 262192 12月 19 21:27 2022-12-19-212716.mp4
你會發現,motion 會先分年月日的目錄,然後再提供檔名~這樣就不會所有的檔案都放在一起!在你未來的搜尋管理上面, 會比較輕鬆愉快!
14.3: 當週實做
請將本週的 WebCam 功能完成即可!
...