raspberrypi 官網 raspberrypi 官網

互動 IoT 系統應用 - 上課教材

互動 IoT 系統應用 > 課程內容 > 第 14 章 - 樹莓派 motion 錄影功能

第 14 章 - 樹莓派 motion 錄影功能

上次更新日期 2022/12/19

上一章節我們談到了透過 USB 的 Webcam 搭配 mjpg-streamer 來進行監測畫面,這樣的好處是,可以降低延遲以及 CPU 負載, 影像速度超級快!只是,這種畫面使用的是 MJPG 的圖片格式,與一般 IPcam 的 mp4 格式還是有所差別! 另外,mjpg-streamer 也有可以儲存照片的功能,但是,儲存資料量會非常龐大!我們應該僅想要錄製畫面中有更動資料時, 才予以錄製!這時就得要用到移動偵測 (motion detection) 的功能了!

學習目標:

  1. 啟動與確認 mjpg_streamer 功能
  2. 使用 motion 進行動態偵測與錄影
  3. 觀察檔案系統容量

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 功能完成即可!

...