ExoPlayer は、ライブ RTSP とオンデマンド RTSP の両方をサポートしています。サポートされているサンプル形式とネットワーク タイプを以下に示します。
サポートされているサンプル形式
- H264(SDP メディア記述には、デコーダの初期化のために fmtp 属性に SPS/PPS データを含める必要があります)。
- AAC(ADTS ビットストリーム付き)。
- AC3.
サポートされているネットワーク タイプ
- UDP ユニキャスト経由の RTP(マルチキャストはサポートされていません)。
- インターリーブ RTSP、TCP を使用した RTP over RTSP。
MediaItem の使用
RTSP ストリームを再生するには、RTSP モジュールに依存する必要があります。
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.11.1")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.11.1"
その後、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 の使用
カスタマイズ オプションを増やすには、RtspMediaSource を作成し、MediaItem の代わりにプレーヤーに直接渡します。
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() を使用して、デフォルトで RTP/TCP を使用するように ExoPlayer を構成できます。
カスタム 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));