Canlı yayın

ExoPlayer, uyarlanabilir canlı yayınların çoğunu herhangi bir özel yapılandırma olmadan kullanıma hazır şekilde oynatır. Daha fazla ayrıntı için Desteklenen Biçimler sayfasına bakın.

Uyarlanabilir canlı yayınlar, mevcut medya içeriğine uyum sağlamak için düzenli aralıklarla güncellenen kullanılabilir medya penceresi sunar. Bu, oynatma konumunun her zaman bu pencerede bir yerde olacağı anlamına gelir. Çoğu durumda akışın oluşturulduğu geçerli gerçek zamana yakındır. 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ı zaman aralığı her güncellendiğinde, kayıtlı Player.Listener örnek bir onTimelineChanged etkinliği alır. Mevcut canlı oynatmayla ilgili ayrıntıları, aşağıda listelenen ve aşağıdaki şekilde gösterildiği gibi çeşitli Player ve Timeline.Window yöntemlerini sorgulayarak öğrenebilirsiniz.

Canlı pencere

  • Player.isCurrentWindowLive, şu anda oynatılan medya öğesinin canlı yayın olup olmadığını belirtir. Bu değer, canlı yayın sona ermiş olsa bile hâlâ geçerlidir.
  • Player.isCurrentWindowDynamic, şu anda oynatılan medya öğesinin hâlâ güncellenip güncellenmediğ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, geçerli gerçek zaman ile oynatma konumu (varsa) arasındaki ofseti döndürür.
  • Player.getDuration, geçerli yayın zaman aralığının uzunluğunu döndürür.
  • Player.getCurrentPosition, oynatma konumunu canlı pencerenin başlangıcına göre döndürür.
  • Player.getCurrentMediaItem, geçerli medya öğesini döndürür. Burada MediaItem.liveConfiguration, hedef canlı ofset ve canlı ofset ayarlama parametreleri için uygulama tarafından sağlanan geçersiz kılmaları içerir.
  • Player.getCurrentTimeline, Timeline içindeki geçerli medya yapısını döndürür. Mevcut Timeline.Window, Player.getCurrentWindowIndex ve Timeline.getWindow kullanılarak Timeline bölümünden alınabilir. Window içinde:
    • Window.liveConfiguration, hedef canlı ofset ve canlı ofset ayarlama parametrelerini içerir. Bu değerler, medyadaki bilgilere ve MediaItem.liveConfiguration içinde ayarlanan uygulama tarafından sağlanan geçersiz kılmalara dayanır.
    • Window.windowStartTimeMs, canlı pencerenin başladığı Unix Dönem'den bu yana geçen süredir.
    • Window.getCurrentUnixTimeMs, geçerli gerçek zamanlı Unix Dönem'den bu yana 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 oynatmaya başlayacağı canlı pencerede konumdur.

Canlı yayınlarda yer alma

Player.seekTo kullanarak canlı pencerede herhangi bir yere gidebilirsiniz. İletilen sarma konumu, yayındaki zaman aralığının başlangıcıyla ilişkilidir. Örneğin, seekTo(0), yayındaki zaman aralığının başlangıcını arar. Oyuncu, bir aramadan sonra istenen pozisyonla aynı canlı ofseti korumaya çalışır.

Canlı pencere, oynatmanın başlayacağı varsayılan bir konuma da sahiptir. Bu konum genellikle canlı kenara yakın bir yerdedir. Player.seekToDefaultPosition yöntemini çağırarak varsayılan konuma gidebilirsiniz.

Canlı oynatma kullanıcı arayüzü

ExoPlayer'ın varsayılan kullanıcı arayüzü bileşenleri, yayındaki pencerenin süresini ve içindeki geçerli oynatma konumunu gösterir. Bu, yayın zaman aralığı her güncellendiğinde konum geriye doğru atlanacak gibi görünür. Unix saatini veya geçerli canlı ofseti gösterme gibi farklı bir davranışa ihtiyacınız varsa PlayerControlView öğesini çatallayıp ihtiyaçlarınıza göre 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ızı aralığını kontrol etmek için bazı parametreler kullanır.

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

  • MediaItem.Builder.setLiveConfiguration öğesine iletilen MediaItem başına değer.
  • Genel varsayılan değerler DefaultMediaSourceFactory tarihinde ayarlandı.
  • Değerler doğrudan medyadan okunur.

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ı ofset. Oynatıcı, mümkünse oynatma sırasında bu canlı ofsete yaklaşmaya çalışır.
  • minOffsetMs: İzin verilen minimum canlı ofset. ofset geçerli ağ koşullarına göre ayarlanırken bile oynatıcı, oynatma sırasında bu ofsetin altına inmeye çalışmaz.
  • maxOffsetMs: İzin verilen maksimum canlı ofset. ofseti geçerli ağ koşullarına göre ayarlarken bile, oynatıcı oynatma sırasında bu ofsetin üzerine çıkmaya çalışmaz.
  • minPlaybackSpeed: Oynatıcının hedef canlı ofsete ulaşmaya çalışırken geri çekilmek için kullanabileceği minimum oynatma hızı.
  • maxPlaybackSpeed: Oynatıcının hedef canlı ofsete ulaşmaya çalışırken yetişmek için kullanabileceği maksimum oynatma hızı.

Oynatma hızı ayarı

ExoPlayer, düşük gecikmeli bir canlı yayın oynatırken oynatma hızını biraz değiştirerek canlı ofseti ayarlar. Oynatıcı, medya veya uygulama tarafından sağlanan hedef canlı ofseti eşleştirmeye çalışırken değişen ağ koşullarına da tepki vermeye çalışır. Örneğin, oynatma sırasında yeniden arabelleğe almalar oluşursa oynatıcı, canlı kenardan uzaklaşmak için oynatmayı biraz yavaşlatır. Ağ daha sonra canlı uça daha yakın bir yerde oynamayı destekleyecek kadar stabil hale gelirse oynatıcı, hedef canlı ofsete doğru geri gitmek için oynatmayı hızlandırır.

Otomatik oynatma hızı ayarlaması istenmiyorsa minPlaybackSpeed ve maxPlaybackSpeed özellikleri 1.0f olarak ayarlanarak devre dışı bırakılabilir. Benzer şekilde, düşük gecikmeli olmayan canlı yayınlar için bunları açık bir şekilde 1.0f dışındaki değerlere ayarlayarak etkinleştirilebilir. Bu özelliklerin nasıl ayarlanabileceği hakkında 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 ayarlamaların yapıldığını tanımlar. Özel bir LivePlaybackSpeedControl uygulamak veya DefaultLivePlaybackSpeedControl olan varsayılan uygulamayı özelleştirmek mümkündür. Her iki durumda da oynatıcıyı oluştururken 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 öğesinin ilgili özelleştirme parametreleri:

  • fallbackMinPlaybackSpeed ve fallbackMaxPlaybackSpeed: Ne medya ne de uygulama tarafından sağlanan MediaItem sınır tanımlamıyorsa ayarlama için kullanılabilecek minimum ve maksimum oynatma hızları.
  • proportionalControlFactor: Hız ayarlamasının ne kadar sorunsuz olduğunu kontrol eder. Yüksek bir değer, ayarlamaları daha ani ve duyarlı hale getirir ancak aynı zamanda sesli olma olasılığını da artırır. Değer küçüldükçe hızlar arasında daha yavaş geçiş sağlanır.
  • targetLiveOffsetIncrementOnRebufferMs: Daha dikkatli bir şekilde ilerlemek için, bir yeniden arabellek gerçekleştiğinde bu değer hedef canlı ofsete eklenir. Bu özellik, değer 0 olarak ayarlanarak devre dışı bırakılabilir.
  • minPossibleLiveOffsetSmoothingFactor: Şu anda arabelleğe alınmış medyaya göre olası minimum canlı ofseti izlemek için kullanılan üstel yumuşatma faktörü. 1'e çok yakın bir değer, tahminin daha dikkatli olduğu ve iyileştirilmiş ağ koşullarına uyum sağlamasının daha uzun sürebileceğini ifade eder. Düşük değer ise tahminin yeniden arabelleklerle karşılaşma riskinin daha yüksek olduğu anlamına gelir.

BehindLiveWindowException ve ERROR_CODE_BACK_LIVE_WINDOW

Oynatma konumu, (örneğin, oynatıcı yeterince uzun bir süre duraklatılır veya arabelleğe alınırsa) canlı pencerenin gerisinde kalabilir. Bu durumda, oynatma başarısız olur ve Player.Listener.onPlayerError aracılığıyla ERROR_CODE_BEHIND_LIVE_WINDOW hata koduna sahip bir istisna bildirilir. Uygulama kodu, oynatmayı varsayılan konumda devam ettirerek bu tür hataları işlemek isteyebilir. Demo uygulamanın PlayerActivity öğesi, bu yaklaşımı göstermektedir.

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
  }
}