Adroid の Camera2 API と MediaCodec を使って カメラの画像をH264形式で転送する
の続きです。
概要
前回の記事では、カメラの画像をH264形式で転送した。
今回は、下図のように Android 端末を サーバーにして、RTSP で配信する。
クライアントアプリとしてVLC を使用する。
VLCは、フリーなマルチプラットフォーム対応のマルチメディアプレイヤーです。
参考 VLC
RTSP
RTSP (Real Time Streaming Protocol) は、リアルタイムデータの配信を制御するためのプロトコルです。
リアルタイムデータ自体の配信は RTP (Real-time Transport Protocol) が使用される。
カメラの画像を RTSP で配信する
アプリは大きくRTSPサーバーとRTP配信の2つのブロックに分かれる。
RTP 配信は下図の構成となる。
カメラデバイス
- ImageReader
- ImageFormatConverter
- MediaCodec
- Packetizer
カメラデバイスからMediaCodecまでは前回のH264形式と同様です。
RTSPサーバーもRTP配信も、スクラッチから作るのは難儀です。
今回は、両方の機能を持つ libstream を使用する。
libstreaming は、RTP over UDPを使用して、Android端末のカメラやマイクをストリーミングできるAPIです。
libstream は旧来の Camera API 用にコーデングされているので、
Camera2API 向けに変更する。
RTSPサーバー
RTSP は RFC2326 により標準化されている。
配信を制御するためのメソッドが規定されている。
重要なのは SETUP とPLAY の2つ。
SETUPは、下記のように データを受信するクライアントのポートが指定されている。
SETUP rtsp://example.com/foo/bar/baz.rm RTSP/1.0
CSeq: 302
Transport: RTP/AVP;unicast;client_port=4588-4589
PLAY は配信の開始。
SETUPで配信を開始しても、運用上は支障ないようです。
libstream の実装はそうなっている。
PLAY rtsp://audio.example.com/audio RTSP/1.0
CSeq: 835
Session: 12345678
Range: npt=10-15
Packetizer
MediaCodec の出力をRTP形式に変換する。
RTP は、エンコードの種類毎に異なる形式が規定されている。
libstream には、H264とH263の2つ形式に対応した Packetizer が用意されている。
H264を使用する。
VLC で受信する
VLC をダウンロードする。
Android端末からのビデオストリームを受信する
メニューバーから ファイル -> ネットワークを開く
URL欄にプロトコルとAndroid端末のIPアドレスとポートを入力する
¥
画像の大きさ
画像の大きさによって、現象が異なる。
- SD Low quality( 176x144)
黒い画面になる
- QVGA (480x360x240)
黒い画面になる
- SD High quality ( 480x360)
緑の画面になる
-
VGA ( 640x 480 )
表示されるが、反応が遅い
カメラの向きを変えてもなかなか反映されない
10秒くらいかかる -
SVGA (800x600)
表示されるが、反応が遅い -
HD (1280x720)
表示されるが、反応が遅い
オーディオの同時配信
RTPでは、ビデオとオーディオの同時配信ができる。
libstream では、オーディオのエンコードは、MediaRecorderを使用している。
エンコードの種類により、
AMRNB と AAC の2種類が用意されている。
libstreamでデファルトになっている AMRNB を使用する。
reference : MediaRecorder.AudioEncoder
サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Camera223