②RTSPと映像/音声の多重化(RTSP/RTP/MPEG2-TS)
前回の記事はこちら
はじめに
最近の防犯カメラは、ほとんどがネットワークカメラで、RTSP(Real Time Streaming Protocol) に対応しています。
そこで、今回作るシステムでも、USB接続のUVCカメラ(CSB Video Classカメラ)だけでなく、RTSP対応のネットワークカメラも使える構成を考えていきます。
ちなみに、ネットワークカメラというと、ONVIF(Open Network Video Interface Forum) 対応を謡っているものも多くあります。
ONVIFとは、カメラとの接続性を確保する為の規格で、実際の映像/音声の取得プロトコルには、ほとんどのカメラでRTSPが使用されています。
その為、ONVIF対応カメラでもほぼ問題なくRTSPで接続ができると思います。
RTSP/RTP
RTSP(Real Time Streaming Protocol) とは、カメラと受信器(録画サーバーなど)との間で、取得したい映像や音声の情報を伝達したり再生開始・停止を行ったりする制御用のプロトコルです。
通信の中身はHTTP同様、ASCII文字列ベースのプロトコルで、TCPでの通信です。
RTSPは、映像/音声の取得に必要な情報をやり取りするプロトコルであり、実際の映像/音声データの転送はRTSPではなく、RTP(Real-time Transport Protocol) というUDPベースのプロトコルを使用して行われます。
下図はRTSPで情報伝達をした後にRTPで通信を開始するまでのイメージ図です。
RTSPでは、まず最初に映像受信サーバー側から、カメラに対してTCPで接続し、映像/音声のフォーマット情報等を問い合わせた後 (DESCRIBE) 、受信ポート番号等を伝えます (SETUP) 。その後、開始の合図 (PLAY) を通知すると、SETUPで指定されたポート番号に対して、RTPで映像と音声が別々に送信されてくる形です。
今回作成するシステムでは、このRTSP対応カメラを使っていきますが、この時に考えなければいけいないのが、通信の方向です。
家の中に置いてあるRTSPカメラの映像を、直接クラウドサーバーに保存する為には、家の中のカメラに、クラウドサーバー側からTCPで接続できなければいけません。
しかし通常の環境では、外部からの通信はルータで拒否されるので、クラウドサーバーからカメラにTCP接続することができません。
ルータの設定でポートマッピングを行えば、クラウドサーバーからの通信をカメラまで届けることは可能ですが、ルータの設定を変更する必要があり、設置場所が限定されてしまいます。
そこで今回は、カメラと同じネットワーク内に、クラウドレコーダ という中継用のプログラムを配置することで、ルータの設定を変更することなく、クラウドサーバーに映像を保存する方法で作っていきます。
カメラとのRTSP接続は、同じ家庭内のネットワーク上にあるクラウドレコーダで行います。映像/音声も中継プログラムで受信し、クラウドレコーダ側からクラウドサーバーに映像をアップロードする形です。
この形であれば、インターネット通信が可能な環境であれば、ほぼ問題なくカメラ映像をクラウドサーバーに録画することができます。
RTPの映像/音声出力
実際に映像/音声御データを送信する RTP(Real-time Transport Protocol) は、RTPヘッダーと呼ばれる情報を付加したUDPパケットとして送信されます。
RTPヘッダーにはパケットのシーケンス番号やタイムスタンプが記述されており、受信側で送られてきたRTPパケットを元の映像/音声データに復元できるようになっています。
ちなみに、映像/音声データは、そのままのデータ形式ではなく、圧縮処理(Encode)を行ってデータ量を削減した状態で送られます。特に映像データはデータ量が大きいので圧縮処理は必須です。
最近の防犯カメラでは、映像はH.264かH.265形式、音声はG.711かAAC形式で圧縮されてるものが多いと思いますので、RTPで受信する映像/音声のデータも、H.264やAAC形式で圧縮されたままのデータになります。
多重化(Multiplex/Mux)
カメラから別々に送られてくる映像と音声ですが、一般的には映像と音声を別々に使用することはあまりなく、時間情報を合わせて一つのデータにまとめます。この処理を多重化(Multiplex/Mux) と呼びます。
いくつかの多重化方式がありますが、動画の場合はコンテナ形式で多重化することがほとんどです。
コンテナとは映像や音声、さらにその他の字幕情報なども含めて、時間情報を合わせた状態で一つのデータ(ファイル)にまとめる入れ物のようなものです。
具体的なコンテナの例としては、MP4(MPEG-4) やMOV(QuickTime Movie)、そして今回使用するMPEG2-TS(MPEG-2 Transport Stream) などがあります。
RTPで映像/音声別々に送られてくるRTPパケットには時間情報が付加されていますので、それを見て受信側でコンテナへの多重化処理を行い、1本のデータストリームにまとめます。
このコンテナへの多重化を行うことで、1つのデータストリームで、映像と音声を時間同期をとった状態で扱うことが可能になります。
今回作成するクラウドビデオレコーダでは、RTPで受信した映像/音声データをMPEG2-TSコンテナに多重化しますが、すでに映像/音声データはカメラ側でH.264やAACに圧縮されているので、圧縮を解く(Decode)ことなく、なるべくそのまま圧縮された状態で多重化します。
デコードせずに多重化することで、処理負荷が小さくなり、また、カメラ映像画質の劣化等も防げます。
多重化されたMPEG2-TSストリームは、指定された秒数のファイルとして区切ったうえで、AWSのS3にアップロードします。
このMPEG2-TSストリームを、指定した秒数で区切る処理で、MPEG2-TSの扱いやすさが効いてきます。
MPEG-2 Transport Stream
今回のシステムでは、HLS(HTTP Live Streaming) で映像の配信を行いますので、HLSの仕様で決められている動画コンテナの形式で保存する必要があります。
HLSでは、使用可能な動画コンテナの形式として、MPEG2-TS形式のほかに、フラグメント形式のMPEG-4も使用可能ですが、今回は扱いやすいMPEG2-TSの方を使用します。
MPEG2-TS(MPEG-2 Transport Stream) とは、多重化の為のコンテナ形式の一つで、映像や音声、文字などの情報を、時間情報を合わせて、1つの流れにまとめます。
日本の地上デジタル放送やBSデジタル放送を含む各国のデジタル放送規格で送信形式の一つとして採用されているほか、Blu-ray Discなどの記録形式の一つとしても採用されています。
MPEG2-TSでは、細切れに分割された映像や音声データに情報を追加した、188バイトのTSパケットという単位に構成され、一つのストリームとして多重化されます。
また、MPEG2-TSでは、再生に必要な情報は指定された秒数に必ず挿入される仕様になっている為、188バイト単位であれば、任意の場所で分断したとしても、再生時には(再生に必要な情報が集まれば)正常に再生することが可能です。
今回作成するクラウドレコーダでは、このMPEG2-TSの分割のしやすさを生かして、188バイトのTSパケット単位で処理を行うことで、指定秒数のMPEG2-TSファイルに分割してAWS S3にアップロードしたり、ライブビュー用のJPEGファイルを切り出したりしていきます。