UVC対応USBカメラをラズパイ(CUI)で使う方法まとめ

ラズパイでUVC対応のUSBカメラを使用して、静止画の撮影、動画の撮影、動画撮影&ストリーミング配信を行う方法を紹介します。

1. 静止画を撮影する方法

静止画はfswebcamで撮影できます。
まずはインストールです。

// 念のためパッケージのアップデートをチェック
$ sudo apt update
// アップデートをインストール
$ sudo apt upgrade
// fswebcamをインストール
$ sudo apt-get install fswebcam

以下で撮影します。

// 解像度 1280x720、ファイル名image1.jpgとして撮影・保存する
$ fswebcam -r 1280x720 image1.jpg

撮影した画像をCUIで確認するにはfbiを使います。

// fbiをインストール
$ sudo apt install fbi
// 画像をCUIで表示 (ESCキーで終了)
$ fbi image1.jpg

カメラが対応している解像度を確認するには、v4l2-ctlを使用します。

// 接続されているカメラの情報を取得する為にv4l-utilsをインストール
// (既にインストール済みかも)
$ sudo apt install v4l-utils
// 解像度一覧を表示
$ v4l2-ctl --list-formats-ext
// 対象デバイスを指定して解像度一覧を表示
$ v4l2-ctl -d /dev/video0 --list-formats-ext

カメラが対応している詳細設定(露光時間等)を確認するには、以下のようにします。

$ v4l2-ctl -L
// 又は以下でも可
$ fswebcam -d v4l2:/dev/video0 --list-controls

カメラがオートフォーカスや自動露光を完了させるまで待ち時間を入れるには、次のようにします。

// オートフォーカス/自動露光が完了するまで待ってから撮影
$ fswebcam -r 1280x720 -S 10 test1.jpg

露光時間(シャッタースピード)等の詳細設定を行って撮影するには、以下のようにします。

// 輝度100%、ゲイン80%で撮影。
// (カメラが設定可能かどうかは『v4l2-ctl -L』で確認)
$ fswebcam -s Brightness=100% -s Gain=80% -r 1280x720 image2.jpg
// 露光時間を設定して撮影するにはv4l2-ctlで先に設定
// パラメーターは『v4l2-ctl -L』で確認
$ v4l2-ctl -c exposure_auto=1 -c exposure_absolute=5000
$ fswebcam -r 1280x720 image4.jpg

一定間隔で写真を撮影するには、以下のようにします。

// 5秒毎に写真を撮る(ファイル名は日時)
$ fswebcam -r 1280x720 -l 5 date "%Y%m%d_%H%M%S".jpg

2. 動画を撮影する方法

動画撮影はffmpegを使用します。
まずはインストールです。

// 念のためパッケージのアップデートをチェック
$ sudo apt update
// アップデートをインストール
$ sudo apt upgrade
// ffmpegインストール
$ sudo apt install ffmpeg

以下で動画を撮影します。

// 音声デバイスを確認 (card "2" と device "0"を確認。ffmpegのコマンドで必要となる)
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 2: C525 [HD Webcam C525], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

// 動画撮影開始
$ ffmpeg \
  -f alsa -thread_queue_size 8192 -i hw:2,0 \
  -f v4l2 -thread_queue_size 8192 -s 640x480 -i /dev/video0 \
  -c:v h264_omx -b:v 768k \  
  -c:a aac \
  output.mp4 

マイクがあることが前提なので、もしマイクなしのカメラを使用する場合は、ffmpegの『-f alsa~』の行と、『-c:a acc』の行を削ってください。

また、もし次のようなエラーが出た場合

[alsa @ 0x225c2a0] cannot set channel count to 2 (Invalid argument)
hw:2,0: Input/output error

以下の方法で解決できる可能性があります。

// 音声デバイス一覧を表示
$ arecord -L
hw:CARD=525,DEV=0
    HD Webcam C525, USB Audio
    Direct hardware device without any conversions
plughw:CARD=C525,DEV=0
    HD Webcam C525, USB Audio
    Hardware device with all software conversions

// 動画撮影開始。 『hw:2,0』を『plughw:CARD=C525,DEV=0』に変更した。
// 『plughw:CARD=C525,DEV=0』は上の arecord -L で確認したもの。
$ ffmpeg \
  -f alsa -thread_queue_size 8192 -i plughw:CARD=C525,DEV=0 \
  -f v4l2 -thread_queue_size 8192 -s 640x480 -i /dev/video0 \
  -c:v h264_omx -b:v 768k \  
  -c:a aac \
  output.mp4 

ffmpegの2行目は音声入力の設定をしています。

-f alsa 音声入力形式にALSAを選択しています。ALSA とは、Linux で音声入出力を行うための標準的な仕組みの事です。
-thread_queue_size 8192 音声入力のバッファを8192(byte?)に設定しています。
-i hw:2,0 音声入力デバイスを選択しています。2,0はarecord -listの結果から、カード2番のデバイス0番を指定しています。

ffmpegの3行目はカメラ入力の設定をしています。

-f v4l2 カメラ入力フォーマットにv4l2を選択しています。v4l2(Video4Linux)とは、Linuxでカメラ関係の制御に使用される一般的なAPI的なものです。
-thread_queue_size 8192 カメラ入力のバッファを8192(byte?)に設定しています。
-s 640×480 カメラの解像度を指定します。v4l2-ctl –list-formats-ext にて対応解像度一覧を表示できます。
-i /dev/video0 カメラデバイスに/dev/video0を選択しています。

ffmpegの4行目はビデオコーデックの設定をしています。

ffmpegの5行目はオーディオコーデックの設定をしています。

ffmpegの6行目はファイル名の設定をしています。


ファイル名を日時にするには以下のようにします。

// 動画撮影開始
// "%Y%m%d_%H%M%S.mp4" とすることでファイル名が日付になる
$ ffmpeg \
  -f alsa -thread_queue_size 8192 -i hw:2,0 \
  -f v4l2 -thread_queue_size 8192 -s 640x480 -i /dev/video0 \
  -c:v h264_omx -b:v 768k \  
  -c:a aac \
  "%Y%m%d_%H%M%S.mp4"

CUIで動画再生するにはomxplayerを使用します。

$ omxplayer --loop --no-osd filename.mp4

3. 動画撮影&ストリーミング配信する方法

動画撮影&ストリーミング配信するにはMJPG-streamerを使用します。
まずはインストールです。

// 念のためパッケージのアップデートをチェック
$ sudo apt update
// アップデートをインストール
$ sudo apt upgrade
// MJPG-Streamerの取得・動作に必要なパッケージをインストール
$ sudo apt install git cmake libjpeg8-dev
// MJPG-Streamerを取得
$ git clone https://github.com/jacksonliam/mjpg-streamer.git
// フォルダに移動
$ cd mjpg-streamer/mjpg-streamer-experimental
// MJPG-Streamerを実行できるようにコンパイル・インストール
$ make
$ sudo make install

次に起動用のスクリプトを作成します。
今回はスクリプト名を『stream.sh』とします。

$ nano stream.sh

---

#!/bin/sh

#インストールパスを記述
export LD_LIBRARY_PATH="/home/pi/mjpg-streamer/mjpg-streamer-experimental"
STREAMER="$LD_LIBRARY_PATH/mjpg_streamer"
 
# 画像サイズ(640×480)、フレームレート:10fps
SIZE="640x480"
FPS="10"
 
# Webサーバーの設定
WWWDOC="$LD_LIBRARY_PATH/www"
PORT="8080"

# 起動用のコマンド
$STREAMER -i "input_uvc.so -y -n -f $FPS -r $SIZE -d /dev/video0" \
          -o "output_http.so -w $WWWDOC -p $PORT"

以下で動画撮影&ストリーミング配信します。

$ bash stream.sh

これで動画撮影が開始され、ストリーミング配信サーバーが立ち上がりました。
他の同一ネットワークに存在するPCでWebブラウザを立ち上げて、
『http://ラズパイのIPアドレス:8080/?action=stream』
にアクセスすると、ストリーミング動画を確認できます。
また、『http://ラズパイのIPアドレス:8080/』にアクセスするとMJPG-StramerのWebページが開き、スナップショット用のURL( ./?action=snapshot )等が確認できます。

Basic認証を掛けて他の人から見られないようにするには以下のようにします。

#ユーザーIDを"user"、パスワードを"pass"にする
ID="user"
PW="pass"

# 起動用のコマンド
$STREAMER -i "input_uvc.so -y -n -f $FPS -r $SIZE -d /dev/video0" \
          -o "output_http.so -w $WWWDOC -p $PORT -c $ID:$PW"

ストリーミング配信しながら動画をファイル保存するには、次のようにします。

// 別タスクで起動
$ bash stream.sh &
// 注意:Basic認証が必要な場合は失敗します
$ ffmpeg -i http://127.0.0.1:8080/?action=stream -an -vcodec h264_omx test.mp4

コメント

このブログの人気の投稿

v4l2-ctlで行うUSBカメラ設定方法まとめ

【Windows11】簡単にできるRaspberry Pi Pico 開発環境構築 (VSCode, C言語, PicoProbe)

Raspberry Piでシリアル通信する方法(通信設定・通信確認)