إنشاء سجلّ لتصحيح الخلل

يسجِّل ExoPlayer الأخطاء فقط تلقائيًا. لتسجيل أحداث اللاعبين، يمكن استخدام فئة EventLogger. ويمكن أن تكون عمليات التسجيل الإضافية التي يوفّرها مفيدة لفهم ما يفعله المشغّل، بالإضافة إلى تصحيح أخطاء تشغيل المحتوى. ينفذ EventLogger AnalyticsListener، لذا من السهل تسجيل مثيل باستخدام ExoPlayer:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

إنّ أسهل طريقة لمراقبة السجلّ هي استخدام علامة التبويب logcat في Android Studio. يمكنك اختيار تطبيقك كعملية يمكن تصحيح أخطاءها حسب اسم الحزمة ( androidx.media3.demo.main في حال استخدام التطبيق التجريبي) وتوجيه علامة تبويب logcat لتسجيل هذا التطبيق فقط من خلال اختيار عرض التطبيق المحدّد فقط. يمكن فلترة التسجيلات بشكل أكبر باستخدام التعبير EventLogger|ExoPlayerImpl، للحصول على التسجيلات من EventLogger وال مشغّل نفسه فقط.

يمكنك استخدام وحدة التحكّم كبديل لعلامة التبويب logcat في Android Studio. على سبيل المثال:

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]

يشير سطر السجلّ هذا إلى أنّ المشغّل بدّل إلى مسار الفيديو بدرجة دقة 640×360 بعد مرور ثلاث ثوانٍ على تشغيل الوسائط.

اختيار برنامج فك الترميز

في معظم الحالات، يعرض ExoPlayer الوسائط باستخدام 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]