RTSP

ExoPlayer, hem canlı hem de seç-izle RTSP'yi destekler. Desteklenen örnek biçimleri ve ağ türleri aşağıda listelenmiştir.

Desteklenen örnek biçimleri

  • H264 (SDP medya açıklaması, kod çözücü başlatma için fmtp özelliğinde SPS/PPS verilerini içermelidir).
  • AAC (ADTS bit akışı ile)
  • AC3.

Desteklenen ağ türleri

  • UDP tek noktaya yayın üzerinden RTP (çok noktaya yayın desteklenmez).
  • Aralıklı RTSP, TCP kullanan RTSP üzerinden RTP.

MediaItem'ı kullanma

RTSP akışı oynatmak için RTSP modülünü kullanmanız gerekir.

Kotlin

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

Modern

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

Ardından, bir RTSP URI için MediaItem oluşturup oynatıcıya iletebilirsiniz.

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. Korumalı RTSP içeriğini oynatmak için MediaItem URI'si, kimlik doğrulama bilgileriyle yapılandırılmalıdır. Özellikle URI, rtsp://<username>:<password>@<host address> biçiminde olmalıdır.

RtspMediaSource kullanma

Daha fazla özelleştirme seçeneği için RtspMediaSource oluşturabilir ve bunu MediaItem yerine doğrudan oynatıcıya iletebilirsiniz.

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, NAT katmanının arkasından aktarılırken NAT, gelen RTP/UDP paketlerini cihaza yönlendiremeyebilir. Bu durum, NAT'ta gerekli UDP bağlantı noktası eşlemesi olmadığında ortaya çıkar. ExoPlayer bir süredir gelen RTP paketi olmadığını ve oynatmanın henüz başlamadığını tespit ederse mevcut RTSP oynatma oturumunu sonlandırır ve RTP-over-RTSP (RTSP için açılan TCP bağlantısını kullanarak RTP paketlerini iletme) kullanarak oynatmayı yeniden dener.

TCP ile yeniden deneme için zaman aşımı, RtspMediaSource.Factory.setTimeoutMs() yöntemi çağrılarak özelleştirilebilir. Örneğin, zaman aşımı dört saniyeye ayarlanırsa oynatıcı, dört saniyelik UDP işlem yapılmama süresinden sonra TCP ile yeniden dener.

Zaman aşımının ayarlanması, akış sonu algılama mantığını da etkiler. Yani ExoPlayer, ayarlanan zaman aşımı süresi boyunca hiçbir şey alınmazsa oynatmanın sona erdiğini bildirir. Bu değerin çok küçük ayarlanması, zayıf ağ koşullarında akış sonu sinyalinin erken gönderilmesine neden olabilir.

RTP/TCP, bazı ağ kurulumlarında daha iyi uyumluluk sunar. ExoPlayer'ı varsayılan olarak RTP/TCP kullanacak şekilde yapılandırmak için RtspMediaSource.Factory.setForceUseRtpTcp() kullanabilirsiniz.

Özel SocketFactory iletme

Özel SocketFactory örnekleri, belirli bir yönlendirme gerektiğinde (örneğin, RTSP trafiğinin belirli bir arayüzden geçmesi gerektiğinde veya soketin ek bağlantı işaretlerine ihtiyacı olduğunda) yararlı olabilir.

Varsayılan olarak RtspMediaSource, uzak uç noktalara bağlantı oluşturmak için Java'nın standart soket fabrikasını (SocketFactory.getDefault()) kullanır. Bu davranış, RtspMediaSource.Factory.setSocketFactory() kullanılarak geçersiz kılınabilir.

Kotlin

// Create an RTSP media source pointing to an RTSP uri and override the socket
// factory.
val mediaSource: MediaSource =
  RtspMediaSource.Factory()
    .setSocketFactory(socketFactory)
    .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(socketFactory)
        .createMediaSource(MediaItem.fromUri(rtspUri));