Hata ayıklama günlük kaydı

Varsayılan olarak, ExoPlayer yalnızca hataları günlüğe kaydeder. Oynatıcı etkinliklerini günlüğe kaydetmek için EventLogger sınıfı kullanılabilir. Sağladığı ek günlük kaydı, oynatıcının ne yaptığını anlamanın yanı sıra oynatma sorunlarını gidermek için de yararlı olabilir. EventLogger, AnalyticsListener'u uygular. Bu nedenle, bir örneği ExoPlayer ile kaydetmek kolaydır:

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ıklama işlemi olarak seçebilir (demo uygulamayı 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 kaydetmesini söyleyebilirsiniz. Yalnızca EventLogger ve oynatıcının günlüklerini almak için günlük kaydını EventLogger|ExoPlayerImpl ifadesiyle daha da filtreleyebilirsiniz.

Android Studio'nun logcat sekmesini kullanmanın alternatifi konsolu kullanmaktır. Örneğin:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Oyuncu bilgileri

ExoPlayerImpl sınıfı, oynatıcı sürümü hakkında iki önemli satır içerir: uygulamanın çalıştığı cihaz, işletim sistemi ve yüklenmiş ExoPlayer modülleri:

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şlar. Kullanıcı, 9,4 saniye sonra oynatmayı duraklatır ve bir saniye sonra, 10,4. saniyede devam ettirir. Oynatma, on saniye sonra 20,4.saniyede sona erer. Köşeli parantez içinde ortak kullanılan öğeler:

  • [eventTime=float]: Oynatıcı oluşturulduğundan bu yana geçen saat.
  • [mediaPos=float]: Mevcut oynatma konumu.
  • [window=int]: Geçerli pencere dizini.
  • [period=int]: Bu aralıktaki geçerli dönem.

Her satırdaki son öğeler, raporlanan durumun değerini belirtir.

Medya kanalları

Mevcut veya seçili parçalar değiştiğinde parça bilgileri günlüğe kaydedilir. Bu durum, oynatma işleminin başında en az bir kez gerçekleşir. Aşağıdaki örnekte, uyarlanabilir bir akış için parça günlüğü 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, oyuncu mevcut beş video parçasından dördünü seçmiştir. Beşinci video parçası, supported=NO_EXCEEDS_CAPABILITIES tarafından belirtilen şekilde cihazın özelliklerini aştığı için seçilmedi. Oynatma sırasında oynatıcı, seçili video parçaları arasında geçiş yapar. Oynatıcı bir parçadan diğerine geçtiğinde aşağıdaki gibi bir satırla 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 medyaya girmek üzere üç saniye içinde 640x360 çözünürlüklü video parçasına geçtiğini gösterir.

Kod çözücü seçimi

Çoğu durumda, ExoPlayer, temel platformdan edindiği bir MediaCodec kullanarak medya oluşturur. Bir kod çözücü ilk 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]