ExoPlayer, çoğu uyarlanabilir canlı yayını herhangi bir özel yapılandırma olmadan kullanıma hazır şekilde oynatır. Daha fazla bilgi için Desteklenen Biçimler sayfasını inceleyin.
Uyarlanabilir canlı yayınlar, mevcut gerçek zamanlı akışla birlikte hareket etmek için düzenli aralıklarla güncellenen bir medya penceresi sunar. Bu, oynatma konumunun her zaman bu pencerede bir yerde olacağı ve çoğu durumda yayının üretildiği mevcut gerçek zamana yakın olacağı anlamına gelir. Mevcut gerçek zaman ile oynatma konumu arasındaki farka canlı ofset denir.
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 gösterilen çeşitli Player ve Timeline.Window yöntemlerini sorgulayarak mevcut canlı oynatmayla ilgili ayrıntıları alabilirsiniz.
Player.isCurrentWindowLive, o anda oynatılan medya öğesinin canlı yayın olup olmadığını gösterir. Canlı yayın sona ermiş olsa bile bu değer doğru olmaya devam eder.Player.isCurrentWindowDynamic, oynatılmakta olan medya öğesinin hâlâ güncellenip güncellenmediğ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, geçerli gerçek zaman ile oynatma konumu (varsa) arasındaki farkı döndürür.Player.getDuration, mevcut 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.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, geçerli medya yapısını birTimelineiçinde döndürür. MevcutTimeline.Window,Player.getCurrentMediaItemIndexveTimeline.getWindowkullanılarakTimelinekaynağından alınabilir.Windowiçinde:Window.liveConfiguration, hedef canlı ofset ve canlı ofset ayarlama parametrelerini içerir. Bu değerler, medyadaki bilgilere veMediaItem.liveConfigurationiçinde ayarlanan, uygulama tarafından sağlanan geçersiz kılmalara dayanır.Window.windowStartTimeMs, canlı pencerenin başladığı Unix epoch'tan bu yana geçen süredir.Window.getCurrentUnixTimeMs, geçerli gerçek zamanın Unix epoch'undan 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ı penceredeki konumdur.
Canlı yayınlarda ileri/geri sarma
Player.seekTo tuşunu kullanarak canlı pencerede istediğiniz yere gidebilirsiniz. Geçirilen arama konumu, canlı pencerenin başlangıcına göredir. Örneğin,
seekTo(0), canlı pencerenin başına sarar. Oynatıcı, arama işleminden sonra aranan konumla aynı canlı ofseti korumaya çalışır.
Canlı pencerenin, oynatmanın başlaması gereken varsayılan bir konumu da vardır. Bu konum genellikle canlı yayının sonuna 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 içindeki mevcut oynatma konumunu gösterir. Bu, canlı pencere her güncellendiğinde konumun geriye atladığı anlamına gelir. Farklı bir davranışa ihtiyacınız varsa (ör. Unix epoch zamanını veya mevcut canlı ofseti gösterme) PlayerControlView öğesini çatallayabilir ve ihtiyaçlarınıza göre değiştirebilirsiniz.
Canlı oynatma parametrelerini yapılandırma
ExoPlayer, oynatma konumunun canlı yayının sonundan uzaklığını ve bu uzaklığı 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. Öncelik sırasına göre (bulunan ilk değer kullanılır):
MediaItem.Builder.setLiveConfigurationiçin iletilenMediaItemdeğerleri.- Global varsayılan değerler
DefaultMediaSourceFactorytarihinde ayarlandı. - 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ı ofset. Oynatıcı, mümkünse oynatma sırasında bu canlı ofsete yaklaşmaya çalışır.minOffsetMs: İzin verilen minimum canlı ofset. Ofset, mevcut 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. Ofset, mevcut ağ koşullarına göre ayarlanırken bile oynatıcı, oynatma sırasında bu ofseti aşmaya çalışmaz.minPlaybackSpeed: Oynatıcının, hedef canlı ofsete ulaşmaya çalışırken geri dönmek için kullanabileceği minimum oynatma hızı.maxPlaybackSpeed: Oynatıcının, hedef canlı ofsete ulaşmaya çalışırken arayı kapatmak 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ı 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 fazla uzaklaşmak için oynatmayı biraz yavaşlatır. Ağ, canlı yayına daha yakın bir noktada oynatmayı destekleyecek kadar kararlı hale gelirse oynatıcı, oynatma hızını artırarak hedef canlı yayına doğru geri döner.
Otomatik oynatma hızı ayarlaması gerekmiyorsa minPlaybackSpeed ve maxPlaybackSpeed özellikleri 1.0f olarak ayarlanarak devre dışı bırakılabilir.
Benzer şekilde, bu değerler açıkça 1.0f dışında bir değere ayarlanarak düşük gecikmeli olmayan canlı yayınlar için de etkinleştirilebilir. Bu özelliklerin nasıl ayarlanabileceği hakkında daha fazla bilgi için yapılandırma bölümüne bakın.
Oynatma hızı ayarlama algoritmasını özelleştirme
Hız ayarlama etkinleştirilirse LivePlaybackSpeedControl, hangi ayarlamaları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:
fallbackMinPlaybackSpeedvefallbackMaxPlaybackSpeed: Ne medya ne de uygulama tarafından sağlananMediaItemsınırları tanımlamadığında ayarlama için kullanılabilecek minimum ve maksimum oynatma hızları.proportionalControlFactor: Hız ayarının ne kadar yumuşak olduğunu kontrol eder. Yüksek bir değer, ayarlamaları daha ani ve tepkisel hale getirir ancak aynı zamanda duyulma 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 daha yavaş olur.targetLiveOffsetIncrementOnRebufferMs: Bu değer, daha dikkatli ilerlemek için her yeniden arabelleğe alma işlemi 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ınmış medyaya göre mümkün olan minimum canlı ofseti izlemek için kullanılan üstel düzeltme faktörü. 1'e çok yakın bir değer, tahminin daha temkinli olduğu ve iyileştirilmiş 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ı uyum sağlayacağı ancak yeniden arabelleğe alma riskinin daha yüksek olacağı anlamına gelir.
BehindLiveWindowException ve ERROR_CODE_BEHIND_LIVE_WINDOW
Oynatma konumu, akış aralığının gerisinde kalabilir. Örneğin, oynatıcı yeterince uzun bir süre duraklatılırsa veya arabelleğe alınırsa bu durum yaşanabilir. Bu durumda oynatma başarısız olur ve Player.Listener.onPlayerError kullanılarak ERROR_CODE_BEHIND_LIVE_WINDOW hata kodunu içeren bir istisna bildirilir. Bu tür hataları, oynatmayı varsayılan konumda devam ettirerek giderebilirsiniz. Demo uygulamanı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 } }