Logging debug

Secara default, ExoPlayer hanya mencatat error. Untuk mencatat peristiwa pemutar, class EventLogger dapat digunakan. Pencatatan tambahan yang diberikannya dapat membantu memahami tindakan pemain, serta untuk men-debug masalah pemutaran. EventLogger mengimplementasikan AnalyticsListener, sehingga mendaftarkan instance dengan ExoPlayer menjadi mudah:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Cara termudah untuk mengamati log adalah dengan menggunakan tab logcat Android Studio. Anda dapat memilih aplikasi sebagai proses yang dapat di-debug berdasarkan nama paket ( androidx.media3.demo.main jika menggunakan aplikasi demo) dan memberi tahu tab logcat untuk mencatat hanya untuk aplikasi tersebut dengan memilih show only selected application. Anda dapat memfilter logging lebih lanjut dengan ekspresi EventLogger|ExoPlayerImpl, untuk hanya mendapatkan logging dari EventLogger dan pemutar itu sendiri.

Alternatif untuk menggunakan tab logcat Android Studio adalah dengan menggunakan konsol. Contoh:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Informasi pemain

Class ExoPlayerImpl memberikan dua baris penting tentang versi pemutar, perangkat dan OS tempat aplikasi berjalan, serta modul ExoPlayer yang telah dimuat:

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]

Status pemutaran

Perubahan status pemutar dicatat dalam baris seperti ini:

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]

Dalam contoh ini, pemutaran dimulai 0,93 detik setelah pemutar disiapkan. Pengguna menjeda pemutaran setelah 9,4 detik, dan melanjutkan pemutaran satu detik kemudian pada 10,4 detik. Pemutaran berakhir sepuluh detik kemudian pada 20,4 detik. Elemen umum dalam tanda kurung siku adalah:

  • [eventTime=float]: Waktu jam dinding sejak pembuatan pemain.
  • [mediaPos=float]: Posisi pemutaran saat ini.
  • [window=int]: Indeks jendela saat ini.
  • [period=int]: Periode saat ini dalam jangka waktu tersebut.

Elemen terakhir di setiap baris menunjukkan nilai status yang dilaporkan.

Trek media

Informasi trek dicatat saat trek yang tersedia atau dipilih berubah. Hal ini terjadi setidaknya sekali di awal pemutaran. Contoh di bawah ini menunjukkan pencatatan log trek untuk aliran adaptif:

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: ]

Dalam contoh ini, pemutar telah memilih empat dari lima trek video yang tersedia. Trek video kelima tidak dipilih karena melampaui kemampuan perangkat, seperti yang ditunjukkan oleh supported=NO_EXCEEDS_CAPABILITIES. Pemutar akan beradaptasi di antara trek video yang dipilih selama pemutaran. Saat pemutar beradaptasi dari satu jalur ke jalur lain, hal ini dicatat dalam baris seperti di bawah:

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]

Baris log ini menunjukkan bahwa pemutar beralih ke trek video beresolusi 640x360 tiga detik setelah media dimulai.

Pemilihan dekoder

Dalam sebagian besar kasus, ExoPlayer merender media menggunakan MediaCodec yang diperoleh dari platform yang mendasarinya. Saat decoder diinisialisasi, hal ini dicatat dalam baris seperti berikut:

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]