RTSPのクラアントライブラリ「rtsp-client-android」が良い感じ
はじめに
Androidアプリで実装する際、RTSPでストリーミングした映像を表示した時がありました。
表示を行うためのライブラリとして、
- Exoplayer3
- libvlc
が候補にあがります。
しかしどちらも使ってみると、徐々に遅延が目立ちはじめ映像が止まってしまう、といった不安定さがありました。
適切な設定をすれば遅延を減らせるのかもしれませんが、結局原因は分からずじまい。
その労力を省いて、さくっと良い感じにストリーミングしたいと考えていた矢先、Exoplayer3がベースになったラッパーライブラリ「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