Sorun giderme


"Cleartext HTTP trafiğine izin verilmiyor" hatalarını düzeltme

Uygulamanız, Ağ Güvenliği Yapılandırması izin vermediğinde şifresiz metin HTTP trafiği (yani https:// yerine http://) isterse bu hata oluşur. Uygulamanız Android 9 (API düzeyi 28) veya sonraki sürümleri hedefliyorsa şifresiz metin HTTP trafiği varsayılan yapılandırmada devre dışı bırakılır.

Uygulamanızın şifresiz metin HTTP trafiğiyle çalışması gerekiyorsa buna izin veren bir Ağ Güvenliği Yapılandırması kullanmanız gerekir. Ayrıntılar için Android'in ağ güvenliği belgelerine bakın. Tüm şifresiz metin HTTP trafiğini etkinleştirmek için uygulamanızın AndroidManifest.xml öğesinin application öğesine android:usesCleartextTraffic="true" eklemeniz yeterlidir.

ExoPlayer demo uygulaması, varsayılan Ağ Güvenliği Yapılandırmasını kullandığından şifresiz metin HTTP trafiğine izin vermez. Yukarıdaki talimatları uygulayarak etkinleştirebilirsiniz.

"SSLHandshakeException", "CertPathValidatorException" ve "ERR_CERT_AUTHORITY_INVALID" hatalarını düzeltme

SSLHandshakeException, CertPathValidatorException ve ERR_CERT_AUTHORITY_INVALID öğelerinin tümü, sunucunun SSL sertifikasıyla ilgili bir sorunu belirtir. Bu hatalar ExoPlayer'a özgü değildir. Daha fazla ayrıntı için Android'in SSL belgelerine bakın.

Bazı medya dosyaları neden aranamıyor?

Varsayılan olarak ExoPlayer, doğru arama işlemleri gerçekleştirmek için tek yöntemin oynatıcının tüm dosyayı tarayıp dizine eklemesi olduğu medyalarda arama yapmayı desteklemez. ExoPlayer bu tür dosyaları aranamaz olarak kabul eder. Modern medya kapsayıcı biçimlerinin çoğu, aramayla ilgili meta verileri (örnek dizin gibi), iyi tanımlanmış bir arama algoritmasına (ör. Ogg için interpolasyonlu iki bölüm araması) sahiptir veya içeriklerinin sabit bit hızı olduğunu gösterir. Bu durumlarda verimli arama işlemleri ExoPlayer tarafından mümkündür ve desteklenir.

Aramanız gerekiyorsa ancak aranamayan medyalarınız varsa içeriğinizi daha uygun bir kapsayıcı biçimi kullanacak şekilde dönüştürmenizi öneririz. MP3, ADTS ve AMR dosyalarında, dosyaların sabit bir bit hızına sahip olduğu varsayılarak aramayı burada açıklandığı gibi de etkinleştirebilirsiniz.

Bazı MP3 dosyalarında arama neden hatalı?

Değişken bit hızı (VBR) MP3 dosyaları, tam arama gerektiren kullanım alanları için temel olarak uygun değildir. Bunun iki nedeni vardır:

  1. Tam arama için kapsayıcı biçimi, ideal olarak üstbilgide bayt-zaman eşlemesi sağlar. Bu eşleme, oynatıcının istenen arama zamanını karşılık gelen bayt ofsetiyle eşleştirmesine ve bu ofsetten medya istemeye, ayrıştırmaya ve oynatmaya başlamasına olanak tanır. Bu eşlemeyi MP3'te belirtmek için kullanılabilecek başlıklar (XING başlıkları gibi) maalesef genellikle kesin değildir.
  2. Kesin bir zaman-bayt eşlemesi sağlamayan container biçimleri (veya herhangi bir zaman-bayt eşlemesi sağlamayan) kapsayıcının akışta mutlak örnek zaman damgaları içermesi durumunda da tam arama yapmak mümkündür. Bu durumda, bir oynatıcı arama süresini karşılık gelen bayt ofsetinin en iyi tahminiyle eşleyebilir, bu ofsetten medya istemeye başlayabilir, ilk mutlak örnek zaman damgasını ayrıştırabilir ve doğru örneği bulana kadar medyaya etkili bir şekilde rehberli ikili program araması yapabilir. Maalesef MP3, akışta mutlak örnek zaman damgaları içermediğinden bu yaklaşım mümkün değildir.

Bu nedenlerle, bir VBR MP3 dosyasında tam arama gerçekleştirmenin tek yolu dosyanın tamamını taramak ve oynatıcıda manuel olarak bir zaman-bayt eşlemesi oluşturmaktır. Bu strateji, FLAG_ENABLE_INDEX_SEEKING ile etkinleştirilebilir. Bu ayar setMp3ExtractorFlags ile DefaultExtractorsFactory üzerinde ayarlanabilir. Büyük MP3 dosyalarında, özellikle de kullanıcı oynatmaya başladıktan kısa bir süre sonra akışın sonuna doğru gitmeye çalıştığında (bunun için oynatıcının indirme ve aramayı gerçekleştirmeden önce tüm akışı dizine eklemesi gerekir) iyi ölçeklenmez. Bu örnekte ExoPlayer'da hız için doğruluktan çok optimizasyon yapmaya karar verdik. Bu nedenle FLAG_ENABLE_INDEX_SEEKING varsayılan olarak devre dışı bırakıldı.

Oynattığınız medyayı kontrol ediyorsanız MP4 gibi daha uygun bir kapsayıcı biçimi kullanmanızı önemle tavsiye ederiz. MP3'ün medya biçimi için en iyi seçim olduğunu bildiğimiz bir durum yok.

Videomda sarmalama neden yavaş?

Oynatıcının videoda yeni bir oynatma konumu bulmak için iki işlem yapması gerekir:

  1. Yeni oynatma konumuna karşılık gelen verileri arabelleğe yükleyin (bu veriler önceden arabelleğe alınmışsa gerekli olmayabilir).
  2. Çoğu video sıkıştırma biçimi tarafından kullanılan kare içi kodlama nedeniyle, yeni oynatma konumundan önce video kod çözücüyü temizleyin ve I-karesinden (animasyon karesi) kodu çözmeye başlayın. Aramanın doğru olduğundan (yani oynatma tam olarak arama konumunda başladığından) emin olmak için, önceki I çerçevesi ile sarma konumu arasındaki tüm karelerin kodunun çözülmesi ve hemen çıkarılması (ekranda gösterilmeden) gerekir.

(1)'den kaynaklanan gecikme, oynatıcı tarafından bellekte arabelleğe alınan veri miktarını artırarak veya verilerin diske önceden önbelleğe alınmasıyla azaltılabilir.

(2)'den kaynaklanan gecikme, ExoPlayer.setSeekParameters ile aramanın doğruluğunu azaltarak veya videoyu daha sık I karelerine sahip olacak şekilde yeniden kodlayarak (böylece daha büyük bir çıkış dosyası elde edilir) azaltılabilir.

Bazı MPEG-TS dosyaları neden oynatılamıyor?

Bazı MPEG-TS dosyaları erişim birimi sınırlayıcıları (AUD) içermez. Varsayılan olarak ExoPlayer, kare sınırlarını ucuz bir şekilde algılamak için AUD'lerden yararlanır. Benzer şekilde, bazı MPEG-TS dosyaları IDR animasyon kareleri içermez. Varsayılan olarak, bunlar ExoPlayer'ın dikkate aldığı tek animasyon karesi türüdür.

AUD veya IDR animasyon kareleri içermeyen bir MPEG-TS dosyasını oynatmanız istendiğinde ExoPlayer arabelleğe alma durumunda takılı kalmış görünür. Bu tür dosyaları oynatmanız gerekiyorsa bunu sırasıyla FLAG_DETECT_ACCESS_UNITS ve FLAG_ALLOW_NON_IDR_KEYFRAMES kullanarak yapabilirsiniz. Bu işaretler, DefaultExtractorsFactory üzerinde setTsExtractorFlags kullanılarak veya DefaultHlsExtractorFactorykurucu kullanılarak ayarlanabilir. FLAG_DETECT_ACCESS_UNITS kullanımının, AUD tabanlı çerçeve sınırı algılamaya kıyasla işlem açısından pahalı olması dışında hiçbir yan etkisi yoktur. FLAG_ALLOW_NON_IDR_KEYFRAMES kullanımı, bazı MPEG-TS dosyaları oynatılırken oynatmanın başlangıcında ve arama işlemlerinden hemen sonra geçici görsel bozulmaya neden olabilir.

Bazı MPEG-TS dosyalarında neden altyazılar bulunamadı?

Bazı MPEG-TS dosyaları CEA-608 kanalları içerir ancak bunları kapsayıcı meta verilerinde belirtmez. Bu nedenle ExoPlayer bunları algılayamaz. DefaultExtractorsFactory öğesine, beklenen altyazı biçimlerinin bir listesini sağlayarak altyazı parçalarını manuel olarak belirtebilirsiniz. Bu listeyi MPEG-TS akışında tanımlamak için kullanılabilen erişilebilirlik kanalları da dahil olmak üzere:

Kotlin

val extractorsFactory =
  DefaultExtractorsFactory()
    .setTsSubtitleFormats(
      listOf(
        Format.Builder()
          .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
          .setAccessibilityChannel(accessibilityChannel)
          // Set other subtitle format info, such as language.
          .build()
      )
    )
val player: Player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, extractorsFactory)).build()

Java

DefaultExtractorsFactory extractorsFactory =
    new DefaultExtractorsFactory()
        .setTsSubtitleFormats(
            ImmutableList.of(
                new Format.Builder()
                    .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
                    .setAccessibilityChannel(accessibilityChannel)
                    // Set other subtitle format info, such as language.
                    .build()));
Player player =
    new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory))
        .build();

Neden bazı MP4/FMP4 dosyaları yanlış oynatılıyor?

Bazı MP4/FMP4 dosyaları, örnek listelerini atlayarak, taşıyarak veya tekrarlayarak medya zaman çizelgesini yeniden yazan düzenleme listeleri içerir. ExoPlayer, düzenleme listelerini uygulama konusunda kısmi desteğe sahiptir. Örneğin, bir senkronizasyon örneğinde başlatılan örnek gruplarını geciktirebilir veya tekrarlayabilir, ancak bir senkronizasyon örneğinde başlamayan düzenlemeler için ses örneklerini veya medyayı önceden hazırlamaz.

Medya içeriğinin beklenmedik bir şekilde eksik veya tekrarlandığını görüyorsanız Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS veya FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS ayarlarını deneyin. Bu işlem, ayıklayıcının düzenleme listelerini tamamen yoksaymasına neden olur. Bunlar setMp4ExtractorFlags veya setFragmentedMp4ExtractorFlags kullanılarak DefaultExtractorsFactory üzerinde ayarlanabilir.

Neden bazı akışlar 301 veya 302 HTTP yanıt koduyla başarısız oluyor?

301 ve 302 HTTP yanıt kodlarının her ikisi de yönlendirmeyi belirtir. Kısa açıklamalar Wikipedia'da bulunabilir. ExoPlayer istekte bulunup 301 veya 302 durum koduyla yanıt aldığında, normalde yönlendirmeyi izler ve oynatmayı normal şekilde başlatır. Bunun varsayılan olarak gerçekleşmediği durumlar, protokoller arası yönlendirmelerdir. Protokoller arası yönlendirme, HTTPS'den HTTP'ye veya HTTP'den HTTPS'ye yönlendirme yapan bir yönlendirmedir (ya da daha az yaygın olarak, farklı protokoller arasında). wget komut satırı aracını kullanarak bir URL'nin protokoller arası yönlendirmeye neden olup olmadığını aşağıdaki şekilde test edebilirsiniz:

wget "https://yourserver.com/test.mp3" 2>&1  | grep Location

Çıkış şunun gibi görünmelidir:

Location: https://second.com/test.mp3 [following]
Location: http://third.com/test.mp3 [following]

Bu örnekte iki yönlendirme vardır. İlk yönlendirme, https://yourserver.com/test.mp3 konumundan https://second.com/test.mp3 sayfasına yapılır. Her ikisi de HTTPS olduğundan bu, protokoller arası bir yönlendirme değildir. İkinci yönlendirme, https://second.com/test.mp3-http://third.com/test.mp3 arasıdır. Bu, HTTPS'den HTTP'ye yönlendirme yapar, ayrıca protokoller arası bir yönlendirmedir. ExoPlayer, varsayılan yapılandırmasında bu yönlendirmeyi takip etmez. Bu da oynatmanın başarısız olacağı anlamına gelir.

Gerekirse uygulamanızda kullanılan DefaultHttpDataSource.Factory örneklerini örneklerken ExoPlayer'ı protokoller arası yönlendirmeleri izleyecek şekilde yapılandırabilirsiniz. Ağ yığınını seçme ve yapılandırma hakkında buradan bilgi edinebilirsiniz.

Neden bazı akışlar UnrecognizedInputFormatException ile başarısız oluyor?

Bu soru, aşağıdaki biçimdeki oynatma hatalarıyla ilgilidir:

UnrecognizedInputFormatException: None of the available extractors
(MatroskaExtractor, FragmentedMp4Extractor, ...) could read the stream.

Bu hatanın iki olası nedeni vardır. Bunun en yaygın nedeni, DASH (mpd), HLS (m3u8) veya SmoothStreaming (ism, isml) içeriğini oynatmaya çalışmanız, ancak oynatıcının bunu progresif akış olarak oynatmaya çalışmasıdır. Bu tür akışları oynatmak için ilgili ExoPlayer modülüne güvenmeniz gerekir. Akış URI'sının standart dosya uzantısıyla bitmediği durumlarda, akış türünü açık bir şekilde belirtmek için MimeTypes.APPLICATION_MPD, MimeTypes.APPLICATION_M3U8 veya MimeTypes.APPLICATION_SS setMimeType veya MediaItem.Builder değerlerini de iletebilirsiniz.

Daha az görülen ikinci neden ise ExoPlayer'ın oynatmaya çalıştığınız medyanın container biçimini desteklememesidir. Bu durumda, hata beklendiği gibi işlemektedir, ancak sorun izleyicimize container biçimi ve test akışı ayrıntılarıyla birlikte bir özellik isteği gönderebilirsiniz. Yeni bir özellik göndermeden önce lütfen mevcut bir özellik isteğini arayın.

setPlaybackParameters neden bazı cihazlarda düzgün çalışmıyor?

Android M ve önceki sürümlerde uygulamanızın hata ayıklama derlemesini çalıştırırken setPlaybackParameters API'yi kullanırken performans dalgalanması, sesli yapılar ve yüksek CPU kullanımı ile karşılaşabilirsiniz. Bunun nedeni, Android'in bu sürümlerinde çalışan hata ayıklama derlemelerinde bu API için önemli olan bir optimizasyonun devre dışı bırakılmasıdır.

Bu sorunun yalnızca hata ayıklama derlemelerini etkilediğini unutmayın. Optimizasyonun her zaman etkin olduğu sürüm derlemelerini etkilemez. Bu nedenle, son kullanıcılara sunduğunuz sürümlerin bu sorundan etkilenmemesi gerekir.

"Oynatıcıya yanlış ileti dizisinde erişildi" hataları ne anlama gelir?

Başlangıç sayfasında İleti dizisiyle ilgili bir not konusuna bakın.

"Beklenmeyen durum satırı: ICY 200 OK" sorununu nasıl düzeltebilirim?

Sunucu yanıtı, HTTP uyumlu bir durum yerine bir ICY durum satırı içeriyorsa bu sorun ortaya çıkabilir. ICY durum satırları kullanımdan kaldırılmıştır ve kullanılmamalıdır. Bu nedenle, sunucuyu siz kontrol ediyorsanız HTTP uyumlu bir yanıt sağlamak için sunucuyu güncellemeniz gerekir. Bunu yapamıyorsanız ExoPlayer OkHttp kitaplığı ICY durum satırlarını doğru şekilde işleyebileceği için sorunu çözer.

Oynatılan yayının canlı yayın olup olmadığını nasıl sorgulayabilirim?

Oynatıcının isCurrentWindowLive yöntemini sorgulayabilirsiniz. Ayrıca, aralığın dinamik (yani zaman içinde güncellenmeye devam eden) olup olmadığını öğrenmek için isCurrentWindowDynamic aracını kontrol edebilirsiniz.

Uygulamam arka plana alındığında sesin çalmaya devam etmesini nasıl sağlayabilirim?

Uygulamanız arka plandayken sesin kesintisiz olarak çalınmasını sağlamak için aşağıdaki adımları uygulayın:

  1. Çalışan bir ön plan hizmetinizin olması gerekir. Bu, sistemin kaynakları boşaltmak için sürecinizi sonlandırmasını önler.
  2. Bir WifiLock ve bir WakeLock bulundurmanız gerekir. Bunlar, sistemin kablosuz radyoyu ve CPU'yu uyanık tutmasını sağlar. ExoPlayer kullanıyorsanız setWakeMode yöntemini çağırarak bu işlemi kolayca yapabilirsiniz. Gerekli kilitler doğru zamanda otomatik olarak edinilip serbest bırakılır.

setWakeMode kullanmıyorsanız kilitleri açmanız ve sesin kesilmesi biter bitmez hizmeti durdurmanız önemlidir.

Neden ExoPlayer içeriklerimi destekliyor ama ExoPlayer Cast kitaplığı neden desteklemiyor?

Oynatmaya çalıştığınız içerik CORS etkin olmayabilir. Cast çerçevesi, içeriğin oynatılabilmesi için CORS'nin etkinleştirilmesini gerektirir.

İçerik neden oynatılamıyor ancak herhangi bir hata görüntülenmiyor?

İçeriği oynattığınız cihaz, belirli bir medya örneği biçimini desteklemiyor olabilir. Bunu, oynatıcınıza işleyici olarak bir EventLogger ekleyip Logcat'te şuna benzer bir satır arayarak kolayca doğrulayabilirsiniz:

[ ] Track:x, id=x, mimeType=mime/type, ... , supported=NO_UNSUPPORTED_TYPE

NO_UNSUPPORTED_TYPE, cihazın mimeType tarafından belirtilen medya örneği biçiminin kodunu çözemediği anlamına gelir. Desteklenen örnek biçimler hakkında bilgi için Android medya biçimleri dokümanlarına bakın. Yüklemek ve oynatma için kullanmak üzere kod çözme kitaplığını nasıl edinebilirim? de faydalı olabilir.

Yüklenecek ve oynatma için kullanılacak bir kod çözme kitaplığını nasıl edinebilirim?

  • Kod çözücü kitaplıklarının çoğunda, bağımlılıkları kontrol etmek ve derlemek için manuel adımlar uygulanır. Bu nedenle, ilgili kitaplık için README bölümündeki adımları uyguladığınızdan emin olun. Örneğin, ExoPlayer FFmpeg kitaplığı için libraries/decoder_ffmpeg/README.md bölümündeki talimatları uygulamanız gerekir. Bu talimatlara, oynatmak istediğiniz tüm biçimler için kod çözücüleri etkinleştirmek için yapılandırma işaretlerinin iletilmesini de içerir.
  • Yerel koda sahip kitaplıklarda, Android NDK'nın BENİOKU'da belirtilen doğru sürümünü kullandığınızdan emin olun. Ayrıca, yapılandırma ve derleme sırasında ortaya çıkabilecek hatalara dikkat edin. BENİOKU işlevindeki adımları uyguladıktan sonra, desteklenen her mimari için kitaplık yolunun libs alt dizininde .so dosyalarının göründüğünü göreceksiniz.
  • Demo uygulamasındaki kitaplığı kullanarak oynatmayı denemek için paket kod çözücüleri etkinleştirme bölümüne bakın. Kendi uygulamanızdan kitaplığı nasıl kullanacağınızla ilgili talimatlar için kitaplıkla ilgili BENİOKU bölümünü inceleyin.
  • DefaultRenderersFactory kullanıyorsanız kod çözücü yüklendiğinde Logcat'te "Loaded FfmpegAudioRenderer" gibi bir bilgi düzeyinde günlük satırı görürsünüz. Bu eksikse uygulamanın kod çözme kitaplığına bir bağımlılığı olduğundan emin olun.
  • Logcat'te LibraryLoader adresinden uyarı düzeyinde günlükler görürseniz bu, kitaplığın yerel bileşeninin yüklenemediğini gösterir. Bu durumda, kitaplığın BENİOKU komutundaki adımları doğru uyguladığınızdan ve talimatları uygularken herhangi bir hata oluşmadığından emin olun.

Kod çözme kitaplıklarının kullanımıyla ilgili sorun yaşamaya devam ederseniz yakın zamanda ortaya çıkan sorunlar için lütfen Media3 sorun izleyicisine göz atın. Yeni bir sorun bildirmeniz gerekiyorsa ve bu sorun kitaplığın yerel kısmının oluşturulmasıyla ilgiliyse, sorunu teşhis etmemize yardımcı olmak için lütfen README talimatlarının çalıştırıldığı tam komut satırı çıkışını ekleyin.

YouTube videolarını doğrudan ExoPlayer ile oynatabilir miyim?

Hayır, ExoPlayer YouTube'dan https://www.youtube.com/watch?v=... biçimindeki URL'ler gibi videoları oynatamaz. Bunun yerine, YouTube videolarını Android'de oynatmanın resmi yolu olan YouTube IFrame Player API'sını kullanmanız gerekir.

Video oynatmada kesinti yaşanıyor

Örneğin, içerik bit hızı veya çözünürlük cihaz özelliklerini aşarsa cihaz, içeriğin kodunu yeterince hızlı bir şekilde çözemeyebilir. Bu tür cihazlarda iyi performans elde etmek için düşük kaliteli içerik kullanmanız gerekebilir.

Özellikle DRM korumalı veya yüksek kare hızına sahip içerikleri oynatırken Android 6.0 (API düzeyi 23) ile Android 11 (API düzeyi 30) arasındaki Android 6.0 (API düzeyi 23) sürümünü çalıştıran bir cihazda videoda takılmalar yaşıyorsanız eşzamansız arabellek kuyruğunu etkinleştirmeyi deneyebilirsiniz.