Hata ayıklama günlük kaydı

Varsayılan olarak, ExoPlayer 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ük kaydı, oynatıcının ne yaptığını anlamak ve oynatma sorunlarını gidermek açısından da yararlı olabilir. EventLogger, AnalyticsListener yöntemini 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 (demo uygulamasını kullanıyorsanız androidx.media3.demo.main) hata ayıklaması yapılabilir işlem olarak seçebilir ve yalnızca seçili uygulamayı göster'i seçerek logcat sekmesine yalnızca bu uygulama için günlük kaydı yapmasını söyleyebilirsiniz. Yalnızca EventLogger ve oynatıcının kendisinden günlük kaydı almak için EventLogger|ExoPlayerImpl ifadesiyle günlük kaydına daha fazla filtre uygulamak mümkündür.

Android Studio'nun logcat sekmesini kullanmaya alternatif olarak konsolu kullanabilirsiniz. Örneğin:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Oynatıcı bilgileri

ExoPlayerImpl sınıfı, oynatıcı sürümü hakkında iki önemli satır içerir: uygulamanın üzerinde çalıştığı cihaz ve işletim sistemi ile 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ı, oynatmayı 9,4 saniye sonra duraklatır ve bir saniye sonra 10,4 saniyede oynatmayı devam ettirir. Oynatma on saniye sonra 20,4 saniyede sona eriyor. Köşeli parantez içindeki ortak öğeler:

  • [eventTime=float]: Oyuncunun oluşturulmasından bu yana geçen gerçek süre.
  • [mediaPos=float]: Mevcut oynatma konumu.
  • [window=int]: Geçerli pencere dizini.
  • [period=int]: Söz konusu aralıktaki geçerli dönem.

Her bir satırdaki son öğeler, raporlanmakta olan durumun değerini belirtir.

Medya kanalları

Kullanılabilir veya seçilen parçalar değiştiğinde parça bilgileri günlüğe kaydedilir. Bu durum, oynatmanın başlangıcında en az bir kez olur. Aşağıdaki örnekte, uyarlanabilir bir akış için parçanın günlüğe kaydedilmesi 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ı beş mevcut video parçasından dördünü seçmiştir. Beşinci video parçası, supported=NO_EXCEEDS_CAPABILITIES tarafından belirtildiği şekilde cihazın işlevlerini aştığı için seçilmedi. Oynatıcı, oynatma sırasında seçilen video parçaları arasında geçiş yapar. Oynatıcı bir parçadan diğerine uyum sağladığında, aşağıdaki gibi bir satıra 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 boyunca 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 edinilen bir MediaCodec kullanarak oluşturur. Kod çözücü başlatıldığında 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]