ExoPlayer は、ライブ RTSP とオンデマンド RTSP の両方をサポートしています。サポートされているサンプル形式とネットワークの種類を以下に示します。
サポートされているサンプル形式
- H264(SDP メディアの記述では、デコーダを初期化するために、fmtp 属性に SPS/PPS データを含める必要があります)。
- AAC(ADTS ビットストリームを含む)
- AC3。
サポートされているネットワークの種類
- RTP over UDP ユニキャスト(マルチキャストはサポートされていません)。
- TCP を使用したインターリーブ RTSP、RTP over RTSP。
MediaItem の使用
RTSP ストリームを再生するには、RTSP モジュールに依存する必要があります。
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.3.1")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.3.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 の使用
その他のカスタマイズ オプションについては、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 ポート マッピングがない場合に発生します。しばらくの間 RTP パケットの受信がないことが検出され、再生がまだ開始されていない場合、ExoPlayer は現在の 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 を渡す
カスタム SocketFactory
インスタンスは、特定のルーティングが必要な場合(たとえば、RTSP トラフィックが特定のインターフェースを通過する必要がある場合や、ソケットに追加の接続フラグが必要な場合)に役立ちます。
デフォルトでは、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(...) .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(...) .createMediaSource(MediaItem.fromUri(rtspUri));