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ışı ile).
- AC3.
Desteklenen ağ türleri
- UDP tek yayın üzerinden RTP (çoklu yayın desteklenmez).
- TCP kullanan RTSP üzerinden RTP, ardışık RTSP.
MediaItem'i kullanma
RTSP yayını oynatmak için RTSP modülüne ihtiyacınız vardır.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.5.0")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.5.0"
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. Korunan RTSP içeriğini oynatmak için MediaItem
'nin URI'si kimlik doğrulama bilgileriyle yapılandırılmalıdır. Daha açık belirtmek gerekirse URI, rtsp://<username>:<password>@<host address>
biçiminde olmalıdır.
RtspMediaSource'i kullanma
Daha fazla özelleştirme seçeneği için MediaItem
yerine RtspMediaSource
oluşturup 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.
NAT katmanının arkasında RTSP aktarılırken NAT, gelen RTP/UDP paketlerini cihaza yönlendiremeyebilir. Bu durum, NAT'te gerekli UDP bağlantı noktası eşlemesi yoksa ortaya çıkar. ExoPlayer, bir süredir gelen RTP paketi olmadığını ve oynatmanın henüz başlamadığını algılarsa mevcut RTSP oynatma oturumunu sonlandırır ve RTSP üzerinden RTP'yi (RTSP için açılan TCP bağlantısını kullanarak RTP paketlerini aktarma) 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ı, UDP'de dört saniye boyunca işlem yapılmaması durumunda TCP ile yeniden dener.
Zaman aşımı ayarı, 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 düşük ayarlanması, zayıf ağ koşullarında yayın sonu sinyalinin erken gönderilmesine 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 (ör. 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 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));