ExoPlayer, çok çeşitli oynatma analizi ihtiyaçlarını destekler. Sonuç olarak, Analytics verileri toplamak, yorumlamak, toplamak ve özetlemekle ilgilidir. oynatma listesinden çıkarım. Bu veriler cihazda kullanılabilir (örneğin, hata ayıklamak veya ilerideki oynatma kararlarını bildirmek ya da bir tüm cihazlardaki oynatmaları izlemesi için bir sunucu oluşturabilirsiniz.
Bir analiz sisteminin genellikle etkinlikleri önce toplaması ve ardından işlemesi gerekir. şu anlamlara gelir:
- Etkinlik koleksiyonu:
Bu,
ExoPlayer
üzerinde birAnalyticsListener
kaydedilerek yapılabilir kullanır. Kayıtlı analiz dinleyicileri, etkinlikleri gerçekleştiği sırada alır oynatıcıyı kullanır. Her etkinlik ilgili medya ile ilişkilendirilir oynatma konumu ve zaman damgası meta verilerinin yanı sıra oynatma listesindeki öğeleri de içerir. - Etkinlik işleme:
Bazı analiz sistemleri, ham etkinlikleri tüm etkinlik ile birlikte bir sunucuya yükler.
sunucu tarafında gerçekleştirilen
işlemlerin sayısını ifade eder. Ayrıca, etkinlikler
olabilir ve bunu yapmak daha basit olabilir ya da daha az bilgi
yüklenmesi gerekiyor. ExoPlayer,
PlaybackStatsListener
sağlar. aşağıdaki işleme adımlarını uygulamanızı sağlar:- Etkinlik yorumu: Analizde yararlı olması için etkinliklerin
değerlendirildiğinden emin olun. Örneğin ham
oyuncu durumunun
STATE_BUFFERING
olarak değişmesi bir aramadan sonra gerçekleşen ilk arabelleğe alma, yeniden arabelleğe alma veya arabelleğe alma - Durum izleme: Bu adım, etkinlikleri sayaçlara dönüştürür. Örneğin, durum değişikliği etkinlikleri, ne kadar sürenin izlendiğini izleyen sayaçlara dönüştürülebilir. her bir oynatma durumunda harcanıyor. Sonuç, temel bir analiz verisi kümesidir değerleri gösterilir.
- Toplama: Bu adım, birden çok mülkten gelen analiz verilerini birleştirir. oynatma sayısını artırır.
- Özet metriklerin hesaplanması: En yararlı metriklerin çoğu ortalamaları hesaplayan veya temel analiz veri değerlerini birleştirenler sağlayabilir. Özet metrikler bir veya daha fazla metrik için hesaplanabilir oynatma sayısı.
- Etkinlik yorumu: Analizde yararlı olması için etkinliklerin
değerlendirildiğinden emin olun. Örneğin ham
oyuncu durumunun
AnalyticsListener ile etkinlik koleksiyonu
Oynatıcıdaki ham oynatma etkinlikleri AnalyticsListener
adlı kullanıcıya bildirilir
hakkında bilgi edindiniz. Kendi işleyicinizi kolayca ekleyebilir ve yalnızca
ilginizi çeken yöntemler:
Kotlin
exoPlayer.addAnalyticsListener( object : AnalyticsListener { override fun onPlaybackStateChanged( eventTime: EventTime, @Player.State state: Int ) {} override fun onDroppedVideoFrames( eventTime: EventTime, droppedFrames: Int, elapsedMs: Long, ) {} } )
Java
exoPlayer.addAnalyticsListener( new AnalyticsListener() { @Override public void onPlaybackStateChanged( EventTime eventTime, @Player.State int state) {} @Override public void onDroppedVideoFrames( EventTime eventTime, int droppedFrames, long elapsedMs) {} });
Her geri çağırmaya iletilen EventTime
, etkinliği bir medya ile ilişkilendirir
öğesinin yanı sıra oynatma konumu ve zaman damgası meta verilerini de görürsünüz.
realtimeMs
: Etkinliğin gerçek hayattaki saati.timeline
,windowIndex
vemediaPeriodId
: Oynatma listesini ve öğe bulunur.mediaPeriodId
isteğe bağlı ek bilgiler içerir. Örneğin, etkinlik, öğe içindeki bir reklama aittir.eventPlaybackPositionMs
: Etkinlik sırasında öğedeki oynatma konumu meydana geldi.currentTimeline
,currentWindowIndex
,currentMediaPeriodId
vecurrentPlaybackPositionMs
: Yukarıdaki gibidir ancak şu anda oynatılan öğe içindir. İlgili içeriği oluşturmak için kullanılan oynatılan öğe, etkinliğin yapılacağı öğeden farklı olabilir bir diğerinin önceden arabelleğe alınmasına karşılık oynatılacak öğe var.
OynatmaStatsListener ile etkinlik işleme
PlaybackStatsListener
, cihaz üzerinde uygulanan bir AnalyticsListener
öğesidir
yardımcı olur. PlaybackStats
değerini sayaçlarla ve türetilmiş olarak hesaplar
aşağıdakileri içeren metrikler:
- Toplam oynatma süresi gibi özet metrikler
- Uyarlanabilir oynatma kalitesi metrikleri (ör. ortalama video çözünürlüğü).
- Oluşturma kalitesi metrikleri (ör. atlanan karelerin hızı).
- Ağ üzerinden okunan bayt sayısı gibi kaynak kullanım metrikleri.
Kullanılabilir sayıların ve türetilen metriklerin tam listesini
PlaybackStats
Javadoc.
PlaybackStatsListener
, her medya öğesi için ayrı PlaybackStats
hesaplar
ve bu öğelere eklenen her istemci taraflı reklam arasından seçim yapabilirsiniz. Siz
anketin tamamlanması hakkında bilgi edinmek için PlaybackStatsListener
adlı işletmeyi geri arayabilir
oynatır ve geri çağırmaya iletilen EventTime
yöntemini kullanarak hangi
oynatma sona erdi. Deneme için analiz verilerini toplamak
birden fazla oynatma. Ayrıca, aynı sunucu için PlaybackStats
mevcut oynatma oturumuna dair istediğiniz zaman
PlaybackStatsListener.getPlaybackStats()
.
Kotlin
exoPlayer.addAnalyticsListener( PlaybackStatsListener(/* keepHistory= */ true) { eventTime: EventTime?, playbackStats: PlaybackStats?, -> // Analytics data for the session started at `eventTime` is ready. } )
Java
exoPlayer.addAnalyticsListener( new PlaybackStatsListener( /* keepHistory= */ true, (eventTime, playbackStats) -> { // Analytics data for the session started at `eventTime` is ready. }));
PlaybackStatsListener
öğesinin oluşturucusu,
işlenen etkinliklerin geçmişi. Bu işlem, bilinmeyen bir ek bellek yüküne neden olabilir.
oynatmanın uzunluğuna ve etkinlik sayısına bağlı olarak değişebilir. Bu nedenle
bu seçeneği, yalnızca işlenen geçmişin tamamına erişmeniz gerektiğinde
ilişkilendirmesine yardımcı olur.
PlaybackStats
değerinin yalnızca
içeriği oynatıyor. Ayrıca kullanıcının içeriği oynatma niyetiyle
oynatmanın neden kesintiye uğradığı veya sona erdiği gibi bilgiler:
Oynatma durumu | Kullanıcının oynatma niyeti | Oynamak istemiyorum |
---|---|---|
Oynatmadan önce | JOINING_FOREGROUND |
NOT_STARTED , JOINING_BACKGROUND |
Etkin oynatma | PLAYING |
|
Kesintiye uğrayan oynatma | BUFFERING , SEEKING |
PAUSED , PAUSED_BUFFERING , SUPPRESSED , SUPPRESSED_BUFFERING , INTERRUPTED_BY_AD |
Bitiş durumları | ENDED , STOPPED , FAILED , ABANDONED |
Kullanıcının oynatma amacı, kullanıcının ne zaman oyun
pasif bekleme sürelerinden devam etmek için aktif olarak oynatmayı bekliyor. Örneğin,
PlaybackStats.getTotalWaitTimeMs
,
JOINING_FOREGROUND
, BUFFERING
ve SEEKING
eyaletleri, ancak geçerli olmayan zaman:
oynatma duraklatıldı. Benzer şekilde, PlaybackStats.getTotalPlayAndWaitTimeMs
kullanıcının oynamayı düşündüğü toplam süreyi döndürür. Bu, toplam etkin süreyi ifade eder
bekleme süresi ve PLAYING
durumunda harcanan toplam süre.
İşlenen ve yorumlanan etkinlikler
PlaybackStatsListener
kullanarak işlenen ve yorumlanan etkinlikleri kaydedebilirsiniz.
keepHistory=true
ile. Sonuçta ortaya çıkan PlaybackStats
, şunu içerir:
şu etkinlik listeleri:
playbackStateHistory
: Uzatılmış oynatma durumlarının sıralı listesi ve Başvurmaya başladıklarıEventTime
. Ayrıca şunu da kullanabilirsiniz: Belirli bir duvardaki durumu öğrenmek içinPlaybackStats.getPlaybackStateAtTime
saat alır.mediaTimeHistory
: Gerçekleşen süre ve medya zamanı çiftlerinin geçmiş verileri medyanın hangi bölümlerinin ne zaman oynatıldığını yeniden tasarlamanızı sağlar. Şunları yapabilirsiniz: oynatma listesini aramak içinPlaybackStats.getMediaTimeMsAtRealtimeMs
öğesini de kullanın belir bir konuma sahiptir.videoFormatHistory
veaudioFormatHistory
: Videoların sıralı listeleri başlattıklarıEventTime
ile oynatma sırasında kullanılan ses biçimleri gerekiyor.fatalErrorHistory
venonFatalErrorHistory
: Önemli ve önemli öğelerin sıralı listeleri gerçekleştiğiEventTime
ile ilgili önemli olmayan hatalar. Önemli hatalar: önemli olmayan hatalar kurtarılabilmiş olabilir.
Tek oynatma analiz verileri
PlaybackStatsListener
kullanıyorsanız bu veriler otomatik olarak toplanır.
keepHistory=false
ile. Nihai değerler, bu verileri istediğiniz zaman
PlaybackStats
Javadoc'ta ve oynatma durumu sürelerinde bulabilirsiniz
getPlaybackStateDurationMs
tarafından iade edildi. Size kolaylık olması açısından,
getTotalPlayTimeMs
ve getTotalWaitTimeMs
gibi yöntemleri kullanarak
belirli oynatma durumu kombinasyonlarının süresi
Kotlin
Log.d( "DEBUG", "Playback summary: " + "play time = " + playbackStats.totalPlayTimeMs + ", rebuffers = " + playbackStats.totalRebufferCount )
Java
Log.d( "DEBUG", "Playback summary: " + "play time = " + playbackStats.getTotalPlayTimeMs() + ", rebuffers = " + playbackStats.totalRebufferCount);
Birden fazla oynatmanın toplu analiz verileri
Şu numarayı arayarak birden fazla PlaybackStats
öğesini birleştirebilirsiniz:
PlaybackStats.merge
. Sonuçta ortaya çıkan PlaybackStats
, toplu halde
tüm birleştirilmiş oynatmaların verileri Projenin yaşam döngüsünü
tek tek oynatma etkinlikleri olduğundan bu etkinlikler toplanamaz.
PlaybackStatsListener.getCombinedPlaybackStats
,
bir veri analizi yaşam döngüsü boyunca toplanan tüm analiz verilerinin toplu
PlaybackStatsListener
.
Hesaplanmış özet metrikleri
PlaybackStats
, temel analiz verilerine ek olarak birçok yöntem sunar.
özet metrikleri hesaplamak için kullanılır.
Kotlin
Log.d( "DEBUG", "Additional calculated summary metrics: " + "average video bitrate = " + playbackStats.meanVideoFormatBitrate + ", mean time between rebuffers = " + playbackStats.meanTimeBetweenRebuffers )
Java
Log.d( "DEBUG", "Additional calculated summary metrics: " + "average video bitrate = " + playbackStats.getMeanVideoFormatBitrate() + ", mean time between rebuffers = " + playbackStats.getMeanTimeBetweenRebuffers());
İleri düzey konular
Analiz verilerini oynatma meta verileriyle ilişkilendirme
Ayrı ayrı oynatmalar için analiz verilerini toplarken, oynatma analizi verilerini, oynatılmakta olan medya ile ilgili meta verilerle ilişkilendirme oynandı.
Medyaya özel meta verilerin MediaItem.Builder.setTag
ile ayarlanması önerilir.
Medya etiketi, ham etkinlikler için veEventTime
PlaybackStats
tamamlandığından,
karşılık gelen analiz verileri:
Kotlin
PlaybackStatsListener(/* keepHistory= */ false) { eventTime: EventTime, playbackStats: PlaybackStats -> val mediaTag = eventTime.timeline .getWindow(eventTime.windowIndex, Timeline.Window()) .mediaItem .localConfiguration ?.tag // Report playbackStats with mediaTag metadata. }
Java
new PlaybackStatsListener( /* keepHistory= */ false, (eventTime, playbackStats) -> { Object mediaTag = eventTime.timeline.getWindow(eventTime.windowIndex, new Timeline.Window()) .mediaItem .localConfiguration .tag; // Report playbackStats with mediaTag metadata. });
Özel analiz etkinliklerini raporlama
Analiz verilerine özel etkinlikler eklemeniz gerekirse
ve bu etkinlikleri kendi veri yapınızda kullanarak raporlanan
PlaybackStats
sonra. Yardımcı olduysa DefaultAnalyticsCollector
süresini uzatabilirsiniz
Bu şekilde, özel etkinlikleriniz için EventTime
örnek oluşturabilir ve bunları
bunları halihazırda kayıtlı dinleyicilere aşağıdaki örnekte gösterildiği gibi gönderebilirsiniz.
Kotlin
private interface ExtendedListener : AnalyticsListener { fun onCustomEvent(eventTime: EventTime) } private class ExtendedCollector : DefaultAnalyticsCollector(Clock.DEFAULT) { fun customEvent() { val eventTime = generateCurrentPlayerMediaPeriodEventTime() sendEvent(eventTime, CUSTOM_EVENT_ID) { listener: AnalyticsListener -> if (listener is ExtendedListener) { listener.onCustomEvent(eventTime) } } } } // Usage - Setup and listener registration. val player = ExoPlayer.Builder(context).setAnalyticsCollector(ExtendedCollector()).build() player.addAnalyticsListener( object : ExtendedListener { override fun onCustomEvent(eventTime: EventTime?) { // Save custom event for analytics data. } } ) // Usage - Triggering the custom event. (player.analyticsCollector as ExtendedCollector).customEvent()
Java
private interface ExtendedListener extends AnalyticsListener { void onCustomEvent(EventTime eventTime); } private static class ExtendedCollector extends DefaultAnalyticsCollector { public ExtendedCollector() { super(Clock.DEFAULT); } public void customEvent() { AnalyticsListener.EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); sendEvent( eventTime, CUSTOM_EVENT_ID, listener -> { if (listener instanceof ExtendedListener) { ((ExtendedListener) listener).onCustomEvent(eventTime); } }); } } // Usage - Setup and listener registration. ExoPlayer player = new ExoPlayer.Builder(context).setAnalyticsCollector(new ExtendedCollector()).build(); player.addAnalyticsListener( (ExtendedListener) eventTime -> { // Save custom event for analytics data. }); // Usage - Triggering the custom event. ((ExtendedCollector) player.getAnalyticsCollector()).customEvent();