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」の撮影がストリーミングされます。