Logging debug

Secara default, ExoPlayer hanya mencatat error ke dalam log. Untuk mencatat peristiwa pemutar ke dalam log, class EventLogger dapat digunakan. Logging tambahan yang disediakan dapat membantu memahami tindakan pemutar, serta untuk men-debug masalah pemutaran. EventLogger mengimplementasikan AnalyticsListener, sehingga Anda dapat mendaftarkan instance dengan ExoPlayer:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Untuk mengamati log, gunakan 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 agar hanya mencatat log 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 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, tombol fitur yang aktif, dan modul ExoPlayer yang telah dimuat:

ExoPlayerImpl: Init 59a18ab [AndroidXMedia3/1.0.0-rc02] [flame, Pixel 4, Google, 33] [Canary:ON]
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 detik ke-10,4. Pemutaran berakhir sepuluh detik kemudian pada detik ke-20,4. Elemen umum dalam tanda kurung siku adalah:

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

Elemen terakhir di setiap baris menunjukkan nilai status yang dilaporkan.

Trek media

Informasi trek dicatat ke dalam log saat trek yang tersedia atau dipilih berubah. Hal ini terjadi setidaknya sekali di awal pemutaran. Contoh berikut menunjukkan pencatatan log trek untuk streaming 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 melebihi kemampuan perangkat, seperti yang ditunjukkan oleh supported=NO_EXCEEDS_CAPABILITIES. Pemutar beradaptasi di antara trek video yang dipilih selama pemutaran. Saat pemutar beradaptasi dari satu trek ke trek lainnya, hal ini dicatat dalam baris seperti berikut:

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 resolusi 640x360 tiga detik setelah media dimulai.

Pemilihan decoder

Umumnya, ExoPlayer merender media menggunakan MediaCodec yang diperoleh dari platform yang mendasarinya. Saat decoder diinisialisasi, hal ini dicatat dalam baris seperti ini:

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]