ExoPlayer varsayılan olarak yalnızca hataları günlüğe kaydeder. Oyuncu etkinliklerini günlüğe kaydetmek için EventLogger
sınıfı kullanılabilir. Sağladığı ek günlükler, oyuncunun ne yaptığını anlamanın yanı sıra oynatma sorunlarını ayıklamak için de faydalı olabilir. EventLogger uygulandığı için ExoPlayer ile bir örneği kaydetmek kolaydır:AnalyticsListener
Kotlin
player.addAnalyticsListener(EventLogger())
Java
player.addAnalyticsListener(new EventLogger());
Günlüğü gözlemlemenin en kolay yolu Android Studio'nun logcat sekmesini kullanmaktır. Uygulamanızı paket adına göre hata ayıklanabilir işlem olarak seçebilir (
demo uygulamasını kullanıyorsanız androidx.media3.demo.main) ve yalnızca seçili uygulamayı göster'i seçerek logcat sekmesine yalnızca bu uygulama için günlük kaydı tutmasını söyleyebilirsiniz. Yalnızca EventLogger ve oynatıcıdan gelen günlükleri almak için EventLogger|ExoPlayerImpl ifadesiyle günlüğe kaydetme işlemini daha da filtrelemek mümkündür.
Android Studio'nun logcat sekmesini kullanmak yerine konsolu da kullanabilirsiniz. Örneğin:
adb logcat EventLogger:* ExoPlayerImpl:* *:s
Oyuncu bilgileri
ExoPlayerImpl sınıfı, oynatıcı sürümü, uygulamanın üzerinde çalıştığı cihaz ve işletim sistemi ile yüklenen ExoPlayer modülleri hakkında iki önemli satır sunar:
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]
Oynatma durumu
Oyuncu durumu değişiklikleri aşağıdaki gibi satırlara kaydedilir:
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]
Bu örnekte oynatma, oynatıcı hazırlandıktan 0,93 saniye sonra başlıyor. Kullanıcı, 9,4 saniye sonra oynatmayı duraklatır ve bir saniye sonra 10,4 saniyede oynatmaya devam eder. Oynatma, on saniye sonra 20,4 saniyede sona erer. Köşeli parantez içindeki ortak öğeler şunlardır:
[eventTime=float]: Oyuncu oluşturulduğundan bu yana geçen duvar saati süresi.[mediaPos=float]: Mevcut oynatma konumu.[window=int]: Geçerli pencere dizini.[period=int]: Bu penceredeki geçerli dönem.
Her satırdaki son öğeler, bildirilen durumun değerini gösterir.
Medya parçaları
Kullanılabilir veya seçili parçalar değiştiğinde parça bilgileri kaydedilir. Bu durum, oynatma işleminin başında en az bir kez gerçekleşir. Aşağıdaki örnekte, uyarlanabilir bir akış için izleme kaydı gösterilmektedir:
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: ]
Bu örnekte oynatıcı, mevcut beş video parçasından dördünü seçmiştir. Beşinci video parçası, supported=NO_EXCEEDS_CAPABILITIES ile belirtildiği gibi cihazın özelliklerini aştığı için seçilmiyor.
Oynatıcı, oynatma sırasında seçilen video parçaları arasında geçiş yapar. Oynatıcının bir parçadan diğerine geçişi aşağıdaki gibi bir satırda günlüğe kaydedilir:
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]
Bu günlük satırı, oynatıcının medyada üç saniye sonra 640x360 çözünürlüklü video parçasına geçtiğini gösterir.
Kod çözücü seçimi
Çoğu durumda ExoPlayer, medyayı temel platformdan MediaCodec kullanılarak oluşturur. Bir kod çözücü başlatıldığında bu işlem aşağıdaki gibi satırlara kaydedilir:
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]