這裡介紹如何使用樹莓派與 USB 的網路攝影機,拍攝縮時攝影,放在車上就可以作為旅遊的路程紀錄。
樹莓派是一張平價、但非常多功能的開發板,可以組合出各種的應用,例如加上一個簡單的 USB 網路攝影機,就可以做出縮時攝影的效果,由於它是使用 USB 供電,所以也可以非常方便的安裝在汽車上面,當作旅行的記錄器。
旅行縮時攝影
這個影片就是我用一張樹莓派 Raspberry Pi Model B+ 開發板與一個羅技 Logitech C920R HD PRO 網路攝影機所拍攝出來的旅行縮時攝影。
影片剛開始的前幾秒鐘,我還在調整攝影機的角度,裝好之後就開始上路實測了,這段路程只是簡單的一段台南到新營的道路,所以沒有什麼新鮮感,我是打算先打造好這個旅行縮時攝影工具,日後到各地景點旅遊的時候,就可以用這個紀錄沿途的風景了,以下是使用樹莓派打造旅行縮時攝影機的詳細教學。
基本概念
用樹莓派打造縮時攝影機的觀念很簡單,就是讓樹莓派可以控制 USB 網路攝影機,讓它可以每隔一段固定的時間就自動拍攝一張照片(例如每秒拍攝一張),最後再將這些照片串起來製作成影片,就是所謂的縮時攝影了。
使用樹莓派打造旅行縮時攝影機,需要的硬體設備主要有以下幾項:
- 樹莓派(含 MicroSD 記憶卡、無線網路卡)
- 不管是哪一代的樹莓派都可以,新一點的樹莓派其 CPU 比較快,可以拍攝比較精細的照片或影片,但是可能要擔心散熱問題,舊的樹莓派 CPU 較慢,既省電、又不會很熱,沒辦法做比較複雜的動作,但我覺得堪用,這裡我示範用的就是第一代的樹莓派 Raspberry Pi Model B+。
- USB 網路攝影機
- 只要是樹莓派支援的 USB 網路攝影機都可以,我是使用羅技 Logitech C920R HD PRO 網路攝影機做示範。
- 車用 USB 充電器
- 一般平板電腦用的 2A 車用 USB 充電器,用於樹莓派的供電。
在軟體安裝與設定方面,主要可分為三大項:
motion- motion 是用來操作網路攝影機,進行照相、錄影與偵測變動部位的工具,我們這裡是使用它的縮時攝影功能。
hostapdhostapd是用來提供無線網路 AP 的 daemon 服務。udhcpdudhcpd是一般的 DHCP 伺服器,負責分配 IP 位址給連線進來的無線網路設備(通常是手機)。
motion 是縮時攝影最關鍵的工具,只要有硬體設備與 motion 就可以進行縮時攝影了,但由於我們會將樹莓派安裝在汽車上,在車上若要裝鍵盤、滑鼠或螢幕通常不太可能,就算真的裝上去也很不方便,透過手機連線的方式會是比較可行的方案。
hostapd 與 udhcpd 就是用來建立無線網路熱點用的,讓手機可以直接連線至樹莓派,進行各種操作。
以下我們就要介紹如何使用這些軟硬體自製縮時攝影機。
安裝 motion
在樹莓派上使用 apt 安裝 motion:
sudo apt-get install motion
修改 /etc/motion/motion.conf 設定檔,以下是縮時攝影的基本設定方式:
# 照片解析度
width 1280
height 720
# 關閉輸出變動照片
output_pictures off
# jpeg 品質
quality 90
# 關閉輸出影片
ffmpeg_output_movies off
# 定時拍照,每秒一張
snapshot_interval 1
# 設定右下方文字
text_right "G.T.Wang"
# 設定輸出圖檔檔名格式
snapshot_filename %Y%m%d%H%M%S-snapshot
# 開啟串流與網頁管理功能
stream_localhost off
webcontrol_localhost off
照片解析度的部分需要依據自己的網路攝影機與樹莓派的規格來調整,通常我們都會希望解析度越高越好,調整的技巧是一開始先調成網路攝影機支援的最大的解析度,然後進行測試,看看是否能正常運作,如果跑不動的話(例如拍攝的過程會漏掉部分的照片,或是樹莓派的負載太重等),再慢慢下修解析度,找出最佳的設定。
motion 可以自動將畫面上有變動的部分儲存下來,這個功能在縮時攝影時不需要,所以把 output_pictures 關閉。
縮時攝影通常比較注重照片的品質,所以對於高規格的網路攝影機,記得將 quality 調高一些。
ffmpeg_output_movies 是可以讓 motion 即時輸出影片檔,但我們我們這裡是在事後使用 ffmpeg 指令的方式自行製作影片,所以不需要這個功能。
snapshot_interval 是拍照間隔,單位為秒,設定為 1 代表每秒拍攝一張照片。
text_right 是設定右下方的文字,這個預設應該是時間戳記,但是因為樹莓派本身沒有時間的資訊,所以我把它改為一般的文字。
stream_localhost 與 webcontrol_localhost 兩個參數是設定串流與網頁管理功能是否只有 localhost 能使用,由於我們需要透過 WiFi 存取,所以要設成 off。
在設定完 motion 的設定檔之後,插上 USB 網路攝影機,重新啟動 motion 服務:
service motion restart
另外順便確認一下 motion 服務開機會自動啟動:
update-rc.d motion enable
這個很重要,因為等到我們把樹莓派裝上車之後,沒有鍵盤、滑鼠與螢幕可用,如果他沒有自動啟動就麻煩了。
另外如果您在啟動 motion 服務時,出現類似這樣的錯誤訊息,就代表目錄的權限有些問題:
Nov 21 00:23:23 raspberrypi motion: [1] [ERR] [ALL] myfopen: Error opening file /var/lib/motion/01-20161121002323-snapshot.jpg with mode w: Nov 21 00:23:23 raspberrypi motion: [1] [ERR] [ALL] put_picture: Can't write picture to file /var/lib/motion/01-20161121002323-snapshot.jpg - check access rights to target directory#012Thread is going to finish due to this fatal error: Nov 21 00:23:23 raspberrypi motion: [1] [ERR] [EVT] event_image_snapshot: Could not create symbolic link [01-20161121002323-snapshot.jpg]:
請手動更改一下 /var/lib/motion 目錄的權限,讓 motion 有權限可以寫入這個目錄:
sudo chown motion:motion /var/lib/motion
正常來說,現在應該就可以在 /var/lib/motion 這個目錄中看到一些從網路攝影機擷取的照片了。
樹莓派設定 WiFi 熱點
使用 apt 安裝 hostapd 與 udhcpd:
sudo apt-get install hostapd udhcpd
編輯 /etc/udhcpd.conf:
# The start and end of the IP lease block
start 192.168.50.20 #default: 192.168.0.20
end 192.168.50.254 #default: 192.168.0.254
# The interface that udhcpd will use
interface wlan0 #default: eth0
option subnet 255.255.255.0
編輯 /etc/default/udhcpd 設定檔,啟用 udhcpd 服務:
# Comment the following line to enable
#DHCPD_ENABLED="no"
編輯 /etc/network/interfaces,設定 wlan0 無線網路,自訂一個虛擬的 IP 位址與網域:
auto wlan0
iface wlan0 inet static
address 192.168.50.1
netmask 255.255.255.0
建立 /etc/hostapd/hostapd.conf 設定檔,內容如下:
interface=wlan0
ssid=GTWang
hw_mode=g
channel=6
auth_algs=1
wmm_enabled=0
其中的 ssid 是無線網路的識別名稱,這個名字可以自己取。
若是第三代的樹莓派,還要加上這幾行:
ieee80211n=1 # 802.11n support
wmm_enabled=1 # QoS support
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
因為這個無線網路 AP 只是提供給手機連線至樹莓派使用的,沒有任何上網功能,所以我就不設任何密碼了。如果想要設定密碼,可以使用這個設定:
interface=wlan0
driver=nl80211
ssid=GTWang
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=My_Passphrase
wpa_key_mgmt=WPA-PSK
#wpa_pairwise=TKIP # 低安全性加密,適用於舊設備
rsn_pairwise=CCMP
編輯 /etc/default/hostapd 設定檔,指定 hostapd 的設定檔位置:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
重新啟動 hostapd 與 udhcpd 服務:
sudo service hostapd start
sudo service udhcpd start
並確認這兩個服務也都會在開機時自動啟動:
sudo update-rc.d hostapd enable
sudo update-rc.d udhcpd enable
關於樹莓派的 AP 設定,也可以參考樹莓派 Raspberry Pi 設定無線網路 WiFi AP 這篇文章。
樹莓派系統校調
最後可以觀察一下樹莓派的運行狀況,如果記憶體不足的話,可以將幾個沒有用到的服務關閉,例如 DHCP 的 client 與 ntp 校時服務在沒有對外網路的環境通常是用不到的:
sudo update-rc.d dhcpcd disable
sudo update-rc.d ntp disable
而藍芽通常也很少用,若使用 Raspberry Pi 3 的話也可以關掉:
sudo update-rc.d bluetooth disable
X Window 桌面也是非常耗費記憶體空間的,可以使用 raspi-config 這個設定工具將開機模式設定為文字模式:
sudo raspi-config
在 Boot Options 中設定開機進入 Console 模式,順便將 Splash Screen關閉,這樣可加快開機速度。
在沒有用到 X Window 的情況下,可將 GPU 的記憶體配置調降一些,這樣可以讓系統有更多記憶體可以使用,這部分一樣是在 raspi-config 的選單中做調整,在 Advanced Options 中選擇 Memory Split,設定 GPU 的記憶體為 16 MB。
必要時也可以考慮調整一下樹莓派的 swap 記憶體交換空間,不過以我的例子來說是不需要。
準備好所有的軟硬體與設定之後,接下來就是最重要的裝機實測了。
設備安裝
這個自製的旅行縮時攝影設備只需要一張樹莓派開發板與一個 USB 網路攝影機。

因為這一組設備我想要直接放在車上,所以就選一張舊的樹莓派來用,這一張是第一代的 Raspberry Pi Model B+ V1.2,CPU 只有 700 MHz,這個速度當作 PC 用的話通常不太夠,但放在車上用剛好,既省電又不會太熱。

電源的部分就使用一般車用的 USB 充電器就可以了,建議挑選有 2A 以上給平板用的那種。

將設定好的樹莓派接上 USB 網路攝影機與電源,正常的話不用一分鐘就會自動啟動攝影機,開始拍攝縮時攝影了。

網路攝影機就看自己喜歡放在哪個角度,通常掛在車內後照鏡上。

在車上安裝攝影機的鏡頭時,最常見的問題就是沒有螢幕,看不到鏡頭拍攝的角度,這時候我們就可以拿出手機,連線至樹莓派的 WiFi 熱點,接著用瀏覽器打開樹莓派的 8081 連接埠,就可以看到串流影像了,以我的例子來說,樹莓派的 IP 位址我設定為 192.168.50.1,就用瀏覽器開啟這個網址:
http://192.168.50.1:8081/
串流的畫面看起來就像這樣:

這樣我們就可以看著手機上鏡頭的畫面,輕鬆調整鏡頭的角度了。

這個串流畫面會有幾秒鐘的延遲,這可能跟樹莓派的處理速度有關係,不過實際操作上影響不大,只是在調整攝影機角度時,要稍微等個兩、三秒,再看看畫面是否合適。

調整好網路攝影機的角度之後,就可以開始使用這個自己打造的縮時攝影機了,也就是說接下來樹莓派就會以每秒一張的速度,將畫面拍攝下來,儲存在儲存媒體中。
樹莓派的 8080 連接埠還有 motion 提供的網頁操作介面,如果需要對 motion 進行各種控制,就可以透過這個方式。

就我個人的使用狀況而言,在使用的過程中車內有開冷氣的狀態下,樹莓派的溫度都在攝氏四十幾度左右,下面這張圖是我用手機的 RasPi Check App 查看樹莓派的狀態資訊快照。

舊版樹莓派的好處就是省電、溫度非常低,但是缺點就是 CPU 運算速度不夠快,如果想要製作更高畫質或拍攝頻率更高的影片,可以考慮使用新的樹莓派板子。
如果您是使用比較新版的樹莓派,散熱的問題可能就要注意,例如夏天不要放在陽光下直曬,或是放在冷氣口散熱。

原則上來說,USB 網路攝影機並沒有特別一定要使用哪一款,只要是樹莓派支援的 USB 網路攝影機都可以使用,除了本文中的這個網路攝影機,我也用過羅技的 C170 這一個網路攝影機,使用方式都完全一樣。Embedded Linux Wiki 有一張 RPi USB Webcams 表格可以參考。

在車子到達目的地時,先把車子停好之後,在車子熄火之前,使用 RasPi Check 這類的手機 App 控制樹莓派正常關機,確保所有的照片都正常寫入儲存媒體,接著再將汽車熄火。

當然如果不想那麼麻煩,也可以在停好車等個幾秒鐘(或是幾十秒)之後,直接將汽車熄火,通常照片也是可以正常寫入的,只是沒那麼保險。
製作影片
縮時攝影的照片拍攝完成後,可以將樹莓派的記憶卡取下來,放在 Linux 的個人電腦中掛載起來讀取照片。
所有拍攝的照片預設會儲存在 /var/lib/motion 目錄中,檔案名稱會類似 01-20161121023805-snapshot.jpg 這樣以日期來編碼的檔名。在製作影片之前,可以先自己篩選一下照片,把一些 NG 的照片刪掉。
接著把所有要用來製作影片的照片放在同一個目錄中,如果您想要把照片分組,製作多個影片,就把照片分別放在多個不同的目錄中,這樣比較方便處理。
在含有照片的目錄中,執行以下這段指令稿,將所有的照片依照順序重新以數字命名:
/bin/ls *.jpg | perl -ne 'chomp;printf "mv $_ %04d.jpgn",$i++' | sh
這樣的作用是方便把所有的照片一次交給 ffmpeg 處理,接著呼叫 ffmpeg 製作影片:
ffmpeg -r 20 -i %04d.jpg output.mp4
如果在比較新的 Linux 發行版中,ffmpeg 可能會被 avconv 取代,不過指令大同小異:
avconv -r 20 -i %04d.jpg output.mp4
這樣產生出來的 output.mp4 就是縮時攝影的結果了。下面這段影片是我在下雨天拍攝的旅行縮時攝影。
紀錄日期與時間
樹莓派的硬體中並沒有實時時鐘(RTC)的配備,也就是說樹莓派在斷電的狀態下是沒有辦法紀錄正確的時間的,如果有網路的話,我們可以在開機時透過 ntp 網路校時的方式取得正確的時間,但若是沒有網路的話(例如裝在汽車上),樹莓派是無法得知正確的時間的,所以在前面的示範教學中,在設定 motion 時,直接將照片中的時間戳記改為一般的文字,因為沒有正確的時間資訊,寫上去的時間也是錯的。
若想要在沒有網路的環境下,又可以保有正確的時間,可以在樹莓派上加裝一個 DS3231 RTC,這樣樹莓派在開機時就可以從這個 RTC 取得正確的時間,之後在拍攝縮時攝影照片時,就可以將正確的時間打在照片上。
加裝了 DS3231 RTC,有了正確的時間之後,接著再修改 /etc/motion/motion.conf 設定檔,將右下方的文字改為時間戳記:
#text_right %Y-%m-%dn%T-%q
#text_right "G.T.Wang"
text_right %Y-%m-%dn%T
這裡我用的時間戳記是年-月-日加上時間,這個格式可以自行調整,如果您設定一秒拍攝一張以上的畫面,可以再加上 %q 這個 frame 的編號。
加上時間戳記之後,拍攝出來的照片就會記錄下拍攝的時間,讓旅程的紀錄更完整。

以下就是加上時間戳記的縮時攝影。
上面這段影片中,中間大約在 1:03 左右的地方我開進加油站加油,這一次我沒有讓樹莓派正常關機就直接熄火,導致熄火前十幾秒的畫面圖檔都沒有寫入儲存媒體(那些檔案的大小都是零),所以中間這一段就漏掉了。所以如果是要錄製重要的畫面,記得要讓樹莓派正常關機。
