Raspberry PiでYouTubeによるライブ配信を行う!(画像の合成/分散処理)

Raspberry PiでYouTubeによるライブ配信で、動画に静止画像を合成します。

重ねる静止画像を準備する!

静止画像を準備します。動画と同じサイズの画像を用意して重ねる場合は、透過の処理を行います。

配信動画に画像を重ねる!

配信動画に画像を重ます。以下のように、「-i」の他に繰り返し読み込みを行う設定「-loop 1」を行います。

$ raspivid -w 1920 -h 1080 -fps 10 -o - -t 0 | \
ffmpeg -thread_queue_size 512 -f h264 -r 10 -i - \
-loop 1 -i /home/pi/youtube/youtube_livecam.png -stream_loop -1 -i /home/pi/youtube/youtube_bgm_05.mp3 \
-c:v h264_omx -c:a aac -g 20 -s 1920x1080 \
-f flv rtmp://a.rtmp.youtube.com/live2/<STREAM KEY>

これで動画に画像を合成できますが、大きな問題が発生します。画像合成を行うとハードウェアエンコードが効かなくなり、fpsがでなくなります。

クラウドあるいはVPS側で画像を合成する!

Raspberry Piを動画のキャプチャーに専念させ、画像の合成はクラウドあるいはVPSで行う方法があります。「SSH」を使用すると便利です。

クラウド側のシェルを準備する!

例えば、以下のようにクラウド側で画像合成等の処理を行うシェルを準備します。標準入力からデータを受け取ることを想定してシェルを作成します。シェルの名前は、例として「/home/ubuusr01/youtube/youtube_cloud.sh」とします。

#/bin/bash
ffmpeg -thread_queue_size 512 -f h264 -r 10 -i - \
-loop 1 -i ~/youtube/youtube_livecam.png -stream_loop -1 -i ~/youtube/youtube_bgm_05.mp3 \
-c:v libx264 -c:a aac -b:a 128k -g 8 -s 1920x1080 \
-f flv rtmp://a.rtmp.youtube.com/live2/<STREAM KEY>

Raspberry Pi側から処理を起動する!

最初にRaspberry Pi側から処理を起動できるように、リモートアクセスするユーザ(例:ubuusr01)でSSHの鍵認証を可能にします。その後、以下のようなシェルで処理を起動します。

#/bin/bash
raspivid -w 1920 -h 1080 -fps 10 -o - -t 0 | \
ffmpeg  -thread_queue_size 512 -f h264 -r 10 -i - \
-c:v h264_omx -an -g 20 -s 1920x1080 \
-f h264 - | ssh ubuusr01@<クラウド側のサーバ名> /home/ubuusr01/youtube/youtube_cloud.sh

おわりに

画像合成を行うとハードウェアエンコードの恩恵が受けられれなくなります。処理速度が足りない場合は、複数マシンに処理を分割して実行するのがおすすめです。