RTSP

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.
ziyaret edin.

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