RTSP

ExoPlayer mendukung RTSP live dan on demand. Contoh format dan jenis jaringan yang didukung tercantum di bawah ini.

Format contoh yang didukung

  • H264 (deskripsi media SDP harus menyertakan data SPS/PPS dalam atribut fmt'>{}</p untuk inisialisasi decoder).
  • AAC (dengan bitstream ADTS).
  • AC3

Jenis jaringan yang didukung

  • RTP melalui unicast UDP (multicast tidak didukung).
  • RTSP berselang-seling, RTP melalui RTSP menggunakan TCP.

Menggunakan Varian

Untuk memutar streaming RTSP, Anda harus bergantung pada modul RTSP.

Kotlin

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

Groovy

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

Kemudian, Anda dapat membuat MediaItem untuk URI RTSP dan meneruskannya ke pemutar.

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();

Autentikasi

ExoPlayer mendukung pemutaran dengan autentikasi RTSP BASIC dan DIGEST. Untuk memutar konten RTSP yang dilindungi, URI MediaItem harus dikonfigurasi dengan info autentikasi. Secara khusus, URI harus berbentuk rtsp://<username>:<password>@<host address>.

Menggunakan RtspMediaSource

Untuk opsi penyesuaian lainnya, Anda dapat membuat RtspMediaSource dan meneruskannya langsung ke pemain, bukan 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();

Menggunakan RTSP di belakang NAT (dukungan RTP/TCP)

ExoPlayer menggunakan UDP sebagai protokol default untuk transpor RTP.

Saat melakukan streaming RTSP di belakang lapisan NAT, NAT mungkin tidak dapat meneruskan paket RTP/UDP yang masuk ke perangkat. Hal ini terjadi jika NAT tidak memiliki pemetaan port UDP yang diperlukan. Jika ExoPlayer mendeteksi belum ada paket RTP yang masuk untuk sementara waktu dan pemutaran belum dimulai, ExoPlayer akan menghapus sesi pemutaran RTSP saat ini, dan mencoba kembali pemutaran menggunakan RTP-over-RTSP (mengirimkan paket RTP menggunakan koneksi TCP yang dibuka untuk RTSP).

Waktu tunggu untuk mencoba ulang dengan TCP dapat disesuaikan dengan memanggil metode RtspMediaSource.Factory.setTimeoutMs(). Misalnya, jika waktu tunggu disetel ke empat detik, pemutar akan mencoba lagi dengan TCP setelah empat detik tidak aktif UDP.

Menyetel waktu tunggu juga akan memengaruhi logika deteksi akhir streaming. Artinya, ExoPlayer akan melaporkan bahwa pemutaran telah berakhir jika tidak ada yang diterima selama durasi waktu tunggu yang ditetapkan. Menetapkan nilai ini terlalu kecil dapat menyebabkan sinyal akhir streaming awal dalam kondisi jaringan yang buruk.

RTP/TCP menawarkan kompatibilitas yang lebih baik dalam beberapa pengaturan jaringan. Anda dapat mengonfigurasi ExoPlayer untuk menggunakan RTP/TCP secara default dengan RtspMediaSource.Factory.setForceUseRtpTcp().

Meneruskan SocketFactory kustom

Instance SocketFactory kustom dapat berguna ketika perutean tertentu diperlukan (misalnya, saat traffic RTSP harus meneruskan antarmuka tertentu, atau soket memerlukan tanda konektivitas tambahan).

Secara default, RtspMediaSource akan menggunakan socket factory standar Java (SocketFactory.getDefault()) untuk membuat koneksi ke endpoint jarak jauh. Perilaku ini dapat diganti menggunakan 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));