(第1回) カメラモジュールとUSBマイクを接続して配信
最近、車に取り付けているドライブレコーダーの映像をPCに取り込んでTwitterやYouTubeに公開しています。ある日、これをお手軽にライブ配信できから面白いなというところから、手元のラズパイを活用できないか考えて実験してみました。
配信環境
今回の配信環境は以下の図のようになっています。ラズパイにカメラとUSBマイクを接続し、別途PCからYouTubeのストリーミング配信の開始と、ラズパイを操作してYouTubeへストリーミングデータの送信を行います。インターネットやノートPCとラズパイの接続は、スマホのテザリングを使用しました。
各ハードウェアの内容は以下のようになっています。
アイテム | 用途 |
---|---|
ノートPC | YouTubeの配信開始操作およびRaspberry Piの操作 |
Raspberry Pi 4 | カメラと音声の取り込みおよびエンコード、YouTubeへデータ送信 |
Raspberry Piカメラモジュール V2 | 映像の取得 |
USBマイク | 音声の取得 |
スマートフォン | インターネット、ノートPCおよびRaspberry Piの接続 |
モバイルバッテリー | Raspberry Pi用の電源 |
Raspberry Piの設定
ラズパイでは、接続したカメラからの映像とUSBマイクからの音声を取り込み、エンコードしてYouTubeのエンドポイントURLに送信する必要があります。以下は、ラズパイの処理をブロック図化したものです。これらの処理を行うために、ラズパイをセットアップする必要がありますので、手順を紹介します。
カメラの有効化等
ラズパイ本体に対して、以下のハードウェア系設定を行います。コマンドを実行するとメニューが表示されますので、それに従って適宜設定してください。
- カメラの有効化
- SSHの有効化
- 無線LANの設定 (スマホのテザリング接続)
$ sudo raspi-config
エンコーダのインストール
カメラから取り込んだ映像とUSBマイクから取り込んだ音声をエンコードしてYouTubeへ送信するためのエンコーダをインストールします。
$ sudo apt install ffmpeg
音声入力のレベル設定
USBマイクをラズパイに接続し、ラズパイが認識しているUSBマイクのサウンドカード番号を確認してボリュームを調整します。
まずはUSBマイクのサウンドカード番号を確認します。
$ cat /proc/asound/cards
0 [Headphones ]: bcm2835_headphonbcm2835 Headphones - bcm2835 Headphones
bcm2835 Headphones
1 [Microphone ]: USB-Audio - AVerMedia AM310 USB Microphone
AVerMedia AM310 USB Microphone at usb-0000:01:00.0-1.1,
full speed
私の環境では、0番がラズパイ内蔵の音声出力、1番が接続したUSBマイクでした。
次に、確認したサウンドカード番号を指定してボリュームの調整を行います。
$ alsamixer -c 1 -V capture
今回指定したコマンドオプションについて、内容を以下にまとめます。
オプション | 内容 |
---|---|
-c | サウンドカード番号。 |
-V | 再生 (Playback) または録音 (Capture) を指定 |
YouTubeの設定
YouTubeでライブ配信を行うには、Googleアカウントの取得とYouTubeのチャンネル開設およびストリームキーの取得が必要です。
Googleアカウントをまだ取得していない場合は、Google公式のヘルプに従ってアカウントを作成しましょう。メインのGoogleアカウントを本名で登録している等、別名のアカウントにしたい場合は「サブアカウントを作成して管理する」を参考に別アカウント (ブランドアカウントともいいます) を作成し、ログインしておきます。
次に、YouTubeの配信チャンネルを作成します。
最後に、ライブ配信を有効にします。ライブ配信の有効化は申請後24時間かかるため、はやめにやっておきましょう。一度有効化されれば、次回から有効化を再度行う必要はありません。
配信開始
ラズパイとYouTubeの設定ができたら、いざ配信を開始します。
まずはYouTube Studioのライブ配信ページにアクセスします。事前のYouTube設定でライブ配信を有効にした際にもアクセスしたページで、ライブ配信が既に有効化されていればそこがライブ配信ページになっているはずです。
ライブ配信の設定
ラズパイからYouTubeにライブ配信を行うにあたり、固有のエンドポイントURLへストリーミングデータを送信する必要があります。そのURLの固有部分にあたるのが、ストリームURLとストリームキーです。真ん中のあたりに「ストリームキー (エンコーダーに貼り付け)」という項目がありますので、「コピー」をクリックして内容をコピーし、別途テキストエディタ等にペーストしてメモします。
そのほか、配信の公開設定などもこのタイミングで行っておきます。初めてのテスト配信であれば「限定公開」や「非公開」を選択するのが無難でしょう。
Raspberry Piからストリーミングデータ送信
ラズパイに以下のコマンドを入力し、Youtubeへストリーミングデータの送信を開始します。(コマンドが長いので "\" を使用して複数行に分割しています)
無事にデータの送信が行われていれば、10秒程度の遅延の後にYouTube Studio側でカメラの映像が映し出されるはずです。
$ raspivid -w 1920 -h 1080 -fps 30 -o - -t 0 -b 2500000 | \
ffmpeg -f alsa -ac 1 -ar 44100 -thread_queue_size 1024 -i hw:1 \
-f h264 -r 30000/1001 -thread_queue_size 8192 -i - \
-c:v copy -c:a aac -ar 44.1k -b:a 128k -g 60 -s 1920x1080 -threads 2 \
-f flv rtmp://a.rtmp.youtube.com/live2/(ストリームキー)
上記コマンドは、まず raspivid
でカメラモジュールから映像を取得し、それをパイプ ("|") で ffmpeg
のエンコーダへ渡し、音声データと合わせてエンコードしてYouTubeのエンドポイントURLに送信しています。
オプション | 内容 |
---|---|
-w 1920 | 横幅 |
-h 1080 | 立幅 |
-fps 30 | フレームレート。30指定だがカメラは29.97fpsで送信してくる |
-o - | 出力先。「-」で標準出力 (パイプ渡しのため) |
-t 0 | 取り込み時間。0で時間制限なし |
-b 2500000 | ビットレート。2.5Mbps指定 |
オプション | 内容 |
---|---|
-f alsa | 入力音声フォーマット。オーディオにalsaを指定 |
-ac 1 | 入力音声チャンネル数。1はモノラル、2はステレオ |
-ar 44100 | 入力音声サンプリングレート。CD音質は44.1kHz |
-thread_queue_size | 入力音声の取り込みデータを処理するためのキューサイズ |
-i hw:1 | 入力パス。hw:1でハードウェアのサウンドカード番号1を指定 |
-f h264 | 入力映像フォーマット。カメラモジュールから渡されるH.264形式を指定 |
-r 30000/1001 | 入力映像フレームレート。29.97fpsは30000/1001の分数で指定する |
-thread_queue_size | 入力映像の取り込みデータを処理するためのキューサイズ |
-i - | 入力パス。「-」で標準入力 (raspividからのパイプ渡し) を指定 |
-c:v copy | 出力映像コーデック。copyでストリーム (raspividから受け取ったデータ) のコピーを指定 |
-c:a aac | 出力音声コーデック。aacを指定 |
-ar 44.1k | 出力音声サンプリングレート。CD音質は44.1kHz |
-b:a 128k | 出力音声ビットレート。YouTubeは128Kbps以上を推奨 |
-g 60 | 出力映像のGOPサイズ。YouTubeはGOPサイズを2秒以内にする必要があるため、30fps×2秒=60フレームを指定 |
-s 1920x1080 | 出力映像サイズ。横x縦の形式で指定する |
-threads 2 | エンコード処理を行う際のスレッド数。通常はCPUのコア数以下にする。Raspberry Pi 4のCPUは4コア4スレッドなので、4にしても良い |
-f flv | 出力フォーマット。flv形式とする |
rtmp://… | 出力先。ここにストリームキーを指定する |
配信終了
配信の終了は、ラズパイ側で実行中のコマンドをCtrl+Cで終了させ、さらにYouTube Studio側で「配信の終了」ボタンをクリックすることで行います。順序が逆でも問題ありません。
配信してみての感想
さすがラズパイ、簡単な設定であっさりライブ配信環境を作ることができました。これを車に積んで実際に1時間程度の車載映像配信を行ってみたところ、色々と気になる箇所が出てきたので以下にまとめておきます。
- 意外と省電力
車のシガーソケットに挿したUSBカーチャージャーだとエンジンのオンオフでラズパイへの電源供給が途切れてしまうため、別途モバイルバッテリーから給電しました。1時間程度の使用ではほとんどバッテリーの残量が減っておらず、ラズパイの電力効率の良さを感じました。 - カメラモジュールの性能はまあまあ
Raspberry PiカメラモジュールV2はフルHD (1920×1080) の30fpsをサポートしており、夜間の撮影も通常のドライブレコーダーと同じくらいには映ります。欲を言えばHDR撮影機能があって暗所も鮮明に表示されると良いのですが、それはさすがに贅沢ですね。 - カメラモジュールの固定がやっかい
カメラモジュールはフラットケーブルでラズパイと接続されていますが、モジュールが軽すぎるためフラットケーブルの剛性に負けてうまく固定することが難しいです。仕方ないので、テープで貼って固定しました。 - カメラモジュールのピント合わせがやっかい
上記の画像を見ていただくとわかるように、残念ながらピントが合っていなくてボケています。Raspberry PiカメラモジュールV2はピンホールの単焦点レンズであるため、焦点をカメラモジュールに付属の白い治具でレンズ部分を回して合わせる必要があるのですが、これがなかなか合わないし確認がしづらいです。一度合わせてしまえばそのまま使い続けられると思いますが、今回は失敗してしまいました。 - いちいちSSH接続するのがめんどう
ラズパイでストリーミング配信を開始するために、別途ノートPCからラズパイにSSH接続を行いコマンドを入力します。車内など屋外の限られた空間でノートPCを広げてコマンドを打つのは、かなり面倒です。ラズパイにタッチセンサー付きのディスプレイを接続して、そこから操作できると良いですね。 - いちいちYouTube Studioにアクセスするのがめんどう
これはラズパイの問題ではありませんが、YouTubeでライブ配信を開始するためにノートPCからYouTube Studioの配信ページにアクセスしてページを表示し続けるのはかなり面倒です。YouTubeには指定URLを叩くと配信開始するライブストリーミングAPIが用意されているので、それを使えるようになれば便利そうです。
このままではノートPCにWEBカメラを接続したほうが楽じゃないかという事になってしまうので、これらの問題を解決する方法を検討中です。
参考URL
ラズパイとカメラモジュールで配信を行う際に、以下のサイトを参考にしました。ありがとうございました。
コメント
ラズパイ初心者の河合と申します。
Raspberry Pi4、Raspberry Pi Camera B01(https://www.amazon.co.jp/dp/B083XDJ8SP/ref=cm_sw_em_r_mt_dp_Rg0SFbW75X383?_encoding=UTF8&psc=1)でyoutube配信をしたくて検索をして、こちらのWEBにたどり着きました。ご指摘の通りすすめたら、配信が実現できたので嬉しく思います。記事を作成してくださり、ありがとうございます!
さて、そこでご存知であれば教えていただきたい事が1点ございます。
ライブ配信中は、配信中のカメラ映像が全画面表示されます。この全画面を解除して、ほかのアプリケーションを使う事はできないでしょうか。
配信しながら、そのメモをとったり、ブラウザでの操作ができたらいいなと思っています。
試したこと。
1.TeamviewerでRaspberrypiをリモート操作し、こちらのWEB記載の方法でyoutubeライブ配信をすると。。
1-1:Raspberry Piから直接HDMI出力しているディスプレイに、全画面でカメラの動画が表示される。
1-2A:TeamViewerで見ているRaspberryPiのデスクトップには、カメラ動画の表示は一切無い。ただし、youtubeのライブ配信は成功している。
2.Alt+tabでのアプリ切り替えショートカット 上記の1-2では最前面のアプリ切り替えができました。ただ、1-1のカメラ全画面表示に対しては何も効力がありませんでした。
これから試してみる案
3.dual displayにすると、1画面は全画面のカメラ映像、もう1画面はデスクトップが見えたら良いな。。。
以上、解決策やヒントでもご教示いただければ幸いです。
はじめまして。
私のRaspberry Pi 4にはディスプレイがついていないので、状況の再現ができず詳しくはわかりません。お役に立てずすみません……。
仰る通り、デュアルディスプレイならデスクトップが見えるかもしれませんね。