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カメラがあれば試してみてください。
手に入るうちに専用カメラモジュールも体験してみるのもお薦めします。





