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
    
  • h264_v4l2m2m:ハードウェアエンコード
  • ffmpegコマンドで使用した。次のソフトウェアエンコード「libx264」より遅延が少なくなった。

  • libx264 :ソフトウェアエンコード

VLCメディアプレイヤーにRaspberry Pi 4に接続されたC920からの配信された動画が表示されます。