Canlı yayın

ExoPlayer, çoğu uyarlanabilir canlı yayını özel bir yapılandırma gerektirmeden kutudan çıktığı haliyle oynatır. Daha fazla bilgi için Desteklenen Biçimler sayfasına bakın.

Uyarlanabilir canlı yayınlar, mevcut gerçek zamanla birlikte ilerlemek için düzenli aralıklarla güncellenen bir kullanılabilir medya penceresi sunar. Bu nedenle, oynatma konumu her zaman bu aralıkta olur ve çoğu durumda akışın üretildiği anki gerçek zamanlı konumun yakınında yer alır. Mevcut anlık yayın süresi ile oynatma konumu arasındaki farka canlı yayın farkı adı verilir.

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 hakkında ayrıntılar alabilirsiniz.

Canlı pencere

  • Player.isCurrentWindowLive, şu anda oynatılan medya öğesinin canlı yayın olup olmadığını gösterir. Canlı yayın sona erse bile bu değer doğru olmaya devam eder.
  • Player.isCurrentWindowDynamic, şu anda oynatılan medya öğesinin güncellenmeye devam edip etmediğini gösterir. 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 arasındaki farkı (varsa) döndürür.
  • Player.getDuration, geçerli canlı pencerenin uzunluğunu döndürür.
  • Player.getCurrentPosition, oynatma konumunu canlı pencerenin başlangıcına göre döndürür.
  • Player.getCurrentMediaItem, mevcut medya öğesini döndürür. Burada MediaItem.liveConfiguration, hedef canlı yayın ofseti ve canlı yayın ofseti ayarlama parametreleri için uygulama tarafından sağlanan geçersiz kılmaları içerir.
  • Player.getCurrentTimeline, geçerli medya yapısını Timeline içinde döndürür. Mevcut Timeline.Window, Player.getCurrentMediaItemIndex ve Timeline.getWindow kullanılarak Timeline kaynağından alınabilir. Window içinde:
    • Window.liveConfiguration, hedef canlı ofset ve canlı ofset ayarlama parametrelerini içerir. Bu değerler, medyada yer alan bilgilere ve MediaItem.liveConfiguration içinde ayarlanan, uygulama tarafından sağlanan geçersiz kılma işlemlerine dayanır.
    • Window.windowStartTimeMs, canlı pencerenin başladığı Unix Epoch'tan bu yana geçen süredir.
    • Window.getCurrentUnixTimeMs, mevcut gerçek zamanın Unix sıfır zamanından itibaren geçen süresidir. Bu değer, sunucu ile istemci arasındaki bilinen saat farkı ile düzeltilebilir.
    • Window.getDefaultPositionMs, oynatıcının varsayılan olarak oynatmaya başlayacağı canlı penceredeki konumdur.

Canlı yayınlarda geri sarma ve ileri sarma

Player.seekTo simgesini kullanarak canlı pencerede istediğiniz yere gidebilirsiniz. Geçirilen arama konumu, canlı pencerenin başlangıcına göre belirlenir. Örneğin, seekTo(0), canlı pencerenin başlangıcına gider. Oynatıcı, arama işleminden sonra aranan konumla aynı canlı yayın farkını korumaya çalışır.

Canlı pencerede, oynatmanın başlaması gereken varsayılan bir konum da bulunur. Bu konum genellikle canlı kenara yakın bir yerdedir. Player.seekToDefaultPosition işlevini çağırarak 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 bu penceredeki mevcut oynatma konumunu gösterir. Bu durumda, canlı pencere her güncellendiğinde konum geriye doğru atlıyormuş gibi görünür. Farklı bir davranışa (ör. Unix zamanını veya mevcut canlı yayın ofsetini gösterme) 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 olan uzaklığını ve bu uzaklığı ayarlamak için kullanılabilecek oynatma hızlarının aralığını kontrol etmek için bazı parametreler kullanır.

ExoPlayer, bu parametrelerin değerlerini üç yerden alır. Öncelik sırası azalan şekildedir (bulunan ilk değer kullanılır):

  • MediaItem başına MediaItem.Builder.setLiveConfiguration değerleri aktarılır.
  • DefaultMediaSourceFactory üzerinde ayarlanan varsayılan global 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ı yayın ofseti. Oynatıcı, oynatma sırasında mümkünse bu canlı ofsete yaklaşmaya çalışır.
  • minOffsetMs: İzin verilen minimum canlı yayın farkı. Oynatıcı, mevcut ağ koşullarına göre dengeleme ayarlanmış olsa bile oynatma sırasında bu dengelemenin altına inmeye çalışmaz.
  • maxOffsetMs: İzin verilen maksimum canlı yayın farkı. Oynatıcı, mevcut ağ koşullarına göre telafi ayarlanırken bile oynatma sırasında bu telafinin üzerine çıkmaya çalışmaz.
  • minPlaybackSpeed: Oynatıcının, hedef canlı uzaklığa ulaşmaya çalışırken geri dönmek için kullanabileceği minimum oynatma hızı.
  • maxPlaybackSpeed: Oynatıcının, hedef canlı uzaklığa ulaşmaya çalışırken yetişmek için kullanabileceği maksimum oynatma hızı.

Oynatma hızı ayarlaması

ExoPlayer, düşük gecikmeli bir canlı yayın oynatırken oynatma hızını biraz değiştirerek canlı yayın ofsetini ayarlar. Oynatıcı, medya veya uygulama tarafından sağlanan hedef canlı ofsetiyle eşleşmeye ç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 işlemi gerçekleşirse oynatıcı, canlı kenardan daha da uzaklaşmak için oynatmayı biraz yavaşlatır. Ağ, canlı yayına daha yakın oynatmayı destekleyecek kadar kararlı hale gelirse oynatıcı, hedef canlı yayın ofsetine geri dönmek için oynatmayı hızlandırır.

Otomatik oynatma hızı ayarı istenmiyorsa minPlaybackSpeed ve maxPlaybackSpeed özellikleri 1.0f olarak ayarlanarak devre dışı bırakılabilir. Benzer şekilde, bu değerler 1.0f dışında bir değere açıkça ayarlanarak düşük olmayan gecikmeli canlı yayınlarda da 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ı etkinleştirilirse LivePlaybackSpeedControl, hangi ayarlamaların yapılacağını tanımlar. Özel bir uygulama (LivePlaybackSpeedControl) 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: Ne medya ne de uygulama tarafından sağlanan MediaItem sınırları tanımlamıyorsa ayarlama için kullanılabilecek minimum ve maksimum oynatma hızları.
  • proportionalControlFactor: Hız ayarının ne kadar sorunsuz olacağını kontrol eder. Yüksek bir değer, ayarlamaları daha ani ve tepkisel hale getirir ancak duyulma olasılığı da artar. Daha küçük bir değer, hızlar arasında daha yumuşak bir geçiş sağlar ancak daha yavaştır.
  • targetLiveOffsetIncrementOnRebufferMs: Bu değer, daha dikkatli ilerlemek için yeniden arabelleğe alma işlemi her gerçekleştiğinde hedef canlı ofsetine 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 en düşük canlı yayın farkını izlemek için kullanılan üstel düzeltme faktörü. 1'e çok yakın bir değer, tahminin daha dikkatli olduğu ve gelişmiş ağ koşullarına uyum sağlamasının daha uzun sürebileceği anlamına gelir. Daha düşük bir değer ise tahminin daha hızlı ayarlanacağı ancak yeniden arabelleğe alma ile karşılaşma riskinin daha yüksek olacağı anlamına gelir.

BehindLiveWindowException ve ERROR_CODE_BEHIND_LIVE_WINDOW

Oynatıcı yeterince uzun bir süre duraklatılırsa veya arabelleğe alınırsa oynatma konumu canlı pencerenin gerisinde kalabilir. Bu durumda oynatma başarısız olur ve ERROR_CODE_BEHIND_LIVE_WINDOW hata kodlu bir istisna Player.Listener.onPlayerError üzerinden bildirilir. Uygulama kodu, bu tür hataları varsayılan konumda oynatmaya devam ederek ele almak isteyebilir. Demo uygulamasının PlayerActivity'si bu yaklaşıma örnek olarak verilebilir.

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