ストリーミング比較
安永泰成
2024/07/16
初めに
どうも、ラズパイをちょこちょこ触っている安永です!!
今回はストリーミングについてまとめていこうと思います。早速いきましょう!!
mjpg-streamer
Linuxの端末に接続したカメラからMJPEGデータを生成してリアルタイムストリーミングを開始します。
私が使用していたのがこのストリーミングですね。
JPEGは聞いたことあるけど、MJPEGってどういうもの?となる方も多いと思います。
MJPEG(Motion JPEG)とは、動画を扱うために開発された圧縮形式の1つです。JPEGは静止画像用の圧縮形式でしたが、MJPEGは動画の各フレームをJPEGで圧縮することで、高品質な映像を保ちつつ、ファイルサイズを小さくすることができます[1]。
メリット
MJPEGは圧縮率を上げなくても高画質での 映像が得られます。さらに、MJPEGはエンコードとデコードの処理が単純であるため、ストリーミング配信などのリアルタイム性が求められる場面で優れたパフォーマンスを発揮します[1]。
MJPEGはリアルタイム配信を求める場合に有用、ということですね。実際、下の図1のようにかなり早いストリーミングが可能です。
また、mjpg-streamerはそれのみで配信、再生が可能で、比較的準備もしやすく、使用者も見やすいです。
デメリット
MJPEGで 圧縮された動画は、MPEGやH.264などのより効率的な動画 圧縮形式に比べてファイルサイズが大きくなる傾向があります。また、MJPEGはフレームごとに圧縮を行うため、動きの激しい映像を扱う場合には、画質や処理速度に影響を与えることがあります[1]。
車から外の様子を配信したり、人の往来を配信するような用途はあまり向かないということですね。
あとは映像配信であるため、音声がありません。そこは気を付けなくてはならないですね。
RTSPストリーミング
正式名称はReal Time Streaming Protocol。基本的にネットワークカメラから取得した映像を、ライブで表示する際にこのプロトコルを用いるものとなっています。
ちなみに、ネットワークカメラって、普通のカメラと具体的にどう違うのか知ってますか?
インターネットに接続してカメラに映像を映し出す「ネットワークカメラ(IPカメラ)」は、Wi-Fi環境さえ整っていれば、どこでも取り付けられるカメラです。
カメラ自体にIPアドレスが割り当てられ、スマホやタブレット端末へのメール転送機能が搭載されている機種がほとんどです[2]。
「WEBカメラ」とは、インターネットに接続できるカメラ全般を指します。例えばパソコンやスマホについているカメラもWEBカメラということになります。Wi-Fi接続して使用するネットワークカメラもWEBカメラの一種です。
WEBカメラには、USBケーブルをパソコンに接続して使用するものや、Wi-Fi環境が整っていなくても使用できるものもあります[2]。
簡単に分類するなら、パソコンとかに接続して撮影しているものを送ることができるのが「Webカメラ」、ネットに繋がっていればネットを経由して撮影しているものを送るのが「ネットワークカメラ」ですかね。厳密にいえば違うのでしょうが、今回の趣旨ではないので問題はないかと。
話が逸れました。では、ネットワークカメラでデータを送る!!ってのは問題ないわけです。じゃあ、このRTSPってのはどういうものなのかというと、映像、音声をリアルタイム配信として制御するものになります。
これを用いてストリーミングを行うのですが、RTSPでできるのはあくまでネットワークに映像などを送る、その制御までで、映像を再生するという部分はありません。
なのでクライアント側で映像を再生するために、VLCメディアプレイヤーを用いる必要があります。
そうして動かしてみると、下の図2のようになり、リアルタイムストリーミングという名前だけあり遅延は少ないです。
GStreamerによるHTTPストリーミング
オープンソースのマルチメディアアプリケーション開発用フレームワークです。
例えば、動画のストリーミング配信、複数の動画の合成、音楽のカラオケ化など、さまざまなことができます[3]。
対応しているのはLinuxのみならず、他のOSでも対応しています。
このGStreamerを用いて、HLS(HTTP Live Streaming)による配信ができるみたいです。
HLSは、動画ファイルを小さいダウンロード可能なHTTPファイルに分割して、HTTPプロトコルを使用して配信します。クライアントデバイスは、これらのHTTPファイルを読み込んで動画として再生します[4]。
HTTPでストリーミング配信ができるみたいですね。ではメリットは何でしょうか?
メリット
HLSの長所の1つは、インターネットに接続されたすべてのデバイスがHTTPをサポートしているので、特殊なサーバーを使用する必要があるストリーミングプロトコルに比べて実装が簡単であることです[4]。
一番最初に説明したMJPGストリーミングはサーバーを立てて、そこに接続することでストリーミング配信を確認できるようになっています。
HLSはHTTPにアクセスするだけで確認可能のため、それに比べて楽みたいですね。
もう1つの長所は、HLSストリームが再生を中断することなくネットワークの状態に応じて動画品質を上げたり下げたりすることができることです[4]。
ネットワークが良いと勝手にいい状態で映像を再生する、悪いと再生できない、というものですね。
しかし、実際に動かしてみると、図3のように遅延は数秒あり、先に説明した二つに比べると、リアルタイム配信ができているとは言い難いです。
FFmpegによるHTTPストリーミング
FFmpegは、オーペンソースでコマンドを入力またはバッチファイルとして実行するCUIプログラムです。
動画や音楽ファイルについて形式変換、カット・結合・BGM追加・音源抽出などちょっとした動画編集も対応できます[5]。
ということで、こちらもHLSによるストリーミングなのですが、使っているのがFFmpegとなります。
しかし図4からわかる通り、GSteamerと同様に数秒の遅延があります。
比較と終わりに
というわけで、いろいろなストリーミング配信の方法を纏めてきました。
今回纏めてみた結果としては
名前 |
遅延 |
音声 |
準備しやすさ |
使いやすさ |
mjpg-streamer |
〇 |
× |
〇 |
〇 |
RSTP |
〇 |
〇 |
〇 |
△ |
GStreamer |
△ |
〇 |
△ |
〇 |
FFmpeg |
△ |
〇 |
△ |
〇 |
という感じで、配信をするだけなら私はRSTPストリーミングを使うかな、という印象でした。
まあ用途に合った使われ方があるので、皆さんも使ってみる時はいろいろ試してみるのをオススメします!!
では今回はここで!!また会いましょう!!
参考文献