ExoPlayer mendukung RTSP live dan on demand. Contoh format yang didukung dan jenis jaringan tercantum di bawah ini.
Contoh format yang didukung
- H264 (deskripsi media SDP harus menyertakan data SPS/PPS dalam untuk inisialisasi decoder).
- AAC (dengan bitstream ADTS).
- AC3.
Jenis jaringan yang didukung
- RTP melalui UDP unicast (multicast tidak didukung).
- RTSP berintersingasi, RTP melalui RTSP menggunakan TCP.
Menggunakan MediaItem
Untuk memutar streaming RTSP, Anda harus bergantung pada modul RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.4.1")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.1"
Anda kemudian 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 diputar
konten RTSP yang dilindungi, URI MediaItem
harus dikonfigurasi dengan
informasi 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 pemutar, 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 {i>streaming <i}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 porta UDP yang diperlukan. Jika ExoPlayer mendeteksi bahwa belum ada masuk Paket RTP untuk sementara waktu dan pemutaran belum dimulai, ExoPlayer menangis menghapus sesi pemutaran RTSP saat ini, dan mencoba kembali pemutaran menggunakan RTP-over-RTSP (mengirimkan paket RTP menggunakan koneksi TCP terbuka untuk RTSP).
Waktu tunggu untuk mencoba ulang dengan TCP dapat disesuaikan dengan memanggil metode
RtspMediaSource.Factory.setTimeoutMs()
. Misalnya, jika waktu tunggu diatur ke
empat detik, pemutar akan mencoba kembali dengan TCP setelah empat detik UDP
tidak aktif.
Menyetel waktu tunggu juga akan memengaruhi logika deteksi akhir streaming. Yaitu, ExoPlayer akan melaporkan pemutaran telah berakhir jika tidak ada yang diterima untuk dari waktu tunggu yang ditetapkan. Penetapan nilai ini terlalu kecil dapat menyebabkan sinyal akhir-aliran data 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 saat perutean tertentu
(misalnya, ketika lalu lintas RTSP perlu meneruskan antarmuka tertentu, atau
yang memerlukan flag konektivitas tambahan).
Secara default, RtspMediaSource
akan menggunakan factory soket 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));