Raspberry Pi でストリーミング配信を行う方法

# はじめに
本記事はRaspberry Piでストリーミング配信を行う方法について記載しています。

ストリーミング配信を行うことで、映像や音声をリアルタイムで他のデバイスに配信することが可能です。

Raspberry Piを活用して手軽にストリーミング環境を構築したい方の参考になれば幸いです。

## ストリーミング配信
ストリーミング配信を行うにあたりRaspberry Piとカメラモジュールを接続します。

本記事では、Raspberry Pi 4 Model Bと、Raspberry Pi PiNoir カメラモジュール V2.1を使用しています。

### カメラモジュールの接続
Raspberry Piとカメラモジュールを接続するには、カメラモジュールをCamera Serial Interface（CSI）端子に接続します。

接続する際は、フィルムケーブルの端子側をHDMI端子側に向けてしっかりと奥まで差しこみます。

![写真 2025-05-25 18 59 13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/7065f616-d2f4-4971-a7da-529fbff1ed1b.jpeg)


カメラモジュールが正しく接続されて認識できていることを確認するためには、以下のコマンドを実行します。

`$ libcamera-hello`

上記コマンドを実行すると、プレビューが5秒間表示されます。`-t 0`オプションを使用すると、時間制限なしで表示します。

### 使用するツール
ストリーミング配信を行うにためには、libcameraとVLCについての基本的な理解が必要です。

[**libcamera**](https://libcamera.org/)は、従来のLinuxディストリビューション、ChromeOS、AndroidなどのLinuxベースのシステムで動作する組み込みカメラ用のオープンソースです。

libcameraは直感的なAPIを提供するとともに、信頼性の低いベンダーコードをオープンソースのコア部分から分離することにより、組み込みカメラハードウェアにおける複雑な制御を簡素化することを目指しています。

::: note
Raspberry Pi OS Bullseye以降、カメラドライバは従来のraspistillやPicameraからlibcameraに置き換えられました。従ってより柔軟で標準化されたカメラ制御が可能となりました。
:::

[**vlc**](https://www.videolan.org/)は「Video LAN Client」の略称であり、フランスの非営利組織であるVideoLANプロジェクトの一部として開発されているマルチメディアプレーヤーです。

![スクリーンショット 2025-05-25 19.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/64e71d0b-2df5-4414-a0dd-09d1cd2c39d0.png)

再生機能をはじめ、映像や音声のリアルタイム配信にも対応しているため、Raspberry Pi上でlibcameraと組み合わせることで、取得したカメラ映像をネットワーク越しに配信する仕組みを実現できます。

### 実践
`libcamera-vid`コマンドを用いて、Raspberry Piのカメラ映像を動画として出力することができます。

以下のコマンドを実行すると、libcameraがカメラ映像の取得を開始し、映像をTCPストリームとして `127.0.0.1:8888`で待ち受ける状態になります。

`$ libcamera-vid -t 0 --inline --listen -o tcp://127.0.0.1:8888`
ます。

オプションについて`-t 0`は時間制限なし、`--inline`はH.264ストリームをインライン形式で出力します。また、`--listen`はクライアントからの接続を受け付けるための設定で、`-o`で出力するインターフェースを設定します。

上記コマンド実行後、VLCメディアプレーヤーから接続可能です。以下はMacのVLCで接続する例です。

ファイルより「ネットワークを開く」を選択します。

![スクリーンショット 2025-05-25 19.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/0181dbb7-0c92-4d7c-a624-dc14abad2fda.png)

URLに、`tcp/h264://[Host]:8888`を入力して「開く」を押します。

![スクリーンショット 2025-05-25 19.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e71b750c-bde0-4fe1-b979-d3aa794b12f2.png)

プレイリストに表示されるので選択して再生します。

![スクリーンショット 2025-05-25 19.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/714fc197-5983-4987-bb68-9e56812b7e62.png)

その後ウィンドウが開き映像を出力します。なお、TCP接続の場合、同時に接続できるデバイスは1台のみです。

![スクリーンショット 2025-05-25 19.34.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/8f4690c3-b8f2-4cfc-87de-0ada41ae91d9.png)

複数のデバイスを接続したい場合は、`cvlc`コマンドを使用すること同時視聴が可能です。

先に`libcamera-vid`コマンドを実行し、接続が行える状態になったら`cvlc`コマンドを実行します。

`$ libcamera-vid -t 0 --inline --listen -o tcp://127.0.0.1:8888 &`
`$ cvlc tcp/h264://127.0.0.1:8888 --sout '#standard{access=http,mux=ts,dst=:8080}' --no-sout-all --sout-keep`

vlcはiPhoneのアプリがあるので、iPhoneのアプリから同時接続を行います。

iPhoneのアプリで接続する際は、同様に「ネットワークストリームを開く」を選択します。

![写真 2025-05-25 19 45 28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/331aa8d5-108e-4e71-8c95-cc21529fe059.png)

URLを入力して「ネットワークストリームを開く」を押します。

![写真 2025-05-25 19 51 27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/c5f2ee9b-ff09-4791-846e-507ca348a482.png)

映像が出力されます。

![写真 2025-05-25 19 53 37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/deedd896-88e7-40bc-bccf-8cf37b2c48f6.png)

::: note
ホワイトバランスを調整したい場合は、`libcamera-vid`コマンドに`--awb <mode>`オプションを付与して実行します。

例えば、曇り空の場合は`--awb cloudy`オプションを付与します。また、細かく調整したい場合は`--awbgains R,G`オプションを使用することで、R及びGのゲインを調整できます。

例：`--awbgains 1.5,1.2`
:::

# おわりに
Raspberry Piを使用したストリーミング配信は、ペットの見守りや子供の見守りなど、さまざまな場面で手軽に活用できます。

低コストかつコンパクトなため、自宅やオフィスでの映像監視システムとしても非常に便利です。

## 参考
- [Camera software](https://www.raspberrypi.com/documentation/computers/camera_software.html)
- [Raspberry Pi Camera Module: More on video capture](https://www.raspberrypi.com/news/raspberry-pi-camera-module-more-on-video-capture/)