Raspberry Pi 4でWebRTCサーバ「Janus」を構築し、ffmpegを使ってRTP上でWebカメラからの動画をストリーミングします。Webカメラは、「Raspberry Pi 4でffmpegを使ってUDPでのストリーミング」で使用した「HD Pro Webcam C920」を使用します。

WebRTCサーバ「Janus」のインストール

Janus WebRTC Server」の手順に従ってWebRTCサーバを構築します。

必要なパッケージを次のコマンドでインストールします。

$ sudo apt-get install -y libmicrohttpd-dev libjansson-dev libnice-dev \
libssl-dev libsrtp-dev libsofia-sip-ua-dev libglib2.0-dev \
libopus-dev libogg-dev pkg-config gengetopt libtool automake

次のコマンドで「Janus」ソースを取得します。

$ cd ; git clone https://github.com/meetecho/janus-gateway.git ; cd janus-gateway

次のコマンドでコンフィグファイルを作成します。

$ sh autogen.sh ; CFLAGS=-I/usr/include/glib-2.0 ./configure --disable-websockets --disable-data-channels --disable-rabbitmq --disable-docs --prefix=/opt/janus ; make

コンフィグ時にエラー「No package ‘libconfig’ found」が発生したので、次のライブラリをインストールします。

$  sudo apt-get install libconfig-dev
$  sudo apt-get install libsrtp2-dev

WebRTCサーバ「Janus」のコアとそのモジュールを、コンフィグファイルを使ってコンパイル・インストールします。

$ sudo make install; sudo make configs

次のコマンドでWebサーバ(nginx)をインストールし、WebRTCサーバ「Janus」を設定します。起動時にWebサーバを立ち上げます。

$ sudo apt-get install nginx
$ sudo cp -r /opt/janus/share/janus/demos/ /var/www/html/
$ sudo systemctl enable nginx 
$ sudo systemctl start nginx 

WebRTCサーバ「Janus」の起動

初期状態ではコメントアウトされているH.264のサポートを、次のようにコメントアウトを外して有効にします。デフォルトでは、8004番ポートでRTPの映像を受け、音声は無効になっています。

/opt/janus/etc/janus/janus.plugin.streaming.jcfg

# All browsers also support H.264, often through Cisco's OpenH264 plugin.
# The only profile that is definitely supported is the baseline one, which
# means that if you try a higher one it might or might not work. No matter
# which profile you encode, though, you can put a custom one in the SDP if
# you override the fmtp SDP attribute via 'videofmtp'. The following is an
# example of how to create a simple H.264 mountpoint: you can feed it via
# an x264enc+rtph264pay pipeline in gstreamer, an ffmpeg script or other.
#
h264-sample: {
        type = "rtp"
        id = 10
        description = "H.264 live stream coming from gstreamer"
        audio = false
        video = true
        videoport = 8004
        videopt = 126
        videocodec = "h264"
        videofmtp = "profile-level-id=42e01f;packetization-mode=1"
        secret = "adminpwd"
}

Raspberry Pi 4で、次のコマンドによりWebRTCサーバ「Janus」を起動します。

$ /opt/janus/bin/janus -F /opt/janus/etc/janus/
Janus version: 1104 (1.1.4)
Janus commit: 2667b6cec85ff6f8175b824a1758028d15fa5e54
Compiled on:  2023?  5? 15? ??? 05:53:11 JST

Logger plugins folder: /opt/janus/lib/janus/loggers
[WARN]  Couldn't access logger plugins folder...
---------------------------------------------------
  Starting Meetecho Janus (WebRTC Server) v1.1.4
---------------------------------------------------

Checking command line arguments...
Debug/log level is 4
Debug/log timestamps are disabled
Debug/log colors are enabled
Adding 'vmnet' to the ICE ignore list...
Using 192.168.10.125 as local IP...
Token based authentication disabled
Initializing recorder code
Initializing ICE stuff (Full mode, ICE-TCP candidates disabled, half-trickle, IPv6 support disabled)
[WARN] Janus is deployed on a private address (192.168.10.125) but you didn't specify any STUN server! Expect trouble if this is supposed to work over the internet and not just in a LAN...
Crypto: OpenSSL >= 1.1.0
No cert/key specified, autogenerating some...
Fingerprint of our certificate: 2A:F0:84:1D:27:1D:D9:62:EF:D4:7D:B1:EE:87:44:39:C5:C3:B7:6D:DE:E3:8A:F7:85:64:76:A6:D5:41:E4:C3
[WARN] Data Channels support not compiled
Sessions watchdog started
Event handlers support disabled
Plugins folder: /opt/janus/lib/janus/plugins
Joining Janus requests handler thread
Loading plugin 'libjanus_sip.so'...
JANUS SIP plugin initialized!
Loading plugin 'libjanus_videocall.so'...
JANUS VideoCall plugin initialized!
Loading plugin 'libjanus_videoroom.so'...
JANUS VideoRoom plugin initialized!
Loading plugin 'libjanus_echotest.so'...
JANUS EchoTest plugin initialized!
Loading plugin 'libjanus_recordplay.so'...
JANUS Record&Play plugin initialized!
Loading plugin 'libjanus_nosip.so'...
JANUS NoSIP plugin initialized!
Loading plugin 'libjanus_textroom.so'...
[WARN] Data channels support not compiled, disabling TextRoom plugin
[WARN] The 'janus.plugin.textroom' plugin could not be initialized
Loading plugin 'libjanus_streaming.so'...
[WARN] libcurl not available, Streaming plugin will not have RTSP support
JANUS Streaming plugin initialized!
Loading plugin 'libjanus_audiobridge.so'...
JANUS AudioBridge plugin initialized!
Transport plugins folder: /opt/janus/lib/janus/transports
Loading transport plugin 'libjanus_pfunix.so'...
[WARN] No Unix Sockets server started, giving up...
[WARN] The 'janus.transport.pfunix' plugin could not be initialized
Loading transport plugin 'libjanus_http.so'...
HTTP transport timer started
HTTP webserver started (port 8088, /janus path listener)...
JANUS REST (HTTP/HTTPS) transport plugin initialized!

パソコンのブラウザより「http://”Raspberry Pi 4 IPアドレス”/demos/streamingtest.html」にアクセスします。次のWebRTCサーバ「Janus」のデモ画面が表示されます。

ffmpegを使ってWebカメラからのストリーミング

Raspberry Pi 4で別のコンソールから、次のコマンドを使って動画を配信します。

ハードエンコード「-c:v h264_v4l2m2m」ではうまくストリーミングできないため、ソフトエンコード「-c:v libx264」としました。

$ ffmpeg \
    -f v4l2 -thread_queue_size 8192 -input_format yuyv422 \
    -framerate 10 -i /dev/video0 \
    -c:v libx264 -b:v 1M -bf 0 \
    -flags:v +global_header -bsf:v "dump_extra=freq=keyframe" \
    -max_delay 0 -an -bufsize 1M -vsync 1 -g 10 \
    -f rtp rtp://127.0.0.1:8004/

・・・・

ble-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: 1631.477168, bitrate: 49152 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 49152 kb/s, 10 fps, 10 tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x231bb10] VBV maxrate unspecified, assuming CBR
[libx264 @ 0x231bb10] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x231bb10] profile High 4:2:2, level 2.2, 4:2:2, 8-bit
[libx264 @ 0x231bb10] 264 - core 160 r3011 cde9a93 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2 keyint=10 keyint_min=1 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=cbr mbtree=1 bitrate=1000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=1000 vbv_bufsize=1000 nal_hrd=none filler=0 ip_ratio=1.40 aq=1:1.00
Output #0, rtp, to 'rtp://127.0.0.1:8004/':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: h264 (libx264), yuv422p, 640x480, q=-1--1, 1000 kb/s, 10 fps, 90k tbn, 10 tbc
    Metadata:
      encoder         : Lavc58.91.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 1000000 vbv_delay: N/A
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 58.45.100
m=video 8004 RTP/AVP 96
b=AS:1000
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z3oAFryyAUB7QgAAAwACAAADACgeLFyQ,aOvMsiw=; profile-level-id=7A0016

frame=  157 fps= 10 q=19.0 size=    1730kB time=00:00:13.90 bitrate=1019.7kbits/s speed=0.89x

パソコンのブラウザより、表示されているデモ画面の「Start」ボタンをクリックし、表示された画面で、あらかじめ設定ファイルを編集して追加した「H.264 live stream coming from gstreamer」を選択し、「Watch or Listen」ボタンをクリックします。

次のように、パソコンのブラウザの右側に、Raspberry Pi 4の「HD Pro Webcam C920」の撮影がストリーミングされます。