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ç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ışıyla).
  • AC3.

Desteklenen ağ türleri

  • UDP tek yayını üzerinden RTP (çoklu yayın desteklenmez).
  • TCP kullanarak RTSP üzerinden RTP, aralıklı RTSP.

MediaItem kullanma

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

Kotlin

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

Groovy

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

Ardından, RTSP URI için bir 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'u 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.

Bir NAT katmanının arkasında RTSP yayını yapılırken NAT, gelen RTP/UDP paketlerini cihaza yönlendiremeyebilir. Bu durum, NAT'ta gerekli UDP bağlantı noktası eşlemesi yoksa meydana gelir. ExoPlayer, bir süredir gelen RTP paketleri olmadığını ve oynatmanın henüz başlamadığını algılarsa mevcut RTSP oynatma oturumunu sonlandırır ve RTP-over-RTSP kullanarak oynatmayı yeniden dener (RTSP için açılan TCP bağlantısı kullanılarak RTP paketleri iletilir).

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 etkinliğinin ardından TCP ile yeniden dener.

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

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

Özel bir 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ç noktalarla bağlantı oluşturmak için Java'nın standart yuva 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(...)
    .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));