Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

2015年頃からRaspberry Piを使ってくると、変更されたことに戸惑うことがあります。中でも、ラズパイの基板にあるCSI接続で直接繋げるカメラモジュールを使った例が顕著です。

bustarの頃はraspistillコマンドだったのが、その後にrpicam-stillコマンドに変更されました。これは静止画の話で、動画撮影はrapividコマンドからrpicam-vidコマンドへ変更しています。

但し、これはカメラモジュールの場合であり、一般的なUSB接続のWEBカメラだと使えません。

この記事は次の製品を使って試しています。

HD画質の720P(1280x720)まで対応していて、マイクも内蔵されているタイプです。

logcool C270n

静止画と動画は別のやり方になります。あくまでもCUIでの操作になり、GUIは別の記事を参考にしてください。

WEBカメラ

WEBカメラで静止画を撮る

基本はRaspberry Pi公式のマニュアル通りです。

https://www.raspberrypi.com/documentation/computers/camera_software.html#use-a-usb-webcam

fswebcamを使います。

インストールしてから、ユーザー(ここではraspida)をvideoグループに加えます。今ログインしているユーザー名などに置き換えて読んでください。

これで権限のエラーは出なくなります。

sudo apt install fswebcam

sudo usermod -a -G video raspida

基本の書式はこれ。

fswebcam test.jpg

デフォルトだと352x288と小さい解像度になっていますね。

下部にバーが表示され、右下に日時がみえますね。文字化けしている場合は、noto-fontsをインストールすると解消します。sudo apt install fonts-noto-cjk

fswebcam -r 1280x720 test.jpg

オプションはたくさんあります。

とりあえず解像度を変えるのは-rオプションです。他はfswebcam --helpで確認してください。

画像の下部に出ているバー状の出力をやめるなら、--no-bannerオプションです。

日付けのファイル名

fswebcamには日付けや連番といったファイル名の命名機能がありません。公式ではシェルスクリプトで代用するよう紹介されています。

シェルスクリプトを実行することで、日付け入りのファイル名で撮影できるようになります。

記述する内容は3行です。次のように適当な場所にshファイルを新規に作り、実行権限を与えておきます。

nano webcam.sh
chmod +x webcam.sh

ファイル名に日付けが入るようにして、fswebcamで1280x720で撮影させる内容です。

#!/bin/bash

DATE=$(date +"%Y-%m-%d_%H-%M-%S")

fswebcam -r 1280x720 --no-banner $DATE.jpg

同じディレクトリに移動しているなら、次のシェルコマンドで静止画の撮影を実行できます。

./webcam.sh

--no-bannerオプションで下部にあるバー状の日付けエリアを出力しないようにできます。

■Pi 5は8GBモデルがオススメ

WEBカメラで動画を撮る

次は動画です。こちらはffmpegを使うことで代用できます。

その前に。

USBケーブルで繋げたWEBカメラの情報を把握しておくと、あとで理解するのが簡単です。いくつかのコマンドを実行して調べて置きます。

WEBカメラのデバイス情報

lsusb

こんな感じで、3行目にあるWebcam C270のIDが046d:0825であることが分かりました。

Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 003 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 1c4f:0027 SiGma Micro USB Keyboard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

一般的には1つのWebcamであればvideo0だと思います。一応、/dev/video0を調べておきます。

sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
E: ID_MODEL_ID=0825
E: ID_SERIAL_SHORT=1811AF40
E: ID_VENDOR_ID=046d
E: ID_USB_MODEL_ID=0825
E: ID_USB_SERIAL_SHORT=1811AF40
E: ID_USB_VENDOR_ID=046d

先程のベンダーIDやモデルIDが同じことが分かります。これでvideo0がC720nだと確信が持てました。

Raspberry Piに複数のカメラを繋いで居る場合、次のコマンドを使ってベンダーIDやUSBという表記から判別しておきます。

v4l2-ctl --list-devices
UVC Camera (046d:0825) (usb-xhci-hcd.1-1):
	/dev/video0
	/dev/video1
	/dev/media2

以下、/dev/video0にUSBケーブルで接続しているWEBカメラが前提で進めます。

カメラが対応する解像度を調べておく

C270は、フレームレートを30にしたい場合、‘YUYV’ (YUYV 4:2:2)形式だと640x以下にしか対応していないことが分かりました。ちょっと小さいですよね。

‘MJPG’ (Motion-JPEG, compressed)形式なら1270xでも対応していました。

v4l2-ctl --list-formats-ext
'YUYV' (YUYV 4:2:2)
Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)

'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)

設定を変えるのはv4l2-ctlコマンドで可能です。たくさんあるため、v4l2-ctl --helpで確認してください。

ffmpegコマンド

Raspberry Piに繋いだWEBカメラ(USB)で動画を録画する際、ffmpegに様々なオプションを付けて実行することになります。

ラズパイに関係なくffmpegの話です。細かくはffmpeg関連を調べてください。

次のコマンドが、C270で録画できたオプションです。マイクも付いているカメラなので一緒に録音しています。最後が出力ファイル名であるout.mkvです。

ffmpeg -f alsa -i pulse -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 30 -i /dev/video0 -c:v copy -c:a libopus -b:a 192k "out.mkv"

もし、これでもエラーが出る場合、品質の指定であるビデオサイズやフレームレートが対応していないか、マイクが付いていないカメラだったりすると思われます。

Mediainfoで知る

mediainfoというパッケージアプリを知りました。コマンドラインツールとGUI版があり、手軽にメディア情報を取得できて便利でした。

sudo apt install mediainfo mediainfo-gui

コマンドならmediainfo ファイル名で出力できます。

マルチプラットフォームのパッケージなので、Windows、macOS、各種Linuxで動作します。Raspberry Pi OSでも問題ありません。

カメラモジュールはV3がリリースされています

この記事では一般的なWEBカメラをPi5で使用する方法を挙げました。専用のカメラモジュールはRaspberry Pi OSで簡単に扱えるようになっていて便利ですが、汎用性がないため古いWEBカメラがあれば試してみてください。

手に入るうちに専用カメラモジュールも体験してみるのもお薦めします。