ラズパイカメラでGStreamerを使ったライブストリーミング【HLS】

この記事では、Raspberry Pi(ラズパイ)に取り付けたカメラで撮影した映像を、リアルタイムで外部のブラウザから確認できるようなストリーミングサーバーの構築を行っていく。

具体的には、GStreamerを使ってRaspberry PiからHTTP Live Streaming(HLS)で配信できるようにする。配信といってもYouTube Liveやニコ生配信ではなく、あくまでもローカルエリア内でのストリーミングとなる。なお、Raspberry Piでカメラを使えるようにするまでの設定は済んでいるものとして、この記事では説明を省略する。

カメラモジュールの設定方法はこちらの記事を参考に

ニコ生などへ配信したい場合はこちら

HiLetgo OV5647 5MP Raspberry Pi  カメラ OV5647 HDカメラモジュール
HiLetgo OV5647 5MP Raspberry Pi カメラ OV5647 HDカメラモジュール
Amazon

ラズパイの準備

はじめに重要なお知らせ!

実は、GStreamerでライブストリーミングをやってみたところ、AndroidのChromeからのみでしか動画再生できなかった。MacのVLCアプリを使えば動画の再生ができたが、その辺りを踏まえた上で先を読み進めていって欲しい。

今回やった動画再生の結果。

OSブラウザ再生可否
MacSafari
MacChrome
iOSSafari
iOSSafari
AndroidChrome

FFmpegを使った変換だともう少しましな結果になったので、よかたら参考にして欲しい。

FFmpegバージョンはこちら

HLSのブラウザ対応状況

HLSのブラウザ対応状況を調べてみると、MacのChromeではHLS再生にデフォルト対応していないことがわかった。

HLSの対応状況
HLSの対応状況

環境

項目バージョン
ラズパイRaspberry Pi3 Model B+
カメラモジュールOV5647
OSRaspbian 9.13
Python2.7.13/3.7.0

パッケージを更新

次へ進む前に、Raspberry Piを最新状態にしておくことをオススメする。ただし$ sudo apt updateはOSもアップデートするため、時間がかかるが気長に待とう。

$ sudo apt update
$ sudo apt upgrade

ラズパイ用カメラモジュール

HiLetgo OV5647 5MP Raspberry Pi  カメラ OV5647 HDカメラモジュール
HiLetgo OV5647 5MP Raspberry Pi カメラ OV5647 HDカメラモジュール
Amazon

用途によってはケースに入った製品の方が使い勝手がよいかもしれない。

For raspberry pi カメラモジュール 5MP 感光チップOV5647センサー
For raspberry pi カメラモジュール 5MP 感光チップOV5647センサー
Amazon

また、ズーム機能付だったり、赤外線で夜間も撮影できるカメラモジュールもある。

Kuman カメラモジュール Raspberry Pi用 日中/夜間モード ズームレンズ
Kuman カメラモジュール Raspberry Pi用 日中/夜間モード ズームレンズ
Amazon
Kuman カメラモジュール Raspberry Pi用 夜間 赤外線可視 ラズベリーパイ
Kuman カメラモジュール Raspberry Pi用 夜間 赤外線可視 ラズベリーパイ
Amazon

動画など重い処理をラズパイで行う場合、CPUが発熱して本体が壊れる恐れがある。ヒートシンクや放熱性のあるケースに入れて必ず熱対策をしよう。

過去にラズパイを壊してしまったことがある。

Geekworm Raspberry Pi4 B 用アーマー金属ケース パッシブ冷却/シェル熱放散(ファン無し)
Geekworm Raspberry Pi4 B 用アーマー金属ケース パッシブ冷却/シェル熱放散(ファン無し)
Amazon
最新 Raspberry Pi 4 ケース, 超薄型アルミニウム合金ケース+ヒートシンク+ 35x35x10 冷却大超静音ファン
最新 Raspberry Pi 4 ケース, 超薄型アルミニウム合金ケース+ヒートシンク+ 35x35x10 冷却大超静音ファン
Amazon

カメラモジュールを/dev/video0として認識させる

まず、カメラモジュール(OV5647)を /dev/video0 として認識させておく必要がある。

$ v4l2-ctl --list-devices
Failed to open /dev/video0: No such file or directory

上のエラーが出ないようにするためには、 $ sudo vi /etc/modules を実行し、次の一行を追記して、Raspberry Piを再起動しておく。

bcm2835-v4l2

再び $ v4l2-ctl --list-devices を実行すると、次のように表示されカメラモジュールが/dev/video0 にマウントされていることがわかる。

bcm2835-codec (platform:bcm2835-codec):
	/dev/video10
	/dev/video11
	/dev/video12

mmal service 16.1 (platform:bcm2835-v4l2):
	/dev/video0

GStreamerを使えるようにする

GStreamerのインストール

次の2つのコマンドを順番に実行して、GSrtreamerをRaspberry Piへインストールする。もしもインストールできなかった場合は、前に戻ってRaspberry Piを最新状態にしてからやるとうまくいく。

$ sudo apt install autoconf automake libtool
$ sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-bad

GStreamerの動作確認

適当なディレクトリを作って移動し、下記コマンドを実行して、.m3u8.ts ファイルを作成してみよう。

$ sudo gst-launch-1.0 -v -e v4l2src device=/dev/video0 \
 ! video/x-h264,width=640,height=480,framerate=15/1 \
 ! h264parse ! mpegtsmux \
 ! hlssink max-files=8 target-duration=5 \
 location=./segment%05d.ts \
 playlist-location=stream.m3u8 \
 playlist-root=./

しばらくしてから ctrl + c でシェルを終了する。設定がうまくできていれば、次のように.m3u8.ts ファイルが作成されるはず。ただし動画をh264に変換するときは、ソフトウェアエンコードでやっている。

$ ls
stream.m3u8  segment00000.ts  segment00001.ts

「.m3u8」と「.ts」ファイルの内容

.m3u8ファイルは、.tsファイルのパスを記述しておくテキストファイルだ。

$ cat output.m3u8 
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:9

#EXTINF:8.6319570541381836,
./segment00000.ts
#EXTINF:6.2347087860107422,
./segment00001.ts

そして.tsファイルは、トランスポートストリームファイルと呼び、映像や音声データが含まれているファイルだ。これらのファイルを順番にクライアントマシンへ送ることでHLSを実現している。

HLSでストリーミングサーバー

PythonでWebサーバーを立ち上げる

Pythonなら簡単にWebサーバーが作れる。次のプログラムで、外部からwwwディレクトリへアクセスできるようにした。プログラムをPython3で実行すると、パソコンなどのブラウザから http://<ラズパイのIPアドレス>:5555 へアクセスできるようになる。

from http.server import HTTPServer, SimpleHTTPRequestHandler
import os
import ipget # $ sudo pip3 install ipget==0.0.3


os.chdir("./www")
a = ipget.ipget()
ip, bit = a.ipaddr("eth0").split('/')
port = 5555

httpd = HTTPServer(('', port), SimpleHTTPRequestHandler)
print('HTTPServer began -> http://{}:{}'.format(ip, port))
httpd.serve_forever()

「.m3u8」と「.ts」ファイルの作成

ストリーミングサーバーの構築といっても基本は「.m3u8」と「.ts」ファイルを作れば良いだけ。www ディレクトリへ移動し、stream ディレクトリを作成し、次のコマンドを実行して動画ファイルを作成した。

$ sudo gst-launch-1.0 -v -e v4l2src device=/dev/video0 \
 ! video/x-h264,width=640,height=480 \
 ! h264parse ! mpegtsmux \
 ! hlssink max-files=8 target-duration=5 \
 location=/home/pi/Streaming/www/stream/segment%05d.ts \
 playlist-location=/home/pi/Streaming/www/stream.m3u8 \
 playlist-root=http://192.168.100.103:5555/stream/

階層はこんな感じ。

$ pwd
/home/pi/Streaming

$ tree
.
|-- server.py
`-- www
    |-- item_apps.html
    |-- stream
    |   |-- segment00009.ts
    |   |-- segment00010.ts
    |   |-- segment00011.ts
    |   |-- segment00012.ts
    |   |-- segment00013.ts
    |   |-- segment00014.ts
    |   |-- segment00015.ts
    |   `-- segment00016.ts
    `-- stream.m3u8

HTML5のVideoタグでHTSを再生

作成した「.m3u8」と「.ts」ファイルを再生するには、HTML5のVideoタグを使えば良い。次のhtmlを作成して、ブラウザからラズパイへアクセスしてみよう。ただし、最初にも述べた通り、残念ながらAndroid以外のブラウザからは動画の再生ができなかった。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>HTTP Live Streaming Test</title>
  </head>
  <body>
      <h1>HTTP Live Streaming Test</h1>
      <video width="640" 
             height="360" 
             src="stream.m3u8" 
             preload="none" 
             onclick="this.play()" 
             controls />
  </body>
</html>

FFmpegバージョンも参考に

HiLetgo OV5647 5MP Raspberry Pi  カメラ OV5647 HDカメラモジュール
HiLetgo OV5647 5MP Raspberry Pi カメラ OV5647 HDカメラモジュール
Amazon

ネットワークカメラが人気!

【2020バージョンアップ400万画素】COOAU ネットワークカメラ ペット老人見守りカメラ
【2020バージョンアップ400万画素】COOAU ネットワークカメラ ペット老人見守りカメラ
Amazon
Wansview ネットワークカメラ 1080P 200万画素 ベイビーモニター WiFi IPカメラ ワイヤレス屋内防犯カメラ
Wansview ネットワークカメラ 1080P 200万画素 ベイビーモニター WiFi IPカメラ ワイヤレス屋内防犯カメラ
Amazon

人気のラズパイ

Raspberry Pi 4 Model B 8GB 技適マーク入 正規品!ラズベリーパイ4 モデルB
Raspberry Pi 4 Model B 8GB 技適マーク入 正規品!ラズベリーパイ4 モデルB
Amazon
TRASKIT Raspberry Pi 4 Model B Starter Kit
TRASKIT Raspberry Pi 4 Model B Starter Kit
Amazon
Raspberry Pi Zero W - ヘッダー ハンダ付け済み
Raspberry Pi Zero W - ヘッダー ハンダ付け済み
Amazon

人気のラズパイ周辺機器

10 インチRaspberry Pi用タッチモニター EleDuino HDMI モバイルディスプレイ
10 インチRaspberry Pi用タッチモニター EleDuino HDMI モバイルディスプレイ
Amazon
Raspberry Pi4 Model B /アルミニウム金属ケース/ファンレス/放熱シート付き
Raspberry Pi4 Model B /アルミニウム金属ケース/ファンレス/放熱シート付き
Amazon
Freenove Raspberry Pi 4 B 3 B+ 400用の究極のスターターキット
Freenove Raspberry Pi 4 B 3 B+ 400用の究極のスターターキット
Amazon
KEYESTUDIO DC 5V 4チャンネル リレーシールドモジュール 拡張ボード for Raspberry Pi
KEYESTUDIO DC 5V 4チャンネル リレーシールドモジュール 拡張ボード for Raspberry Pi
Amazon

Raspberry Piのオススメ入門書

Raspberry Piクックブック 第3版 (Make:PROJECTS)
Raspberry Piクックブック 第3版 (Make:PROJECTS)
Amazon
これ1冊でできる! ラズベリー・パイ 超入門 改訂第6版 Raspberry Pi 4/Zero W対応
これ1冊でできる! ラズベリー・パイ 超入門 改訂第6版 Raspberry Pi 4/Zero W対応
KindleAmazon
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero W対応
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero W対応
KindleAmazon
記事に関するご質問などがあれば、ぜひTwitterへお返事ください。