ثبت اشکال زدایی

به طور پیش‌فرض، ExoPlayer فقط خطاها را ثبت می‌کند. برای ثبت رویدادهای بازیکن، می‌توان از کلاس EventLogger استفاده کرد. ثبت وقایع اضافی که ارائه می‌دهد می‌تواند برای درک عملکرد بازیکن و همچنین برای اشکال‌زدایی مشکلات پخش مفید باشد. EventLogger از AnalyticsListener استفاده می‌کند، بنابراین ثبت یک نمونه با ExoPlayer آسان است:

کاتلین

player.addAnalyticsListener(EventLogger())

جاوا

player.addAnalyticsListener(new EventLogger());

ساده‌ترین راه برای مشاهده‌ی گزارش، استفاده از تب logcat اندروید استودیو است. می‌توانید برنامه‌ی خود را با نام بسته ( androidx.media3.demo.main در صورت استفاده از برنامه‌ی آزمایشی) به عنوان فرآیند قابل اشکال‌زدایی انتخاب کنید و با انتخاب گزینه‌ی show only selected application به تب logcat بگویید که فقط برای آن برنامه گزارش تهیه کند. می‌توان گزارش‌گیری را با استفاده از عبارت EventLogger|ExoPlayerImpl فیلتر کرد تا فقط گزارش‌گیری از EventLogger و خود پخش‌کننده انجام شود.

یک جایگزین برای استفاده از تب 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]

در این مثال، پخش ۰.۹۳ ثانیه پس از آماده شدن پخش‌کننده شروع می‌شود. کاربر پس از ۹.۴ ثانیه پخش را متوقف می‌کند و یک ثانیه بعد، در ۱۰.۴ ثانیه، پخش را از سر می‌گیرد. پخش ده ثانیه بعد، در ۲۰.۴ ثانیه، پایان می‌یابد. عناصر مشترک داخل کروشه عبارتند از:

  • [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]

این خط گزارش نشان می‌دهد که پخش‌کننده سه ثانیه پس از شروع پخش رسانه، به تراک ویدیویی با وضوح ۶۴۰x۳۶۰ تغییر وضعیت داده است.

انتخاب رمزگشا

در بیشتر موارد، 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]