【前言】
看著陰暗的角落裡吃灰噎到嗓子眼的樹莓派,一起陪伴的時光歷歷在目,往事逐漸湧上心頭,每每觸及此處,內心總會升騰起陣陣憐憫之情...
我這有兩個裝置,一個是積灰已久的樹莓派,另一個是積灰已久的USB攝像頭。
我們今天用這兩個裝置做一個拍攝監控方案(非視訊錄製),然後將拍攝好的圖片合成視訊進行觀看。
主要用到的技術有:樹莓派/linux操作,crontab,python,ffmpeg。
【系列目錄】
- 樹莓派驅動usb攝像頭(非官方攝像頭模組)
- 樹莓派載入外接USB硬碟
- 樹莓派拍攝獲取素材程式
- 樹莓派定時任務編寫
- 將素材圖片合成視訊
【實現過程】
樹莓派驅動usb攝像頭(非官方攝像頭模組)
首先我們要保證樹莓派可以識別usb攝像頭裝置,使用命令:
lsusb
可以看到usb裝置列表第一個即 海康威視1080p usb攝像頭,說明我們的攝像頭裝置被正確識別,如果無法識別,則要排除裝置故障或想辦法安裝裝置驅動程式。
我們使用fswebcam應用來驅動usb攝像頭模組
sudo apt-get install fswebcam
sudo apt-get install mplayer
簡單輸入拍照命令測試下
fswebcam -r 1920*1080 --delay 3 --skip 10 1.jpg
我們把樹莓派上的 1.jpg 下載下來進行檢視,成功拍攝到了畫面!
我們在使用fswebcam時,增加了幾個引數,下面介紹這幾個引數的作用:
引數 | 作用 |
---|---|
-r 1920*1080 | 拍攝圖片解析度 |
--delay 3 | 延時3s後拍攝(給攝像頭自動對焦的時間,否則會模糊,這個經常拍照的可以理解吧) |
--skip 10 | 作用同上,拍攝時其實會拍攝好多幀,我們跳過前10幀以保證清晰度 |
樹莓派載入外接USB硬碟
我們計劃編寫一個程式來長時間捕捉攝像頭畫面,那麼就需要一個比較大的儲存空間來存放我們拍攝的圖片,我們從小角落找到一個同樣“積灰已久”的固態硬碟。
windows下使用過的硬碟,推薦格式化成FAT32格式,該格式是相容Linux系統檔案格式的,NTFS格式相容性不是特別好,可能讀寫會出問題。
當然直接用linux fdisk命令格式化成 ext2/3/4 也是可以的,但是後續在windows環境下讀寫又是新問題,如果硬碟不是準備永久掛載在linux系統下使用,還是建議用FAT32格式使用。
windows10/11 下已經不提供格式成 FAT32 的入口,我們可以下載奧梅分割槽助手快速格式化成想要的格式。
使用命令檢視固態硬碟是否被識別
lsusb
可以看到,第二個usb裝置便是我們的usb固態硬碟裝置了(M.2硬碟放到了USB硬碟盒進行外接)
使用 fdisk 命令檢視硬碟屬性
fdisk -l
使用 mount 掛載硬碟裝置,將磁碟掛載到 /mnt/sda1 路徑下
雖然網上有很多教程說配置一個配置檔案(具體配置我就不說了),然後讓裝置開機自動掛載,但我個人極不推薦,修改配置檔案開機自動掛載雖然貌似一勞永逸,但在硬碟裝置發生變更時,大概率因為忘記同步修改配置檔案,會造成無法啟動系統的嚴重故障,折騰不說還可能需要重灌系統解決...其實啟動不頻繁情況下,手動裝載也不費事。
mount /dev/sda3 /mnt/sda1
然後使用 df 命令檢視儲存佔用詳情
df
可以看到硬碟成功掛載。
樹莓派拍攝獲取素材程式
我們編寫一個短小的python指令碼來實現以下幾點小功能:
- 據時間歸檔目錄
- 呼叫api執行拍照,並按時間戳命名
import os
import time
if __name__ == '__main__':
path = '/mnt/sda1'
# path = 'E:\code\Project.Python\CameraShoot'
folder = f'{path}/{time.strftime("%Y%m%d")}'
if not os.path.exists(folder):
os.mkdir(folder)
# 拍照
os.system(
f'fswebcam -r 1920*1080 --delay 3 --skip 10 {folder}/{time.strftime("%Y%m%d%H%M%S")}.jpg'
)
樹莓派定時任務編寫
我們使用 linux 環境下的 crontab 編寫定時任務,來定時執行拍照任務(初步定每分鐘拍一張)
crontab -e
* * * * * python /7tiny/camera_shoot.py
採用定時任務,每分鐘自動排程執行我們寫好的python指令碼,來進行拍照任務的執行
等待一段時間後,便可拿到拍攝素材...
將素材圖片合成視訊
我們先簡單從樹莓派上下載下來拍攝好的圖片,在 windows 上簡單合成一個視訊,完成我們的任務目標,後期可以根據需要在樹莓派上自動合成。
我們用 ffmpeg 軟體將圖片合成為視訊。
首先下載 ffmpeg 軟體的 exe 版本(windows),linux上可直接下載linux版。
然後將解壓後 ffmpeg 的 exe 目錄新增到環境變數,方便我們執行命令。
將樹莓派上的圖片下載下來。
下載下來的圖片我們是預設使用時間戳來命名圖片的,因為ffmpeg只能從 0 - n 順序識別圖片,無法識別時間戳這種命名,因此,我這裡自己編寫了一個工具將圖片名稱替換成了 0 - n.jpg。
有需要的同學可以在文末獲取到工具原始碼及下載地址。
重新命名好後,我們執行命令壓縮圖片為 mp4 檔案。
ffmpeg -r 10 -f image2 -i %d.jpg -vcodec libx264 -pix_fmt yuv420p out.mp4
同樣我們介紹下使用的幾個引數:
引數 | 作用 |
---|---|
-r 10 | 視訊為每秒10幀,可以根據需要調整,10幀就是10張圖片 |
%d | 從0開始在當前目錄遞增尋找圖片 |
-vcodec libx264(windows相容) | |
-vcodec libx265(體積更小,windows預設不支援) | 視訊壓縮引數 |
-pix_fmt yuv420p | 視訊編碼格式(windows下播放相容) |
執行後,我們便可檢視到圖片被拼接成為 mp4 格式的視訊。
【總結】
本文通過短小的程式碼片段初步使用樹莓派+usb攝像頭進行環境捕捉,在此基礎上,可以進行很多額外的場景擴充套件及使用優化。
【原始碼地址】
重新命名工具原始碼及編譯後綠色程式:
https://github.com/sevenTiny/SevenTinyToolBox/blob/main/tools/SevenTinyToolBox.RenameWithNumber.exe