📷

RTSPのクラアントライブラリ「rtsp-client-android」が良い感じ

2024/11/18に公開

はじめに

Androidアプリで実装する際、RTSPでストリーミングした映像を表示した時がありました。
表示を行うためのライブラリとして、

  • Exoplayer3
  • libvlc

が候補にあがります。
しかしどちらも使ってみると、徐々に遅延が目立ちはじめ映像が止まってしまう、といった不安定さがありました。
適切な設定をすれば遅延を減らせるのかもしれませんが、結局原因は分からずじまい。
その労力を省いて、さくっと良い感じにストリーミングしたいと考えていた矢先、Exoplayer3がベースになったラッパーライブラリ「rtsp-client-android」に出会いました。

https://github.com/alexeyvasilyev/rtsp-client-android

ライブラリの説明には、このように書かれており、

Lightweight RTSP client library for Android with almost zero lag video decoding (achieved 20 msec video decoding latency on some RTSP streams). Designed for lag criticial applications (e.g. video surveillance from drones, car rear view cameras, etc.).

遅延を極力減らせるような実装になっているとのことです。
実際に使ってみると、長時間動作させても止まることなく快適にストリーミングできるようになりました。こちらのライブラリは長期安定性に期待できます。

実装方法

基本は、リポジトリのReadMeに書かれていますが、バージョンによっては実装方法に差異があるので注意。
本記事では、v5.3.0を使用しています。また言語はJavaで実装方法を記述しています。

viewにはRtspSurfaceViewを使います。

<com.alexvas.rtsp.widget.RtspSurfaceView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/svVideo" />

基本的なストリーミング開始、終了、イベントリスナーの設定はこちらになります。

Uri uri = Uri.parse("rtsp://hogehoge");
String username = "hogehoge";
String password = "hogehoge";
String userAgent = "rtsp-client-library" // 最新のライブラリでは必要

rtspSurfaceView.init(uri, username, password, userAgent);
// ストリーミング開始
svVideo.start(
    requestVideo = true,
    requestAudio = true,
    requestApplication = false)
// イベントリスナーの設定
rtspSurfaceView.setStatusListener(rtspStatusListener);
// ストリーミング終了
svVideo.stop()

リスナーは下記のようになります。

RtspStatusListener rtspStatusListener = new RtspStatusListener() {
    @Override
    public void onRtspFrameSizeChanged(int i, int i1) {
    }

    @Override
    public void onRtspFirstFrameRendered() {
    }

    @Override
    public void onRtspStatusFailed(@Nullable String s) {
    }

    @Override
    public void onRtspStatusFailedUnauthorized() {
    }

    @Override
    public void onRtspStatusDisconnected() {
    }

    @Override
    public void onRtspStatusDisconnecting() {
    }

    @Override
    public void onRtspStatusConnected() {
    }

    @Override
    public void onRtspStatusConnecting() {
    }
};

おわりに

RTSPのストリーミングの実装を検討して場合、おすすめのライブラリです。

Discussion