media3/docs/rtsp.md
2021-06-30 13:46:13 +01:00

2.7 KiB

title
RTSP

{% include_relative _page_fragments/supported-formats-rtsp.md %}

Using MediaItem

To play an RTSP stream, you need to depend on the RTSP module.

implementation 'com.google.android.exoplayer:exoplayer-rtsp:2.X.X'

{: .language-gradle}

You can then create a MediaItem for an RTSP URI and pass it to the player.

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

{: .language-java}

Play authentication-enabled RTSP content

ExoPlayer supports playback with RTSP BASIC and DIGEST authentication. To play protected RTSP content, the MediaItem's URI must be configured with the authtication info. Specifically, the URI should follow the format rtsp://<username>:<password>@<host address>.

Using RtspMediaSource

For more customization options, you can create an RtspMediaSource and pass it directly to the player instead of a MediaItem.

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

{: .language-java}

Using RTSP behind a NAT (RTP/TCP support)

ExoPlayer uses UDP as the default protocol for RTP transport.

When streaming RTSP behind a NAT layer, the NAT might not be able to forward the incoming RTP/UDP packets to the device. This occurs if the NAT lacks the necessary UDP port mapping. If ExoPlayer detects there have not been incoming RTP packets for a while and the playback has not started yet, ExoPlayer tears down the current RTSP playback session, and retries playback using RTP-over-RTSP (transmitting RTP packets using the TCP connection opened for RTSP).

The timeout for retrying with TCP can be customized by calling the method RtspMediaSource.Factory.setTimeoutMs(). For example, if the timeout is set to four seconds, the player will retry with TCP after four seconds of UDP inactivity.

Setting the timeout also affects the end-of-stream detection logic. That is, ExoPlayer will report the playback has ended if nothing is received for the duration of the set timeout. Setting this value too small may lead to pre-mature stream ending under poor network conditions.

Force using RTP/TCP

ExoPlayer can also be configured to play with RTP/TCP by default. To do so, use method RtspMediaSource.Factory.setForceUseRtpTcp().