#Webカメラを扱うために
参考:https://leico.github.io/TechnicalNote/Linux/webcam-usage
まずはv4l2をインストールする。
sudo apt-get install v4l-utils
これでv4l2-ctlが使えるようになった。
Webカメラを接続して、以下を入力すると、利用できるカメラが一覧できる。
v4l2-ctl --list-devices
結果
UVC Camera (046d:0825) (usb-3f980000.usb-1.2):
/dev/video0
この/dev/video0
というところを後で使うのでメモしておく。
#USBマイクを扱うために
参考:http://suen-study.blogspot.com/2014/02/usbusbarecordaplay.html
すでに、ffmpegのインストール時にalsaはインストールしているので、
USBマイクを接続して、
arecord -list
で、USBマイクの一覧が表示される。
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: U0x46d0x825 [USB Device 0x46d:0x825], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 2: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
Webカメラにもマイクが搭載されているので、デバイスが2つ表示されている。
このうちカード1の方は、U0x46d0x825
とあり、先にv4l2-ctl
で取得したカメラの数字と同じ。
つまり、カード1のマイクはWebカメラに搭載のマイクとなる。
今回はUSBマイクを使いたいので、カード2の方になる。このカード2
とデバイス0
のそれぞれの数字をメモしておく。
#ffmpegを使ってWebカメラとUSBマイクから音声付き動画を取得
参考:https://signal-flag-z.blogspot.com/2016/10/raspberry-pi-3usbffmpeg.html
とりあえずカメラから画像を取得、USBマイクから音声を取得、Raspberry PIのハードウェアエンコーダを利用してエンコードして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 \
output.mp4
録画の終了はq
キーを押す。
それぞれの意味は以下の通り。(参考:https://ffmpeg.org/ffmpeg-all.html)
-f
入力・出力されるファイル(データ)のフォーマット。大抵の場合は設定しなくても大丈夫なのだが、マイクやカメラから取得するときには必要みたい(マイク→alsa、ビデオ→v4l2)。
-thread_queue_size
データを読むときのキュー(バッファみたいなもの?)のサイズ。高フレームレートの動画ストリームとかだと、処理が追い付かずに捨てられてしまうデータがあったりするのだが、キューサイズを大きくすると、それを防げる。
-s
動画のサイズ。
-i
入力ストリーム。ここで、先にメモした/dev/video0
とhw:2,0
(2と0がarecordの出力からのメモ)を設定する。
-c:v
-c:a
エンコードのコーデックの指定。vがビデオコーデック、aがオーディオコーデック。以前のバージョンだと-vcodec
-acodec
という形だったらしい。今回はラズパイのハードウェアエンコーダを使うのでh264_omxを指定。音声はaac。
-b:v
ビデオのビットレート。当然ながら値が大きいほど画質がきれいになる。
その他参考のページ