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 (SDP medya açıklaması, kod çözücüyü başlatma için fmtp özelliğinde SPS/PPS verilerini içermelidir).
  • AAC (ADTS bit akışıyla).
  • AC3.

Desteklenen ağ türleri

  • UDP unicast üzerinden RTP (çoklu yayın desteklenmez).
  • TCP kullanılarak aralıklı RTSP, RTSP üzerinden RTP.

MediaItem kullanma

RTSP akışını oynatmak için RTSP modülüne bağımlı olmanız gerekir.

Kotlin

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

Modern

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

Daha sonra RTSP URI'si 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. Korunan RTSP içeriğini oynatmak için MediaItem URI'sının kimlik doğrulama bilgileriyle yapılandırılması gerekir. URI, özellikle rtsp://<username>:<password>@<host address> biçiminde olmalıdır.

RtspMediaSource'u Kullanma

Daha fazla özelleştirme seçeneği için RtspMediaSource oluşturup 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ından RTSP akışı gerçekleştirirken 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 paketlerinin olmadığını tespit ederse ve oynatma henüz başlamamışsa ExoPlayer mevcut RTSP oynatma oturumunu böler ve RTP-over-RTSP'yi (RTSP için açılan TCP bağlantısını kullanarak RTP paketleri göndererek) 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ı, UDP'nin dört saniye boyunca etkinlik olmaması durumunda TCP ile yeniden deneme yapar.

Zaman aşımının ayarlanması, yayın sonu algılama mantığını da etkiler. Diğer bir deyişle, 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 yayın sonu sinyalinin erken olması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 geçirme

Özel SocketFactory örnekleri, belirli bir yönlendirme gerektiğinde (ör. RTSP trafiğinin belirli bir arayüzden geçmesi 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 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));