Raspberry Pi 4でffmpegを使ってUDP上でWebカメラからの動画をストリーミングします。WebカメラはUSB接続の「Logitech, Inc. HD Pro Webcam C920」を使用します。
Webカメラ「Logitech, Inc. HD Pro Webcam C920」の接続
Raspberry Pi 4にC920をUSB接続し、次のコマンドで接続を確認します。
$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 046d:08e5 Logitech, Inc. HD Pro Webcam C920 Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
WEBカメラをUVC経由で確認し、コントロールするコマンド「v4l2-ctl」をインストールします。
$ sudo apt-get install v4l-utils
次のコマンドで詳細を確認します。UVCカメラとして認識されたC920が「/dev/video0、/dev/video1、/dev/media4」として表示されます。また、動画規格としては、YUYV 4:2:2Motion-JPEG, compressedに対応しており、それぞれ解像度とフレームレートの組み合わせが用意されています。
$ v4l2-ctl --list-devices ・・・・ HD Pro Webcam C920 (usb-0000:01:00.0-1.2): /dev/video0 /dev/video1 /dev/media4
$ v4l2-ctl --device /dev/video0 --list-formats-ext ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'YUYV' (YUYV 4:2:2) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.042s (24.000 fps) ・・・・
C920は、H.264 compressedに対応しているはずなのに表示されない。
UDPでのストリーミングの確認方法
Windows10で動作するVLCメディアプレイヤーを使って、Raspberry Pi 4からののストリーミングを確認します。
VLCメディアプレイヤーのメニューから「メディア」->「ネットワークストリームを開く…」を選択します。
表示されたダイアログの「ネットワークURL・・・」に「udp://@:1234」を設定して、「再生」ボタンをクリックします。
ffmpegによるストリーミング
Raspberry Pi 4で次のffmpegコマンドを入力して、ストリーミングを開始します。
$ -f v4l2 -input_format yuyv422 -i /dev/video0 -r 10 -b:v 1M -c:v h264_v4l2m2m -f mpegts -flush_packets 0 udp://192.168.10.105:1234?pkt_size=1024 ・・・・ le-thumb --enable-shared --disable-doc --disable-programs libavutil 56. 51.100 / 56. 51.100 libavcodec 58. 91.100 / 58. 91.100 libavformat 58. 45.100 / 58. 45.100 libavdevice 58. 10.100 / 58. 10.100 libavfilter 7. 85.100 / 7. 85.100 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 7.100 / 5. 7.100 libswresample 3. 7.100 / 3. 7.100 libpostproc 55. 7.100 / 55. 7.100 Input #0, video4linux2,v4l2, from '/dev/video0': Duration: N/A, start: 100.052883, bitrate: 147456 kb/s Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (h264_v4l2m2m)) Press [q] to stop, [?] for help [h264_v4l2m2m @ 0x19d89c0] <<< v4l2_encode_init: fmt=1/-1 [h264_v4l2m2m @ 0x19d89c0] Using device /dev/video11 [h264_v4l2m2m @ 0x19d89c0] driver 'bcm2835-codec' on card 'bcm2835-codec-encode' in mplane mode [h264_v4l2m2m @ 0x19d89c0] requesting formats: output=YUYV capture=H264 Output #0, mpegts, to 'udp://192.168.10.105:1234?pkt_size=1024': Metadata: encoder : Lavf58.45.100 Stream #0:0: Video: h264 (h264_v4l2m2m), yuyv422, 640x480, q=-1--1, 1000 kb/s, 10 fps, 90k tbn, 10 tbc Metadata: encoder : Lavc58.91.100 h264_v4l2m2m frame= 3514 fps= 10 q=-0.0 size= 16183kB time=00:05:51.20 bitrate= 377.5kbits/s dup=0 drop=7023 speed= 1x
・「udp://192.168.10.105:1234?pkt_size=1024」を「udp://192.168.10.105:1234」にするとVLCメディアプレイヤーにに表示されない。
H264エンコードについて
H264エンコードのためにffmpegコマンドのパラメータ「-c:v 」に次の値を設定します。なお、Raspberry Pi 4はハードウェアエンコーダが実装されています。
- 「h264_omx 」:ハードウェアエンコード
古いハードウェアエンコードで使用するパラメータのようで(?)、ffmpegコマンドを実行すると次のエラーが発生した。
[h264_omx @ 0xcaebe0] libOMX_Core.so not found [h264_omx @ 0xcaebe0] libOmxCore.so not found
ffmpegコマンドで使用した。次のソフトウェアエンコード「libx264」より遅延が少なくなった。
VLCメディアプレイヤーにRaspberry Pi 4に接続されたC920からの配信された動画が表示されます。