Analytics

ExoPlayer, वीडियो चलाने से जुड़े आंकड़ों की कई तरह की ज़रूरतों को पूरा करता है. आखिरकार, Analytics का मतलब है डेटा को इकट्ठा करना, उसे समझना, इकट्ठा करना, और उसके बारे में खास जानकारी वीडियो चलाए जाते हैं. इस डेटा का इस्तेमाल या तो डिवाइस पर किया जा सकता है—उदाहरण के लिए लॉग इन करना, डीबग करना या आने वाले समय में वीडियो चलाने के फ़ैसले के बारे में जानकारी देना—या सभी डिवाइस पर प्लेबैक की निगरानी करने के लिए सर्वर.

आम तौर पर, आंकड़ों से जुड़े सिस्टम को पहले इवेंट इकट्ठा करने होते हैं और उसके बाद उन्हें प्रोसेस करना होता है ताकि उन्हें काम का बनाया जा सके:

  • इवेंट कलेक्शन: ऐसा ExoPlayer पर AnalyticsListener को रजिस्टर करके किया जा सकता है इंस्टेंस. रजिस्टर किए गए आंकड़ों को सुनने वालों को, इवेंट के दौरान ही मिलता है प्लेयर का इस्तेमाल कैसे करते हैं. हर इवेंट, उससे जुड़े मीडिया से जुड़ा होता है प्लेलिस्ट में मौजूद आइटम, वीडियो चलाने की स्थिति, और टाइमस्टैंप मेटाडेटा भी शामिल है.
  • इवेंट की प्रोसेसिंग: आंकड़ों के कुछ सिस्टम, सभी इवेंट के साथ रॉ इवेंट को सर्वर पर अपलोड करते हैं सर्वर-साइड की प्रोसेसिंग की गई. साथ ही, उन इवेंट को प्रोसेस करना भी मुमकिन है कर सकते हैं और ऐसा करना आसान हो सकता है या इसे अपलोड करना ज़रूरी है. ExoPlayer पर PlaybackStatsListener की सुविधा मिलती है, जो इसकी मदद से, प्रोसेसिंग के ये चरण पूरे किए जा सकते हैं:
    1. इवेंट की जानकारी: आंकड़े जुटाने के लिए, इवेंट की ज़रूरी शर्तें जिसे किसी एक प्लेबैक के संदर्भ में समझा जा सकता है. उदाहरण के लिए रॉ खिलाड़ी की स्थिति STATE_BUFFERING में बदलने का इवेंट इससे जुड़ा हो सकता है शुरुआती बफ़रिंग, रेबफ़र या बफ़रिंग की सुविधा का इस्तेमाल किया जाता है.
    2. स्टेट ट्रैकिंग: यह चरण, इवेंट को काउंटर में बदल देता है. उदाहरण के लिए, राज्य में होने वाले बदलावों के इवेंट को काउंटर में बदला जा सकता है. इससे यह पता किया जा सकता है कि कितना समय का इस्तेमाल किया गया है. इससे मिले नतीजे, Analytics डेटा का बुनियादी सेट होते हैं सिंगल प्लेबैक की वैल्यू दी गई है.
    3. एग्रीगेशन: इस चरण में कई सारे ऐनलिटिक्स डेटा को एक साथ जोड़ा जाता है आम तौर पर, काउंटर जोड़कर वीडियो देखे जा सकते हैं.
    4. खास जानकारी वाली मेट्रिक का हिसाब लगाना: सबसे काम की मेट्रिक में से कई वे औसत वैल्यू कैलकुलेट की जाती हैं या बेसिक ऐनलिटिक्स डेटा वैल्यू को एक साथ जोड़ा जाता है काम करता है. खास जानकारी वाली मेट्रिक को एक या एक से ज़्यादा के लिए कैलकुलेट किया जा सकता है प्लेबैक.

AnalyticsListener के साथ इवेंट कलेक्शन

प्लेयर के रॉ प्लेबैक इवेंट की जानकारी AnalyticsListener को दी जाती है लागू करना. आसानी से अपना लिसनर जोड़ा जा सकता है और सिर्फ़ इन तरीकों में आपकी दिलचस्पी है:

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) {}
    });

हर कॉलबैक को पास किया जाने वाला EventTime, इवेंट को किसी मीडिया से जोड़ता है प्लेलिस्ट में मौजूद आइटम, वीडियो चलाने की स्थिति, और टाइमस्टैंप मेटाडेटा:

  • realtimeMs: इवेंट की वॉल क्लॉक का समय.
  • timeline, windowIndex, और mediaPeriodId: प्लेलिस्ट और प्लेलिस्ट में आइटम जोड़ें, जिससे इवेंट जुड़ा है. mediaPeriodId इसमें वैकल्पिक अतिरिक्त जानकारी शामिल है, उदाहरण के लिए, जो बताता है कि इवेंट, आइटम में मौजूद किसी विज्ञापन से जुड़ा है.
  • eventPlaybackPositionMs: इवेंट के दौरान, आइटम को चलाने की स्थिति हुआ.
  • currentTimeline, currentWindowIndex, currentMediaPeriodId, और currentPlaybackPositionMs: जैसा कि ऊपर है, लेकिन अभी चल रहे आइटम के लिए. कॉन्टेंट बनाने वर्तमान में चल रहा आइटम उस आइटम से अलग हो सकता है, जिसके लिए इवेंट चल रहा है उदाहरण के लिए, जब इवेंट अगले इवेंट के प्री-बफ़रिंग से जुड़ा हो चलाने के लिए आइटम.

PLAYStatsListener के साथ इवेंट की प्रोसेसिंग

PlaybackStatsListener एक AnalyticsListener है, जो डिवाइस पर लागू करता है इवेंट प्रोसेसिंग. यह काउंटर और डिराइव्ड के साथ PlaybackStats की गणना करता है मेट्रिक, जिनमें ये शामिल हैं:

  • खास जानकारी वाली मेट्रिक, जैसे कि वीडियो चलाने का कुल समय.
  • अडैप्टिव प्लेबैक क्वालिटी से जुड़ी मेट्रिक, जैसे कि वीडियो का औसत रिज़ॉल्यूशन.
  • क्वालिटी मेट्रिक रेंडर करना, जैसे कि छोड़े गए फ़्रेम की दर.
  • संसाधन के इस्तेमाल से जुड़ी मेट्रिक, जैसे कि नेटवर्क पर पढ़े गए बाइट की संख्या.

आपको PlaybackStats Javaडॉक.

PlaybackStatsListener हर मीडिया आइटम के लिए अलग-अलग PlaybackStats का हिसाब लगाता है और साथ ही इन आइटम में हर क्लाइंट-साइड विज्ञापन डाला गया. आपने लोगों तक पहुंचाया मुफ़्त में PlaybackStatsListener को कॉलबैक उपलब्ध करा सकता है, ताकि उन्हें यह जानकारी मिल सके कि पेमेंट की प्रोसेस पूरी हो गई है और कॉलबैक को पास किए गए EventTime का इस्तेमाल करके, यह पता लगाएं कि प्लेबैक खत्म हो गया. आंकड़ों का डेटा इकट्ठा किया जा सकता है, एक से ज़्यादा वीडियो चलाने की सुविधा मिलती है. यह जानकारी पाने के लिए, PlaybackStats से क्वेरी की जा सकती है इसका इस्तेमाल करके किसी भी समय मौजूदा प्लेबैक सेशन 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 का कंस्ट्रक्टर, फ़ुल प्रोसेस इवेंट का इतिहास. ध्यान दें कि इससे एक अज्ञात मेमोरी ओवरहेड हो सकता है प्लेबैक की अवधि और इवेंट की संख्या के हिसाब से. इसलिए, आपने इसे तभी चालू करना चाहिए, जब आपको प्रोसेस किए गए वीडियो का पूरा इतिहास ऐक्सेस करने की ज़रूरत हो इवेंट की तुलना करें.

ध्यान दें कि PlaybackStats, राज्यों के बड़े सेट का इस्तेमाल करता है. इससे न सिर्फ़ यह पता चलता है कि मीडिया की स्थिति, लेकिन उन्हें चलाने का इरादा और ज़्यादा जानकारी वीडियो चलाने में रुकावट क्यों आई थी या क्यों खत्म हुई, जैसी जानकारी:

वीडियो चलाने की स्थिति उपयोगकर्ता का इरादा खेलना खेलने का कोई इरादा नहीं है
वीडियो चलाने से पहले JOINING_FOREGROUND NOT_STARTED, JOINING_BACKGROUND
प्लेबैक चालू है PLAYING
बिना रुकावट के वीडियो चलाएं BUFFERING, SEEKING PAUSED, PAUSED_BUFFERING, SUPPRESSED, SUPPRESSED_BUFFERING, INTERRUPTED_BY_AD
खत्म होने की स्थितियां ENDED, STOPPED, FAILED, ABANDONED

जब उपयोगकर्ता गेम में खेलना चाहता है, तो यह ज़रूरी है कि वह दोनों उन मौकों में अंतर कर सके जब उपयोगकर्ता लगातार इंतज़ार कर रहे हैं, ताकि आराम से इंतज़ार किया जा सके. उदाहरण के लिए, PlaybackStats.getTotalWaitTimeMs, इसमें बिताया गया कुल समय दिखाता है JOINING_FOREGROUND, BUFFERING, और SEEKING राज्य हैं, लेकिन वह समय नहीं जब प्लेबैक को रोक दिया गया था. इसी तरह, PlaybackStats.getTotalPlayAndWaitTimeMs जो उपयोगकर्ता के खेलने के इरादे से कुल समय के बारे में बताता है, वह कुल सक्रिय इंतज़ार का समय और PLAYING की स्थिति में बिताया गया कुल समय.

प्रोसेस किए गए और इंटरप्रेटेड इवेंट

PlaybackStatsListener का इस्तेमाल करके, प्रोसेस किए गए और इंटरप्रेटेड इवेंट को रिकॉर्ड किया जा सकता है keepHistory=true के साथ. नतीजे देने वाले PlaybackStats में इवेंट की ये सूचियां देखें:

  • playbackStateHistory: वीडियो चलाने की बढ़ी हुई स्थितियों की क्रम वाली सूची, जिसमें वीडियो चलाने की सुविधा शामिल है EventTime जिस पर उन्होंने आवेदन करना शुरू किया था. Google आपके यूआरएल पैरामीटर को कैसे इस्तेमाल करेगा, यह तय करने के लिए किसी वॉल पर राज्य देखने के लिए, PlaybackStats.getPlaybackStateAtTime घड़ी का समय.
  • mediaTimeHistory: दीवार पर लगे समय और मीडिया के समय के पेयर का इतिहास, जो आपको चलते हैं मीडिया के कौनसे हिस्से चलाए गए थे, इसे फिर से तैयार किया जा सकता है. आप प्लेबैक देखने के लिए भी PlaybackStats.getMediaTimeMsAtRealtimeMs का इस्तेमाल करें आपके विज्ञापन को उसकी पोज़िशन के हिसाब से तय किया जाता है.
  • videoFormatHistory और audioFormatHistory: वीडियो की क्रम वाली सूचियां और वीडियो चलाने के दौरान इस्तेमाल किए गए ऑडियो फ़ॉर्मैट, जब EventTime पर शुरू किया गया था इन सुझावों का इस्तेमाल किया जा सकता है.
  • fatalErrorHistory और nonFatalErrorHistory: घातक और EventTime से जुड़ी साधारण गड़बड़ियां, जिस पर वे हुई थीं. घातक त्रुटियां हैं जिनसे प्लेबैक खत्म हो गया, जबकि साधारण गड़बड़ियां ठीक की जा सकती थीं.

सिंगल-प्लेबैक ऐनलिटिक्स डेटा

PlaybackStatsListener का इस्तेमाल करने पर, यह डेटा अपने-आप इकट्ठा हो जाता है. यहां तक कि keepHistory=false के साथ. आखिरी वैल्यू वे सार्वजनिक फ़ील्ड हैं जिन्हें आपके पास PlaybackStats Javadoc और प्लेबैक स्थिति अवधि में ढूंढें getPlaybackStateDurationMs की ओर से लौटाया गया. सुविधा के लिए, आपको getTotalPlayTimeMs और getTotalWaitTimeMs जैसे तरीके जो नतीजे के तौर पर प्लेबैक की स्थिति के किसी खास कॉम्बिनेशन की अवधि.

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);

कई बार चलाए गए वीडियो के आंकड़ों का कुल डेटा

कई PlaybackStats को एक साथ जोड़ा जा सकता है. इसके लिए, आपको कॉल करना होगा PlaybackStats.merge. नतीजे देने वाले PlaybackStats में एग्रीगेट किया गया डेटा शामिल होगा मर्ज किए गए सभी प्लेबैक का डेटा. ध्यान दें कि इसमें का इतिहास शामिल नहीं होगा अलग-अलग प्लेबैक इवेंट सेट अप कर सकते हैं, क्योंकि इन्हें इकट्ठा नहीं किया जा सकता.

PlaybackStatsListener.getCombinedPlaybackStats का इस्तेमाल इस अवधि के दौरान इकट्ठा किए गए सभी आंकड़ों का डेटा एक ही जगह पर देखने की सुविधा PlaybackStatsListener.

कैलकुलेट की गई खास जानकारी वाली मेट्रिक

बुनियादी आंकड़ों के डेटा के अलावा, PlaybackStats कई तरीके का इस्तेमाल समरी मेट्रिक को कैलकुलेट करने के लिए किया जाता है.

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());

बेहतर विषय

आंकड़ों के डेटा को प्लेबैक मेटाडेटा के साथ जोड़ना

अलग-अलग वीडियो के आंकड़े इकट्ठा करते समय, प्लेबैक एनालिटिक्स डेटा को मीडिया खेला गया.

मीडिया के लिए खास मेटाडेटा को MediaItem.Builder.setTag के साथ सेट करने की सलाह दी जाती है. मीडिया टैग, रॉ इवेंट के लिए रिपोर्ट किए गए EventTime का हिस्सा है और जब PlaybackStats का काम पूरा हो गया है, इसलिए इसे मिलते-जुलते आंकड़ों का डेटा:

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.
    });

कस्टम ऐनलिटिक्स इवेंट की रिपोर्टिंग

अगर आपको Analytics डेटा में कस्टम इवेंट जोड़ने की ज़रूरत है, तो ये इवेंट आपके अपने डेटा स्ट्रक्चर में शामिल करते हैं और उन्हें रिपोर्ट की गई PlaybackStats बाद. अगर इससे मदद मिलती है, तो DefaultAnalyticsCollector की अवधि बढ़ाएं इससे, आपके कस्टम इवेंट के लिए EventTime इंस्टेंस जनरेट किए जा सकेंगे और उन्हें भेजा जा सकेगा पहले से रजिस्टर लिसनर के लिए भी ऐसा किया जा सकता है, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है.

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();