ExoPlayer, hem canlı hem de isteğe bağlı RTSP'yi destekler. Desteklenen örnek biçimler ve ağ türleri aşağıda listelenmiştir.
Desteklenen örnek biçimler
- H264 (STP medya açıklaması, fmtp dosyasındaki SPS/PPS verilerini içermelidir) özelliğini kullanın).
- AAC (ADTS bit akışı ile).
- AC3.
Desteklenen ağ türleri
- UDP tek noktaya yayın üzerinden RTP (çoklu yayın desteklenmez).
- Boşluklu RTSP, TCP kullanılarak RTSP üzerinden RTP.
MediaItem'i Kullanma
RTSP akışı oynatmak için RTSP modülüne bağlı olmanız gerekir.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.4.1")
Eski
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.1"
Daha sonra, RTSP URI'si için bir MediaItem
oluşturabilir ve oynatıcıya aktarabilirsiniz.
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();
Kimlik doğrulama
ExoPlayer, RTSP BASIC ve DIGEST kimlik doğrulamasıyla oynatmayı destekler. Oynamak için
MediaItem
öğesinin URI'si
kimlik doğrulama bilgisi. Özellikle, URI aşağıdaki biçimde olmalıdır:
rtsp://<username>:<password>@<host address>
.
RtspMediaSource'u Kullanma
Daha fazla özelleştirme seçeneği için RtspMediaSource
oluşturup iletebilirsiniz
doğrudan oynatıcıya gönderilir.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 arkasında RTSP kullanma (RTP/TCP desteği)
ExoPlayer, RTP aktarımı için varsayılan protokol olarak UDP'yi kullanır.
RTSP'yi bir NAT katmanının arkasında yayınlarken NAT, gelen RTP/UDP paketlerini kullanır. Bu durum, NAT’de UDP bağlantı noktası eşlemesini öneriyoruz. ExoPlayer, uygulamanın gelen isteksiz olduğunu tespit ederse Bir süreliğine RTP paketleri var ve oynatma henüz başlamadı. ExoPlayer ağzından ağlıyor Mevcut RTSP oynatma oturumunu kapatır ve RTP-over-RTSP kullanarak oynatmayı yeniden dener (RTSP için açılmış TCP bağlantısını kullanarak RTP paketleri iletme).
TCP ile yeniden deneme için zaman aşımı,
RtspMediaSource.Factory.setTimeoutMs()
Örneğin, zaman aşımı
oynatıcı dört saniye içinde TCP ile yeniden dener
neden olabilir.
Zaman aşımının ayarlanması, akış sonu algılama mantığını da etkiler. Yani, ExoPlayer, süresi sona erecektir. Bu değerin çok küçük ayarlanması, kötü ağ koşullarında yayın sonu sinyali.
RTP/TCP, bazı ağ kurulumlarında daha iyi uyumluluk sunar. Chrome Web Mağazası'ndaki
ExoPlayer'ın varsayılan olarak RTP/TCP'yi kullanması için
RtspMediaSource.Factory.setForceUseRtpTcp()
Özel SocketFactory iletme
Belirli bir yönlendirme şu durumlarda özel SocketFactory
örnekleri yararlı olabilir:
gerekir (örneğin, RTSP trafiğinin belirli bir arayüzden geçmesi gerektiğinde veya
soket için ek bağlantı işaretlerine ihtiyacı vardır).
RtspMediaSource
varsayılan olarak Java'nın standart yuva fabrikasını kullanır
(SocketFactory.getDefault()
) komutunu kullanın.
Bu davranış,
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));