Canlı yayın

ExoPlayer, çoğu uyarlanabilir canlı yayını herhangi bir özel yapılandırmaya gerek duymadan, kullanıma hazır bir şekilde oynatır. Daha ayrıntılı bilgi için Desteklenen Biçimlendirmeler sayfasına bakın.

Uyarlanabilir canlı yayınlar, mevcut gerçek zamanlı analize göre hareket etmek için düzenli aralıklarla güncellenen bir medya penceresi sunar. Bu, oynatma konumunun her zaman bu aralıkta bir yerde olacağı anlamına gelir. Çoğu durumda, yayının üretildiği gerçek zamana yakın olur. Mevcut gerçek zamanlı konum ile oynatma konumu arasındaki fark canlı ofset olarak adlandırılır.

Canlı oynatmaları algılama ve izleme

Canlı pencere her güncellendiğinde, kayıtlı Player.Listener örnekleri bir onTimelineChanged etkinliği alır. Aşağıda listelenen ve aşağıdaki şekilde gösterilen çeşitli Player ve Timeline.Window yöntemlerini sorgulayarak mevcut canlı oynatma ile ilgili ayrıntıları alabilirsiniz.

Canlı yayın aralığı

  • Player.isCurrentWindowLive, şu anda oynatılan medya öğesinin canlı yayın olup olmadığını belirtir. Canlı yayın sona ermiş olsa bile bu değer doğru olmaya devam eder.
  • Player.isCurrentWindowDynamic, şu anda oynatılan medya öğesinin güncellenmeye devam edip etmediğini belirtir. Bu durum genellikle henüz sona ermemiş canlı yayınlar için geçerlidir. Bu işaretin bazı durumlarda canlı olmayan yayınlar için de geçerli olduğunu unutmayın.
  • Player.getCurrentLiveOffset, mevcut gerçek zaman ile oynatma konumu (varsa) arasındaki ofseti döndürür.
  • Player.getDuration, geçerli canlı pencerenin uzunluğunu döndürür.
  • Player.getCurrentPosition, canlı pencerenin başlangıcına göre oynatma konumunu döndürür.
  • Player.getCurrentMediaItem, geçerli medya öğesini döndürür. Bu öğede MediaItem.liveConfiguration, hedef canlı ofset ve canlı ofset ayarı parametreleri için uygulama tarafından sağlanan geçersiz kılma işlemleri bulunur.
  • Player.getCurrentTimeline, Timeline içindeki geçerli medya yapısını döndürür. Geçerli Timeline.Window, Player.getCurrentMediaItemIndex ve Timeline.getWindow kullanılarak Timeline'ten alınabilir. Window içinde:
    • Window.liveConfiguration, hedef canlı ofseti ve canlı ofset ayarı parametrelerini içerir. Bu değerler, medyadaki bilgilere ve MediaItem.liveConfiguration'te ayarlanan, uygulama tarafından sağlanan tüm geçersiz kılma işlemlerine dayanır.
    • Window.windowStartTimeMs, canlı yayın aralığının Unix Epoch'tan itibaren başladığı zamandır.
    • Window.getCurrentUnixTimeMs, mevcut gerçek zamanın Unix sıfır zamanından itibaren geçen süredir. Bu değer, sunucu ile istemci arasındaki bilinen bir saat farkıyla düzeltilebilir.
    • Window.getDefaultPositionMs, oynatıcının varsayılan olarak oynatmayı başlatacağı canlı penceredeki konumdur.

Canlı yayınlarda ileri sarma

Player.seekTo simgesini kullanarak canlı pencerenin herhangi bir yerine gidebilirsiniz. İletilen arama konumu, canlı zaman aralığının başlangıcına bağlıdır. Örneğin, seekTo(0) canlı yayının başlangıcına gider. Oynatıcı, bir aramadan sonra aranan konumla aynı canlı ofseti tutmaya çalışır.

Canlı pencerenin, oynatmanın başlaması gereken varsayılan bir konumu da vardır. Bu konum genellikle canlı kenara yakın bir yerdedir. Player.seekToDefaultPosition komutunu kullanarak varsayılan konuma gidebilirsiniz.

Canlı oynatma kullanıcı arayüzü

ExoPlayer'ın varsayılan kullanıcı arayüzü bileşenleri, canlı pencerenin süresini ve içindeki mevcut oynatma konumunu gösterir. Bu durumda, canlı pencere her güncellendiğinde konumun geriye doğru atladığı görülür. Farklı bir davranışa ihtiyacınız varsa (ör. Unix saatini veya geçerli canlı ofseti göstermek) gerekiyorsa PlayerControlView öğesini çatallayın ve ihtiyaçlarınıza uyacak şekilde değiştirebilirsiniz.

Canlı oynatma parametrelerini yapılandırma

ExoPlayer, oynatma konumunun canlı kenardan ofsetini ve bu ofseti ayarlamak için kullanılabilecek oynatma hızları aralığını kontrol etmek için bazı parametreler kullanır.

ExoPlayer, bu parametrelerin değerlerini üç yerden alır ve öncelik sırasına göre azalan düzende (bulunan ilk değer kullanılır) sıralar:

  • MediaItem.Builder.setLiveConfiguration değerine aktarılan MediaItem değeri başına.
  • DefaultMediaSourceFactory üzerinde ayarlanan global varsayılan değerler.
  • Doğrudan medyadan okunan değerler.

Kotlin

// Global settings.
val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
    .build()

// Per MediaItem settings.
val mediaItem =
  MediaItem.Builder()
    .setUri(mediaUri)
    .setLiveConfiguration(
      MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()
    )
    .build()
player.setMediaItem(mediaItem)

Java

// Global settings.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
        .build();

// Per MediaItem settings.
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(mediaUri)
        .setLiveConfiguration(
            new MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build())
        .build();
player.setMediaItem(mediaItem);

Kullanılabilir yapılandırma değerleri şunlardır:

  • targetOffsetMs: Hedef canlı zaman farkı. Mümkünse oynatma sırasında oynatıcı bu canlı ofsete yakın bir değere ulaşmaya çalışır.
  • minOffsetMs: İzin verilen minimum canlı yayın farkı. Oynatma sırasında oynatıcı, ofseti mevcut ağ koşullarına göre ayarladığında bile bu ofsetin altına inmeye çalışmaz.
  • maxOffsetMs: İzin verilen maksimum canlı yayın farkı. Oynatma sırasında oynatıcı, ofseti mevcut ağ koşullarına göre ayarladığında bile bu ofsetin üzerine çıkmaya çalışmaz.
  • minPlaybackSpeed: Oynatıcının, hedef canlı uzaklığa ulaşmaya çalışırken yedek olarak kullanabileceği minimum oynatma hızı.
  • maxPlaybackSpeed: Oynatıcının, canlı yayındaki hedef uzaklığa ulaşmaya çalışırken yakalamak için kullanabileceği maksimum oynatma hızı.

Oynatma hızı ayarı

ExoPlayer, düşük gecikmeli canlı yayınları oynatırken oynatma hızını biraz değiştirerek canlı yayındaki ofseti ayarlar. Oynatıcı, medya veya uygulama tarafından sağlanan hedef canlı ofseti eşlemeye çalışır ancak değişen ağ koşullarına da tepki vermeye çalışır. Örneğin, oynatma sırasında yeniden arabelleğe alma gerçekleşirse oynatıcı, canlı kenardan uzaklaşmak için oynatma işlemini biraz yavaşlatır. Ağ daha sonra canlı yayına daha yakın bir yerde oynatmayı destekleyecek kadar kararlı hale gelirse oynatıcı, oynatmayı hızlandırarak hedef canlı yayın ofsetine geri döner.

Otomatik oynatma hızı ayarı istenmiyorsa minPlaybackSpeed ve maxPlaybackSpeed mülkleri 1.0f olarak ayarlanarak devre dışı bırakılabilir. Benzer şekilde, bu değerler 1.0f dışındaki değerlere açıkça ayarlanarak düşük gecikmeli olmayan canlı yayınlar için de etkinleştirilebilir. Bu özelliklerin nasıl ayarlanabileceğiyle ilgili daha fazla bilgi için yukarıdaki yapılandırma bölümüne bakın.

Oynatma hızı ayarlama algoritmasını özelleştirme

Hız ayarı etkinse LivePlaybackSpeedControl, hangi ayarların yapıldığını tanımlar. Özel bir LivePlaybackSpeedControl uygulayabilir veya varsayılan uygulamayı (DefaultLivePlaybackSpeedControl) özelleştirebilirsiniz. Her iki durumda da, oynatıcı oluşturulurken bir örnek ayarlanabilir:

Kotlin

val player =
  ExoPlayer.Builder(context)
    .setLivePlaybackSpeedControl(
      DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build()
    )
    .build()

Java

ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setLivePlaybackSpeedControl(
            new DefaultLivePlaybackSpeedControl.Builder()
                .setFallbackMaxPlaybackSpeed(1.04f)
                .build())
        .build();

DefaultLivePlaybackSpeedControl ile ilgili özelleştirme parametreleri şunlardır:

  • fallbackMinPlaybackSpeed ve fallbackMaxPlaybackSpeed: Medya veya uygulama tarafından sağlanan MediaItem sınırlar tanımlanmamışsa ayarlama için kullanılabilecek minimum ve maksimum oynatma hızları.
  • proportionalControlFactor: Hız ayarının ne kadar düzgün olacağını kontrol eder. Yüksek bir değer, ayarlamaları daha ani ve duyarlı hale getirir ancak sesli olma olasılığını da artırır. Daha küçük bir değer, hızlar arasında daha yumuşak bir geçiş sağlar ancak hızda düşüş yaşanır.
  • targetLiveOffsetIncrementOnRebufferMs: Bu değer, daha dikkatli bir şekilde devam etmek için her yeniden arabellek gerçekleştiğinde hedef canlı ofsete eklenir. Bu özellik, değer 0 olarak ayarlanarak devre dışı bırakılabilir.
  • minPossibleLiveOffsetSmoothingFactor: Şu anda arabelleğe alınan medyaya göre mümkün olan minimum canlı farkı izlemek için kullanılan üstel yumuşatma faktörü. 1'e çok yakın bir değer, tahminin daha ihtiyatlı olduğu ve iyileştirilmiş ağ koşullarına uyum sağlamasının daha uzun sürebileceğini belirtir. Düşük bir değer ise yeniden arabelleğe alma riskinin daha yüksek olması durumunda tahminin daha hızlı ayarlanacağı anlamına gelir.

BehindLiveWindowException ve ERROR_CODE_BEHIND_LIVE_WINDOW

Oynatma konumu, oynatıcı duraklatıldığında veya yeterince uzun süre arabelleğe alındığında canlı pencereden geriye düşebilir. Bu durumda oynatma başarısız olur ve Player.Listener.onPlayerError aracılığıyla ERROR_CODE_BEHIND_LIVE_WINDOW hata kodunu içeren bir istisna bildirilir. Uygulama kodu, bu tür hataları oynatmayı varsayılan konumda devam ettirerek ele almak isteyebilir. Demo uygulamasının PlayerActivity sınıfı bu yaklaşımı örneklemektedir.

Kotlin

override fun onPlayerError(error: PlaybackException) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition()
    player.prepare()
  } else {
    // Handle other errors
  }
}

Java

@Override
public void onPlayerError(PlaybackException error) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition();
    player.prepare();
  } else {
    // Handle other errors
  }
}