डीबग लॉग करना

डिफ़ॉल्ट रूप से, ExoPlayer सिर्फ़ गड़बड़ियों को लॉग करता है. खिलाड़ी के इवेंट लॉग करने के लिए, EventLogger क्लास का इस्तेमाल किया जा सकता है. यह अतिरिक्त लॉगिंग की सुविधा देता है. इससे यह समझने में मदद मिल सकती है कि खिलाड़ी क्या कर रहा है. साथ ही, इससे वीडियो चलाने से जुड़ी समस्याओं को डीबग करने में भी मदद मिलती है. EventLogger, AnalyticsListener को लागू करता है. इसलिए, ExoPlayer के साथ किसी इंस्टेंस को रजिस्टर करना आसान है:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

लॉग देखने का सबसे आसान तरीका, Android Studio का logcat टैब इस्तेमाल करना है. पैकेज के नाम (डेमो ऐप्लिकेशन का इस्तेमाल करने पर androidx.media3.demo.main) के हिसाब से, अपने ऐप्लिकेशन को डीबग की जा सकने वाली प्रोसेस के तौर पर चुना जा सकता है. साथ ही, सिर्फ़ चुना गया ऐप्लिकेशन दिखाएं को चुनकर, logcat टैब को सिर्फ़ उस ऐप्लिकेशन के लिए लॉग करने के लिए कहा जा सकता है. EventLogger|ExoPlayerImpl एक्सप्रेशन का इस्तेमाल करके, लॉगिंग को और भी ज़्यादा फ़िल्टर किया जा सकता है. इससे सिर्फ़ EventLogger और प्लेयर से लॉगिंग मिलती है.

Android Studio के logcat टैब के बजाय, कंसोल का इस्तेमाल किया जा सकता है. उदाहरण के लिए:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

खिलाड़ी की जानकारी

ExoPlayerImpl क्लास, प्लेयर वर्शन के बारे में दो अहम लाइनें डिलीवर करती है. साथ ही, यह भी बताती है कि ऐप्लिकेशन किस डिवाइस और ओएस पर चल रहा है और ExoPlayer के कौनसे मॉड्यूल लोड किए गए हैं:

ExoPlayerImpl: Init 59a18ab [AndroidXMedia3/1.0.0-rc02] [flame, Pixel 4, Google, 33]
ExoPlayerImpl: Release 59a18ab [AndroidXMedia3/1.0.0-rc02] [flame, Pixel 4, Google, 33] [media3.common, media3.datasource, media3.ui, media3.exoplayer, media3.decoder, media3.exoplayer.dash, media3.extractor]

वीडियो चलने की स्थिति

खिलाड़ी की स्थिति में हुए बदलावों को इस तरह की लाइनों में लॉग किया जाता है:

EventLogger: playWhenReady [eventTime=0.00, mediaPos=0.00, window=0, true, USER_REQUEST]
EventLogger: state [eventTime=0.01, mediaPos=0.00, window=0, BUFFERING]
EventLogger: state [eventTime=0.93, mediaPos=0.00, window=0, period=0, READY]
EventLogger: isPlaying [eventTime=0.93, mediaPos=0.00, window=0, period=0, true]
EventLogger: playWhenReady [eventTime=9.40, mediaPos=8.40, window=0, period=0, false, USER_REQUEST]
EventLogger: isPlaying [eventTime=9.40, mediaPos=8.40, window=0, period=0, false]
EventLogger: playWhenReady [eventTime=10.40, mediaPos=8.40, window=0, period=0, true, USER_REQUEST]
EventLogger: isPlaying [eventTime=10.40, mediaPos=8.40, window=0, period=0, true]
EventLogger: state [eventTime=20.40, mediaPos=18.40, window=0, period=0, ENDED]
EventLogger: isPlaying [eventTime=20.40, mediaPos=18.40, window=0, period=0, false]

इस उदाहरण में, प्लेयर तैयार होने के 0.93 सेकंड बाद वीडियो चलना शुरू होता है. उपयोगकर्ता ने 9.4 सेकंड के बाद वीडियो को रोक दिया और एक सेकंड बाद, 10.4 सेकंड पर वीडियो को फिर से शुरू कर दिया. वीडियो 20.4 सेकंड पर खत्म हो जाता है. स्क्वेयर ब्रैकेट में मौजूद सामान्य एलिमेंट ये हैं:

  • [eventTime=float]: प्लेयर के बनाए जाने के बाद से, वॉल क्लॉक का समय.
  • [mediaPos=float]: वीडियो के चलने की मौजूदा स्थिति.
  • [window=int]: मौजूदा विंडो इंडेक्स.
  • [period=int]: उस विंडो में मौजूद मौजूदा अवधि.

हर लाइन में मौजूद आखिरी एलिमेंट, रिपोर्ट किए जा रहे स्टेटस की वैल्यू दिखाते हैं.

मीडिया ट्रैक

जब उपलब्ध या चुने गए ट्रैक बदलते हैं, तब ट्रैक की जानकारी लॉग की जाती है. ऐसा कम से कम एक बार, वीडियो चलाने की शुरुआत में होता है. नीचे दिए गए उदाहरण में, अडैप्टिव स्ट्रीम के लिए ट्रैक लॉगिंग को दिखाया गया है:

EventLogger: tracks [eventTime=0.30, mediaPos=0.00, window=0, period=0,
EventLogger:   group [
EventLogger:     [X] Track:0, id=133, mimeType=video/avc, bitrate=261112, codecs=avc1.4d4015, res=426x240, fps=30.0, supported=YES
EventLogger:     [X] Track:1, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0, supported=YES
EventLogger:     [X] Track:2, id=135, mimeType=video/avc, bitrate=1204535, codecs=avc1.4d401f, res=854x480, fps=30.0, supported=YES
EventLogger:     [X] Track:3, id=160, mimeType=video/avc, bitrate=112329, codecs=avc1.4d400c, res=256x144, fps=30.0, supported=YES
EventLogger:     [ ] Track:4, id=136, mimeType=video/avc, bitrate=2400538, codecs=avc1.4d401f, res=1280x720, fps=30.0, supported=NO_EXCEEDS_CAPABILITIES
EventLogger:   ]
EventLogger:   group [
EventLogger:     [ ] Track:0, id=139, mimeType=audio/mp4a-latm, bitrate=48582, codecs=mp4a.40.5, channels=2, sample_rate=22050, supported=YES
EventLogger:     [X] Track:1, id=140, mimeType=audio/mp4a-latm, bitrate=127868, codecs=mp4a.40.2, channels=2, sample_rate=44100, supported=YES
EventLogger:   ]
EventLogger: ]

इस उदाहरण में, प्लेयर ने उपलब्ध पांच वीडियो ट्रैक में से चार चुने हैं. पांचवें वीडियो ट्रैक को नहीं चुना गया है, क्योंकि यह डिवाइस की क्षमताओं से ज़्यादा है. इसकी जानकारी supported=NO_EXCEEDS_CAPABILITIES में दी गई है. वीडियो चलाने के दौरान, प्लेयर चुने गए वीडियो ट्रैक के बीच अडजस्ट होता रहेगा. जब प्लेयर एक ट्रैक से दूसरे ट्रैक पर अडैप्ट होता है, तो उसे नीचे दी गई लाइन की तरह लॉग किया जाता है:

EventLogger: downstreamFormat [eventTime=3.64, mediaPos=3.00, window=0, period=0, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0]

इस लॉग लाइन से पता चलता है कि मीडिया शुरू होने के तीन सेकंड बाद, प्लेयर 640x360 रिज़ॉल्यूशन वाले वीडियो ट्रैक पर स्विच हो गया.

डिकोडर चुनने की सुविधा

ज़्यादातर मामलों में, ExoPlayer मीडिया को रेंडर करने के लिए, MediaCodec का इस्तेमाल करता है. यह MediaCodec, प्लैटफ़ॉर्म से हासिल किया जाता है. जब किसी डिकोडर को शुरू किया जाता है, तब इसे इस तरह की लाइनों में लॉग किया जाता है:

EventLogger: videoDecoderInitialized [0.77, 0.00, window=0, period=0, video, OMX.qcom.video.decoder.avc]
EventLogger: audioDecoderInitialized [0.79, 0.00, window=0, period=0, audio, OMX.google.aac.decoder]