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 pencerede yer alır ve çoğu durumda akışın oluşturulduğu anki gerçek zamanlı konumun yakınında olur. Mevcut gerçek zamanlı konum ile oynatma konumu arasındaki farka canlı yayın telafisi 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ılı bilgi 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 (varsa) arasındaki farkı döndürür.
  • Player.getDuration, geçerli canlı yayın 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, 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, mevcut 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 Epoch'tan bu yana 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ı pencerenin, oynatmanın başlaması gereken varsayılan bir konumu da vardır. 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 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ı 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 telafi ayarlandığında bile oynatma sırasında bu telafinin 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ındaki gecikmeyi ayarlar. Oynatıcı, medya veya uygulama tarafından sağlanan hedef canlı ofsetle 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ı yayının sonundan 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: 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 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, daha yavaş olma pahasına hızlar arasında daha yumuşak bir geçiş sağlar.
  • 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 minimum 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 işlemeyi tercih edebilir. 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
  }
}