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

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

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

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

ラズパイの準備

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

実は、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
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

Amazon
HiLetgo OV5647 5MP Raspberry Pi 3 カメラ OV5647 HDカメラモジュール Raspberry Pi に対応 A/B+/2 モデルB ケーブル
HiLetgo OV5647 5MP Raspberry Pi 3 カメラ OV5647 HDカメラモジュール Raspberry Pi に対応 A/B+/2 モデルB ケーブル

OV5647 Camera Module センサータイプ:OV5647色CMOS QSXGA(5メガピクセル) センサーサイズ:3.67*2.74mm(1/4インチフォーマット) ピクセル計算:2592*1944, ピクセルサイズ:1.4*1.4μm

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
    |-- apps_item.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 3 カメラ OV5647 HDカメラモジュール Raspberry Pi に対応 A/B+/2 モデルB ケーブル
HiLetgo OV5647 5MP Raspberry Pi 3 カメラ OV5647 HDカメラモジュール Raspberry Pi に対応 A/B+/2 モデルB ケーブル

OV5647 Camera Module センサータイプ:OV5647色CMOS QSXGA(5メガピクセル) センサーサイズ:3.67*2.74mm(1/4インチフォーマット) ピクセル計算:2592*1944, ピクセルサイズ:1.4*1.4μm

Amazon
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

Amazon
正規代理店商品 Raspberry Pi 4 Model B (8GB) made in UK element14製 技適マーク入
正規代理店商品 Raspberry Pi 4 Model B (8GB) made in UK element14製 技適マーク入

Amazon

Raspberry Piの参考書

Raspberry Pi クックブック 第2版 (Make:PROJECTS)
Raspberry Pi クックブック 第2版 (Make:PROJECTS)

本書は、全世界で多くのユーザーの支持を集めているマイコンボード「Raspberry Pi」を使いこなすためのレシピ集です。ハードウェアの基本、オペレーティングシステムの使い方、ネットワーク接続、Pythonプログラミングの基本を紹介した上デ、実際の作品製作に必要になる、高度なPythonプログラミング、GPIO(汎用入出力)、モーター、センサー、ディスプレイなどの使い方へと解説を進めていきます。

Amazon
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero/Zero W対応
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero/Zero W対応

本書ではRaspberry Pi Zero / Zero Wの概要から必要な周辺機器の説明、OSの導入やセットアップなどといった準備、そしてLinuxに初めて触れる人に向けてLinuxの基礎やシェルの操作などを解説しています。また、準備が整ったら実際に電子部品をRaspberry Pi Zero / Zero Wで制御する方法も解説しました。

KindleAmazon
Raspberry Pi ZeroによるIoT入門- Zero W 対応
Raspberry Pi ZeroによるIoT入門- Zero W 対応

本書は、大人から子供まで、初心者の方でも、ラズパイZeroとラズパイZero WをIoTのデバイスとして使いこなせるようになることを目的とした入門書です。また、ラズパイZeroとラズパイZero WをUSBケーブル1本でパソコンに接続できる便利な「Zero over USB」について、日本で初めて詳しく解説しました。

Amazon

最後まで読んでいただきありがとうございました。

「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。

今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓

あなたにおすすめ