Linux活用レシピ > 家電の制作 > RaspberryPiでライブストリーミング環境を構成
このページでは、「RaspberryPi」と、それで動作するOS「Raspbian」で、安価にリアルタイム動画を配信する環境(ライブストリーミング環境)を構成するレシピを紹介します。


RaspberryPiを使ったライブストリーミング環境の製作
YoutubeLiveにダイレクト配信


ここまでのレシピでRaspberry Piをストリーミングサーバーにして配信できる環境を構築しました。

ここでは、Raspberry Piに接続したWebカメラのライブストリーミングを、リアルタイムで直接YoutubeLiveにアップロードする方法を紹介します。

なので、実はこの方法はレシピで作ったNginxは使いませんので、より簡単に生配信ができます。


    1. Youtubeの準備


    Youtubeに配信を行うには、Youtubeに自分のアカウントでログインし、ページの右上にある「動画または投稿を作成」をクリックして表示される、「ライブ配信の開始」を選択します。

    次に前回配信を行ったことがあると「前回の設定を利用して新しい配信を作成」が表示されるので、「新しいライブ配信」または「コピーして作成」を選択します。

    すると、以下のように配信の編集があり、特に赤枠の部分を「非公開」にしておくと自分自身がだけが見れる生放送になります。

    必要な設定を行い、保存ボタンをクリックすると、
    以下の通り、ストリーミングの待ち受け画面になります。
    以上でYoutube側の準備は完了です。

    2. Raspberry PiでYoutube配信用のスクリプト準備

    それでは、Raspberry PiのRaspbianでコンソールをオープンし、以下の通りYoutube配信用のスクリプトを準備します。
    pi@raspberrypi:~ $ vi ~/scripts/streaming-start-youtube.sh[ENTER]
    ここで、まず以下の通り開始スクリプトを入力しますが、赤文字の「rtmp://YOUR_SERVER_URL」はYoutubeのストリームURLで、青文字の「YOUR_KEY」は、ストリームキーになります。
    #!/bin/bash
    NUM=`ps aux | grep ffmpeg | grep -v grep | wc -l`
    if [ $NUM -gt 0 ]; then
            echo "Already running."
            exit
    fi
    sudo ffmpeg \
            -f alsa -thread_queue_size 8192 \
            -i plughw:1 -f v4l2 \
            -thread_queue_size 8192 \
            -input_format yuyv422 -video_size 640x480 \
            -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 -af "volume=5dB" \
            -f flv rtmp://YOUR_SERVER_URL/YOUR_KEY > /dev/null 2>&1 </dev/null &
    
    YoutubeのストリームURLと、ストリームキーは、先ほど用意したYoutubeのストリーミングの待ち受け画面にある、赤枠部分と青枠部分になりますので、それぞれ「コピー」ボタンでコピーして貼り付けて保存してください。

    また、開始スクリプトは、以前にも述べましたが、以下の通り赤文字部分は画面サイズです。また、青文字部分はフレームレート(1秒間の動画で見せる静止画の枚数「コマ数」)です。
    #!/bin/bash
    NUM=`ps aux | grep ffmpeg | grep -v grep | wc -l`
    if [ $NUM -gt 0 ]; then
            echo "Already running."
            exit
    fi
    ffmpeg \
            -f alsa -thread_queue_size 8192 \
            -i plughw:1 -f v4l2 \
            -thread_queue_size 8192 \
            -input_format yuyv422 -video_size 640x480 \
            -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 -af "volume=5dB" \
            -f flv rtmp://YOUR_SERVER_URL/YOUR_KEY > /dev/null 2>&1 </dev/null &
    
    ここで、Webカメラが入力可能な画面サイズと、各画面サイズ毎のフレームレートは、以下のコマンドで確認できますので、その範囲で任意に指定してください。
    pi@raspberrypi:~ $ v4l2-ctl -d /dev/video0 --list-formats-ext[ENTER]
    
    以下の通り、各画面サイズとその際のフレームレートが表示されます。
    上記スクリプト内のffmpegで指定している記録フォーマットは「yuyv422」で指定していますので、下記の下線部の「'YUYV' (YUYV 4:2:2)」区画に表示されている、各画面サイズ毎のフレームレートを使用してください。
    ioctl: VIDIOC_ENUM_FMT
    	Type: Video Capture
    
    	[0]: 'YUYV' (YUYV 4:2:2)
    		Size: Discrete 640x480
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 160x120
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 176x144
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 320x240
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 352x288
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 800x600
    			Interval: Discrete 0.100s (10.000 fps)
    		Size: Discrete 1280x720
    			Interval: Discrete 0.125s (8.000 fps)
    		Size: Discrete 1920x1080
    			Interval: Discrete 0.200s (5.000 fps)
    	[1]: 'MJPG' (Motion-JPEG, compressed)
    		Size: Discrete 640x480
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 160x120
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 176x144
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 320x240
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 352x288
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 800x600
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 1280x720
    			Interval: Discrete 0.033s (30.000 fps)
    		Size: Discrete 1920x1080
    			Interval: Discrete 0.033s (30.000 fps)
    
    フレームレートは数字が大きいほどなめらかですが、画面サイズが大きくなるごとに、記録できるフレームレートは小さくなります。これはWebカメラの性能によりますので、お手持ちのWebカメラで実際に確認してください。


    なお、Webカメラのマイクではなく、「~./Music」(ホームディレクトリのMusic)ディレクトリに複数の音楽ファイル(mp3フォーマット)を置いておき、それをBGMとして順番に流す場合は、以下の「緑の部分のコード」の通りスクリプトを変更してください。
    #!/bin/bash
    NUM=`ps aux | grep ffmpeg | grep -v grep | wc -l`
    if [ $NUM -gt 0 ]; then
            echo "Already running."
            exit
    fi
    ffmpeg \
            -re -f concat -thread_queue_size 8192 \
            -safe 0 -i <(for file in ~/Music/*.mp3 ; \
                    do echo file "$file" ; done) \
            -f v4l2 -thread_queue_size 8192 \
            -input_format yuyv422 -video_size 640x480 \
            -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 -af "volume=5dB" \
            -f flv rtmp://YOUR_SERVER_URL/YOUR_KEY > /dev/null 2>&1 </dev/null &
    
    ※Musicディレクトリに保存するMP3ファイルのフォーマットはすべて同じにしてください。


    また、「~./Music」ディレクトリの音楽ファイルを指定回数ループ(以下では10回)させる場合は、以下の「緑の部分のコード」の通りスクリプトを変更してください。
    #!/bin/bash
    NUM=`ps aux | grep ffmpeg | grep -v grep | wc -l`
    if [ $NUM -gt 0 ]; then
            echo "Already running."
            exit
    fi
    ffmpeg \
            -re -f concat -thread_queue_size 8192 \
            -safe 0 -i <(for i in {1..10};do for file in ~/Music/*.mp3 ; \
                    do echo file "$file" ; done; done) \
            -f v4l2 -thread_queue_size 8192 \
            -input_format yuyv422 -video_size 640x480 \
            -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 -af "volume=5dB" \
            -f flv rtmp://YOUR_SERVER_URL/YOUR_KEY > /dev/null 2>&1 </dev/null &
    


    さらに、ランダム再生する場合は、以下の「緑の部分のコード」の通りスクリプトを変更してください。
    #!/bin/bash
    NUM=`ps aux | grep ffmpeg | grep -v grep | wc -l`
    if [ $NUM -gt 0 ]; then
            echo "Already running."
            exit
    fi
    ffmpeg \
            -re -f concat -thread_queue_size 8192 \
            -safe 0 -i <(for i in {1..10};do for file in \
                    `ls ~/Music/*.mp3|sort -R` ; \
                    do echo file "$file" ; done; done) \
            -f v4l2 -thread_queue_size 8192 \
            -input_format yuyv422 -video_size 640x480 \
            -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 -af "volume=5dB" \
            -f flv rtmp://YOUR_SERVER_URL/YOUR_KEY > /dev/null 2>&1 </dev/null &
    


    次に、終了スクリプトを作成します。
    pi@raspberrypi:~ $ vi ~/scripts/streaming-stop-youtube.sh[ENTER]
    
    以下の通り編集します。
    #!/bin/bash
    sudo killall -INT ffmpeg
    


    作成したスクリプトに実行権を付与します。
    pi@raspberrypi:~ $ chmod +x ~/scripts/streaming-*-youtube.sh[ENTER]
    

    以上でストリーミングのスクリプトは完成です。


    3. Raspberry PiからYoutubeLiveに配信

    それでは、Raspberry PiからYoutubeLiveに配信します。

    コンソールから、先ほど作ったYoutube配信用のスクリプトを以下の通り実行します。
    pi@raspberrypi:~ $ ~/scripts/streaming-start-youtube.sh[ENTER]
    pi@raspberrypi:~ $ 
    

    すると、以下の通りYoutubeストリーミングの待ち受け画面に、リアルタイム(数秒過去の動画になります)の動画が表示され、ページ右上に「ライブ配信を開始」ボタンが青く表示されます。
    これでYoutubeLiveでの生配信準備完了です。

    「ライブ配信を開始」ボタンを押すと生動画配信開始です。なお、「公開」の設定の場合は、世界に生放送されますので、心してクリックしてください。


    なお、配信を停止する場合は、以下の通り停止用のスクリプトを実行してください。
    pi@raspberrypi:~ $ ~/scripts/streaming-stop-youtube.sh[ENTER]
    pi@raspberrypi:~ $ 
    



    最後に、YoutubeのストリームURLと、ストリームキーは、ライブ配信ごとに変わる可能性がありますので、都度確認してスクリプトは修正してください。