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.
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. BuradaMediaItem.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. MevcutTimeline.Window
,Player.getCurrentWindowIndex
veTimeline.getWindow
kullanılarakTimeline
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 veMediaItem.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 iletilenMediaItem
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
vefallbackMaxPlaybackSpeed
: Ne medya ne de uygulama tarafından sağlananMediaItem
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 } }