FFmpeg を使って YouTube Live にカメラ配信する方法(Raspberry Pi)

Linux,お役立ち情報,プログラムbash,ffmpeg,Raspberry Pi,YouTube

Raspberry Pi (Linux) を使って FFmpeg で YouTube Live を配信する方法についてまとめておきます。下に示すのは実際にライブ配信した例です。

配信していた内容

USB カメラの映像を配信する

とりあえず Raspberry PI に USB カメラをつないで以下のコマンドを実行すれば、上で紹介したようなライブ配信ができます。これは左上に日付時間表示をカメラ映像にオーバレイして、任意の音声を無限ループでストリーミングする設定です。

ffmpeg -stream_loop -1 -i 音楽.mp3 \
-f v4l2 -s 1280x768 -r 10 -i /dev/video0 -vcodec libx264 -vf \
drawtext="fontfile=/usr/share/fonts/truetype/noto/NotoMono-Regular.ttf:x=2:y=2:fontsize=32:fontcolor=white:box=1:boxcolor=black@0.4:text='%{localtime} Sapporo Sta.'" \
-pix_fmt yuv420p -preset ultrafast -r 15 -g 30 -b:v 750k \
-acodec aac -ar 44100 -threads 0 -b:a 128k -bufsize 512k \
-f flv rtmp://a.rtmp.youtube.com/live2/ストリームキー

「音楽.mp3」は任意の音声ファイル、drawtext の fontfile にはシステムに入っているフォントファイルを指定します[1]Raspberry Pi の Raspberry Pi OS の場合はこのパスで Noto フォントが使える。これは右上に表示する文字列のフォントになります。最後「ストリームキー」のところに YouTube Live の配信キーを設定します。

配信には音声も必須

配信動画に音声チャンネルが存在しないと YouTube Live は配信できないようなので、無音でもいいので音声ファイルをくっつける必要があります。

とりあえず 5 秒間の無音 mp3 ファイルを上げておくので、必要があればダウンロードしてください。

無音の 5 秒間音声

なおこの音声はオープンソースの音声処理プログラムの SoX (Sound eXchange) を使って作成しました。wave ファイル作成後、ffmpeg で mp3 に変換しています。

sox -n -r 44100 -b 16 -c 1 -e signed-integer no_sound.wav trim 0.0 5.0
ffmpeg -i no_sound.wav -vn -ac 2 -ar 44100 -ab 256k -acodec libmp3lame -f mp3 no_sound.mp3

配信をし続けるためにループさせる

Raspberry Pi で配信し続けると、どうも高負荷になって ffmepg が落ちてしまうことがあるようです。YouTube Live は配信停止が短時間であれば再配信できるので、無限ループで実行して配信し続けられるようにしてみました。

#!/bin/sh

stream_key="ストリームキー"
audio_file="音楽.mp3"

while true
do
  ffmpeg -stream_loop -1 -i "${audio_file}" \
  -f v4l2 -s 1280x768 -r 10 -i /dev/video0 -vcodec libx264 -vf \
  drawtext="fontfile=/usr/share/fonts/truetype/noto/NotoMono-Regular.ttf:x=2:y=2:fontsize=32:fontcolor=white:box=1:boxcolor=black@0.4:text='%{localtime} Sapporo Sta.'" \
  -pix_fmt yuv420p -preset ultrafast -r 15 -g 30 -b:v 750k \
  -acodec aac -ar 44100 -threads 0 -b:a 128k -bufsize 512k \
  -f flv rtmp://a.rtmp.youtube.com/live2/${stream_key}
done

このスクリプトを実行すれば、途中で ffmpeg が落ちてもすぐに配信が再開できます。例えば tmux のようなターミナルマルチプレクサで実行しておけばそれなりに長く配信できます。

参考資料

脚注

脚注
1Raspberry Pi の Raspberry Pi OS の場合はこのパスで Noto フォントが使える