RTSP

ExoPlayer は、ライブ RTSP とオンデマンド RTSP の両方をサポートしています。サポートされているサンプル形式とネットワーク タイプを以下に示します。

サポートされているサンプル形式

  • H264(SDP メディア記述には、デコーダの初期化用の fmtp 属性に SPS/PPS データを含める必要があります)。
  • AAC(ADTS ビットストリームを使用)。
  • AC3。

サポートされているネットワーク タイプ

  • UDP ユニキャスト経由の RTP(マルチキャストはサポートされていません)。
  • インターリーブ RTSP、TCP を使用した RTSP 経由の RTP。

MediaItem の使用

RTSP ストリームを再生するには、RTSP モジュールに依存する必要があります。

Kotlin

implementation("androidx.media3:media3-exoplayer-rtsp:1.10.0")

Groovy

implementation "androidx.media3:media3-exoplayer-rtsp:1.10.0"

次に、RTSP URI の MediaItem を作成して、プレーヤーに渡します。

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(rtspUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(rtspUri));
// Prepare the player.
player.prepare();

認証

ExoPlayer は、RTSP BASIC 認証と DIGEST 認証による再生をサポートしています。保護された RTSP コンテンツを再生するには、MediaItem の URI を認証情報で構成する必要があります。具体的には、URI は rtsp://<username>:<password>@<host address> の形式にする必要があります。

RtspMediaSource の使用

カスタマイズ オプションを増やすには、MediaItem の代わりに RtspMediaSource を作成してプレーヤーに直接渡します。

Kotlin

// Create an RTSP media source pointing to an RTSP uri.
val mediaSource: MediaSource =
  RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

// Create an RTSP media source pointing to an RTSP uri.
MediaSource mediaSource =
    new RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

NAT の背後で RTSP を使用する(RTP/TCP のサポート)

ExoPlayer は、RTP トランスポートのデフォルト プロトコルとして UDP を使用します。

NAT レイヤの背後で RTSP をストリーミングする場合、NAT は受信した RTP/UDP パケットをデバイスに転送できないことがあります。これは、NAT に必要な UDP ポート マッピングがない場合に発生します。ExoPlayer は、しばらくの間 RTP パケットが受信されず、再生がまだ開始されていないことを検出すると、現在の RTSP 再生セッションを終了し、RTP-over-RTSP を使用して再生を再試行します(RTSP 用に開かれた TCP 接続を使用して RTP パケットを送信します)。

TCP で再試行するタイムアウトは、RtspMediaSource.Factory.setTimeoutMs() メソッドを呼び出すことでカスタマイズできます。たとえば、タイムアウトが 4 秒に設定されている場合、プレーヤーは UDP が 4 秒間アクティブでない状態が続くと、TCP で再試行します。

タイムアウトを設定すると、ストリーム終了検出ロジックにも影響します。つまり、設定されたタイムアウト時間内に何も受信されない場合、ExoPlayer は再生が終了したことを報告します。この値を小さく設定しすぎると、ネットワークの状態が悪い場合にストリーム終了信号が早すぎる可能性があります。

RTP/TCP は、一部のネットワーク設定で互換性が向上します。RtspMediaSource.Factory.setForceUseRtpTcp() を使用すると、ExoPlayer がデフォルトで RTP/TCP を使用するように構成できます。

カスタム SocketFactory を渡す

特定のルーティングが必要な場合(RTSP トラフィックが特定のインターフェースを通過する必要がある場合や、ソケットに追加の接続フラグが必要な場合など)、カスタム SocketFactory インスタンスが役立ちます。

デフォルトでは、RtspMediaSource は Java の標準ソケット ファクトリ(SocketFactory.getDefault())を使用して、リモート エンドポイントへの接続を作成します。この動作は、RtspMediaSource.Factory.setSocketFactory() を使用してオーバーライドできます。

Kotlin

// Create an RTSP media source pointing to an RTSP uri and override the socket
// factory.
val mediaSource: MediaSource =
  RtspMediaSource.Factory()
    .setSocketFactory(socketFactory)
    .createMediaSource(MediaItem.fromUri(rtspUri))

Java

// Create an RTSP media source pointing to an RTSP uri and override the socket
// factory.
MediaSource mediaSource =
    new RtspMediaSource.Factory()
        .setSocketFactory(socketFactory)
        .createMediaSource(MediaItem.fromUri(rtspUri));