LoginSignup
7
8

More than 3 years have passed since last update.

Adroid の Camera2 API と MediaCodec を使って カメラの画像を RTSP で配信する

Last updated at Posted at 2019-10-19

Adroid の Camera2 API と MediaCodec を使って カメラの画像をH264形式で転送する

の続きです。

概要

前回の記事では、カメラの画像をH264形式で転送した。

今回は、下図のように Android 端末を サーバーにして、RTSP で配信する。

rtsp_system_overview.png

クライアントアプリとしてVLC を使用する。

VLCは、フリーなマルチプラットフォーム対応のマルチメディアプレイヤーです。

参考 VLC

RTSP

RTSP (Real Time Streaming Protocol) は、リアルタイムデータの配信を制御するためのプロトコルです。
リアルタイムデータ自体の配信は RTP (Real-time Transport Protocol) が使用される。

wikipedia : RTSP

wikipedia : RTP

カメラの画像を RTSP で配信する

アプリは大きくRTSPサーバーとRTP配信の2つのブロックに分かれる。

RTP 配信は下図の構成となる。

rtsp_app_overview.png

カメラデバイス
- ImageReader
- ImageFormatConverter
- MediaCodec
- Packetizer

カメラデバイスからMediaCodecまでは前回のH264形式と同様です。

RTSPサーバーもRTP配信も、スクラッチから作るのは難儀です。

今回は、両方の機能を持つ libstream を使用する。
libstreaming は、RTP over UDPを使用して、Android端末のカメラやマイクをストリーミングできるAPIです。

libstream は旧来の Camera API 用にコーデングされているので、
Camera2API 向けに変更する。

github : libstream

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

参考 RFC2326: RTSP

Packetizer

MediaCodec の出力をRTP形式に変換する。

RTP は、エンコードの種類毎に異なる形式が規定されている。
libstream には、H264とH263の2つ形式に対応した Packetizer が用意されている。
H264を使用する。

VLC で受信する

VLC をダウンロードする。

Download VLC

Android端末からのビデオストリームを受信する
メニューバーから ファイル -> ネットワークを開く
URL欄にプロトコルとAndroid端末のIPアドレスとポートを入力する

rtsp://IPアドレス:ポート/
vlc_on_mac_open_stream-2.png

画像の大きさ

画像の大きさによって、現象が異なる。

  • SD Low quality( 176x144)

黒い画面になる

vlc_on_mac_176x144.png

  • QVGA (480x360x240)

黒い画面になる

  • SD High quality ( 480x360)

緑の画面になる

vlc_on_mac_480x360.png

  • VGA ( 640x 480 )
    表示されるが、反応が遅い
    カメラの向きを変えてもなかなか反映されない
    10秒くらいかかる

  • SVGA (800x600)
    表示されるが、反応が遅い

  • HD (1280x720)
    表示されるが、反応が遅い

オーディオの同時配信

RTPでは、ビデオとオーディオの同時配信ができる。

libstream では、オーディオのエンコードは、MediaRecorderを使用している。

エンコードの種類により、
AMRNB と AAC の2種類が用意されている。
libstreamでデファルトになっている AMRNB を使用する。

wikipedia : AMRNB

wikipedia : AAC

reference : MediaRecorder.AudioEncoder

サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Camera223

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8