ExoPlayer, वीडियो चलाने से जुड़े आंकड़ों की कई तरह की ज़रूरतों को पूरा करता है. आखिरकार, Analytics का मतलब है डेटा को इकट्ठा करना, उसे समझना, इकट्ठा करना, और उसके बारे में खास जानकारी वीडियो चलाए जाते हैं. इस डेटा का इस्तेमाल या तो डिवाइस पर किया जा सकता है—उदाहरण के लिए लॉग इन करना, डीबग करना या आने वाले समय में वीडियो चलाने के फ़ैसले के बारे में जानकारी देना—या सभी डिवाइस पर प्लेबैक की निगरानी करने के लिए सर्वर.
आम तौर पर, आंकड़ों से जुड़े सिस्टम को पहले इवेंट इकट्ठा करने होते हैं और उसके बाद उन्हें प्रोसेस करना होता है ताकि उन्हें काम का बनाया जा सके:
- इवेंट कलेक्शन:
ऐसा
ExoPlayer
परAnalyticsListener
को रजिस्टर करके किया जा सकता है इंस्टेंस. रजिस्टर किए गए आंकड़ों को सुनने वालों को, इवेंट के दौरान ही मिलता है प्लेयर का इस्तेमाल कैसे करते हैं. हर इवेंट, उससे जुड़े मीडिया से जुड़ा होता है प्लेलिस्ट में मौजूद आइटम, वीडियो चलाने की स्थिति, और टाइमस्टैंप मेटाडेटा भी शामिल है. - इवेंट की प्रोसेसिंग:
आंकड़ों के कुछ सिस्टम, सभी इवेंट के साथ रॉ इवेंट को सर्वर पर अपलोड करते हैं
सर्वर-साइड की प्रोसेसिंग की गई. साथ ही, उन इवेंट को प्रोसेस करना भी मुमकिन है
कर सकते हैं और ऐसा करना आसान हो सकता है या
इसे अपलोड करना ज़रूरी है. ExoPlayer पर
PlaybackStatsListener
की सुविधा मिलती है, जो इसकी मदद से, प्रोसेसिंग के ये चरण पूरे किए जा सकते हैं:- इवेंट की जानकारी: आंकड़े जुटाने के लिए, इवेंट की ज़रूरी शर्तें
जिसे किसी एक प्लेबैक के संदर्भ में समझा जा सकता है. उदाहरण के लिए रॉ
खिलाड़ी की स्थिति
STATE_BUFFERING
में बदलने का इवेंट इससे जुड़ा हो सकता है शुरुआती बफ़रिंग, रेबफ़र या बफ़रिंग की सुविधा का इस्तेमाल किया जाता है. - स्टेट ट्रैकिंग: यह चरण, इवेंट को काउंटर में बदल देता है. उदाहरण के लिए, राज्य में होने वाले बदलावों के इवेंट को काउंटर में बदला जा सकता है. इससे यह पता किया जा सकता है कि कितना समय का इस्तेमाल किया गया है. इससे मिले नतीजे, Analytics डेटा का बुनियादी सेट होते हैं सिंगल प्लेबैक की वैल्यू दी गई है.
- एग्रीगेशन: इस चरण में कई सारे ऐनलिटिक्स डेटा को एक साथ जोड़ा जाता है आम तौर पर, काउंटर जोड़कर वीडियो देखे जा सकते हैं.
- खास जानकारी वाली मेट्रिक का हिसाब लगाना: सबसे काम की मेट्रिक में से कई वे औसत वैल्यू कैलकुलेट की जाती हैं या बेसिक ऐनलिटिक्स डेटा वैल्यू को एक साथ जोड़ा जाता है काम करता है. खास जानकारी वाली मेट्रिक को एक या एक से ज़्यादा के लिए कैलकुलेट किया जा सकता है प्लेबैक.
- इवेंट की जानकारी: आंकड़े जुटाने के लिए, इवेंट की ज़रूरी शर्तें
जिसे किसी एक प्लेबैक के संदर्भ में समझा जा सकता है. उदाहरण के लिए रॉ
खिलाड़ी की स्थिति
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();