Analytics

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 bir AnalyticsListener 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:
    1. 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
    2. 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.
    3. Toplama: Bu adım, birden çok mülkten gelen analiz verilerini birleştirir. oynatma sayısını artırır.
    4. Ö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ı.

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 ve mediaPeriodId: 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 ve currentPlaybackPositionMs: 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çin PlaybackStats.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çin PlaybackStats.getMediaTimeMsAtRealtimeMs öğesini de kullanın belir bir konuma sahiptir.
  • videoFormatHistory ve audioFormatHistory: Videoların sıralı listeleri başlattıkları EventTime ile oynatma sırasında kullanılan ses biçimleri gerekiyor.
  • fatalErrorHistory ve nonFatalErrorHistory: Önemli ve önemli öğelerin sıralı listeleri gerçekleştiği EventTime 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();