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 (kod çözücünün başlatılması için SDP medya açıklaması, 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 (ç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.3.1")

Eski

implementation "androidx.media3:media3-exoplayer-rtsp:1.3.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. Korumalı RTSP içeriğini oynatmak için MediaItem öğesinin URI'sı, 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 bir RtspMediaSource oluşturabilir ve bunu bir MediaItem yerine doğrudan oynatıcıya aktarabilirsiniz.

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 akışı yapılırken NAT, gelen RTP/UDP paketlerini cihaza yönlendiremeyebilir. Bu durum, NAT'de gerekli UDP bağlantı noktası eşlemesi yoksa ortaya çıkar. ExoPlayer bir süredir gelen RTP paketleri olmadığını ve oynatma henüz başlamadığını tespit ederse ExoPlayer mevcut RTSP oynatma oturumunu keser ve RTP üzerinden RTSP'yi kullanarak oynatmayı yeniden dener (RTSP için açılan TCP bağlantısını kullanarak RTP paketleri iletme).

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 saniye UDP etkinlik olmaması durumunda 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 elde edilmezse oynatmanın sona erdiğini bildirir. Bu değerin çok düşük olarak ayarlanması, zayıf ağ koşullarında erken yayın sonu sinyaline yol açabilir.

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 SocketFactory iletme

Özel SocketFactory örnekleri, belirli bir yönlendirme gerekli olduğunda (örneğin, RTSP trafiğinin belirli bir arayüzü geçmesi veya yuvanın ek bağlantı bayraklarına ihtiyacı olduğunda) yararlı olabilir.

RtspMediaSource, uzak uç noktalarla bağlantı oluşturmak için varsayılan olarak 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));