Raspberry Pi 4 をライブ配信デバイスとして作ろうと思ったけど失敗だった件
やりたかったこと
ライブ配信デバイスを作りたかった。
USB カメラと USB ドングル型 LTE モデムを接続して起動すれば YouTube ライブに配信が始まっちゃうよ!みたいなデバイスだったんだよ。LiveShell のオマージュ
やったこと → ぜんぶ失敗
1. ffserver
ffmpeg で dup って ffserver 経由でリアルタイム配信、VLC でモニタリングしつつ、もう一つは RTMP で YouTube Live に流す。
code:構成
| Raspberry Pi |
USB カメラ --| v4l2 -- ffmpeg -+> http | http -- ffserver -- rtsp | rtsp -- VLC |
|>--------------------------------------------------- rtmp -- YouTube Live
もう ffserver はオワコンとのこと。3.4 から ffserver を作ることは可能。 code:builld ffserver
$ sudo sed -i.orig -e "s%#deb-src%deb-src%g" /etc/apt/sources.list
$ sudo apt update
$ sudo apt build-dep ffmpeg
これでコンパイル環境は整います。 ./configure オプションは ffmpeg 実行時に表示される内容を横流ししてください。
2. OBS Studio
OBS Studio は Windows / macOS / Linux(!!) で動作する「ビデオ録画と生放送用の無料でオープンソースのソフトウェア」で、 YouTube ライブのエンコード配信のページでも紹介されている力強いソフトウェア。 Windows で試してみたら これいけるやん!!!! となったので Raspberry Pi 4 で動かす努力をしたが、討死した。
https://obsproject.com/assets/images/OBSDemoApp2321.png
コンパイルまでは行くのよ。コンパイルまでは。しかも実行もできるのよ!でもね、、、
code:obs build
$ sudo apt install -y build-essential checkinstall cmake git \
libmbedtls-dev libasound2-dev libavcodec-dev libavdevice-dev \
libavfilter-dev libavformat-dev libavutil-dev \
libcurl4-openssl-dev libfontconfig-dev libfreetype6-dev \
libgl1-mesa-dev libjack-jackd2-dev libjansson-dev \
libluajit-5.1-dev libpulse-dev libqt5x11extras5-dev \
libspeexdsp-dev libswresample-dev libswscale-dev libudev-dev \
libv4l-dev libvlc-dev libx11-dev libx264-dev libxcb-shm0-dev \
libxcb-xinerama0-dev libxcomposite-dev libxinerama-dev \
pkg-config python3-dev qtbase5-dev libqt5svg5-dev swig \
libx11-xcb-dev libxcb-randr0-dev libxcb-xinput-dev
$ mkdir -p /tmp/b && cd /tmp/b
$ mkdir -p obs-studio/build && cd obs-studio/build
$ cmake -DUNIX_STRUCTURE=1 .. && make -j$(nproc)
$ sudo make install && sudo ldconfig
Raspbian は libfdk-aac(-dev) が無いため apt install の対象から libfdk-aac-dev を抜いています。コンパイルには支障が無かったため良しとしています。(高音質じゃないかもしれませんが、そこまで気にする配信をしたければ別の手段を考えた方が良いでしょう。)
cmake の際 missing: X11_XCB_LIBRARIES X11_XCB_INCLUDE_DIR 、 missing: XCB_RANDR_FOUND 、 Could NOT find XCB_XINPUT 、 Could NOT find XCB_XFIXES と言われるため libx11-xcb-dev libxcb-randr0-dev libxcb-xinput-dev libxcb-xfixes0-dev を apt install に追加しています。
さあ obs で起動すると、、、Cannot work under this OpenGL driver version. という、切ないお言葉。
調べてみると system requirements に OpenGL 3.2 or higher となっているが、Raspberry Pi 4 はそうではない(ごめん、glxinfo の出力の記録を忘れた、確か3.1)ため、また、搭載している GPU が OpenGL 3.1 には準拠(?)してるけど、その先が見えない模様。
ちなみに DISPLAY=WindowsPC_HOST:0.0 obs で X410 とかに X Window を飛ばすと動くよwwww 3. ffmpeg 単独
YouTube ライブのアカウントも pass したので「もう、ffmpeg だけでいいか」と思い ffmpeg で送ってみたら、期待する画質が得られなかった。
code:ffmpeg
ffmpeg \
-re -f alsa -thread_queue_size 8192 -i hw:1,0 \
-f v4l2 -thread_queue_size 8192 -input_format yuyv422 -video_size 640x360 -framerate 30 -i /dev/video0 \
-c:v h264_omx -b:v 768k -bufsize 768k -vsync 1 -g 16 \
-c:a aac -b:a 128k -ar 44100 \
-f flv rtmp://YOUR_SERVER_URL/YOUR_KEY
カメラの問題: 接続してたカメラが yuyv422 だと framerate=30(fps) を出したい場合、最大サイズが 360p(640x360) と、小さいサイズになってしまい、ちょっと迫力に欠ける。(低価格 WebCam ではこれが当たり前かな)
RPi の問題:
mjpeg だと 720p(1280x720) で 30 fps が出せるが、ffmpeg 側での convert rate が 0.5 => 1秒分のデータを作るのに 2 秒必要ってことで、ストリーミング速度が不足する。
yuyv422 でもビットレートを上げると convert rate が 0.7 になってしまい、やはり速度不足。
要するにパワー不足だという事がわかり、全体的に断念しました。残念。
参考資料
LICENSE
Copyright (c) 2020 Kohei "Max" MATSUSHITA (@ma2shita)
Released under the MIT license