Sorun giderme


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

Bu hata, uygulamanız şifresiz metin HTTP trafiği (yani http:// yerine https://). kabul edilmez. Uygulamanız Android 9 (API düzeyi 28) veya sonraki sürümleri hedefliyorsa cleartext HTTP trafiği, varsayılan yapılandırma tarafından devre dışı bırakılmıştır.

Uygulamanızın şifresiz HTTP trafiğiyle çalışması gerekiyorsa bir İzin veren Ağ Güvenliği Yapılandırması. Android'in ağ güvenliği belgeleri inceleyebilirsiniz. Tüm şifresiz metin HTTP trafiğini etkinleştirmek için Uygulamanızın application öğesine android:usesCleartextTraffic="true" AndroidManifest.xml.

ExoPlayer demo uygulaması, varsayılan Ağ Güvenliği Yapılandırması'nı kullanır ve bu nedenle şifresiz metin HTTP trafiğine izin vermez. Talimatları uygulayarak bu özelliği etkinleştirebilirsiniz bölümünü ziyaret edin.

"SSLHandshakeException", "CertPathValidatorException" sorununu düzeltme ve "ERR_CERT_AUTHORITY_INVALID" hatalar

SSLHandshakeException, CertPathValidatorException ve ERR_CERT_AUTHORITY_INVALID öğelerinin tümü sunucunun SSL'sinde bir sorun olduğunu gösteriyor sertifikası. Bu hatalar ExoPlayer'a özgü değildir. Görüntüleyin Android'in SSL dokümanları inceleyebilirsiniz.

Neden bazı medya dosyaları aranamıyor?

ExoPlayer, varsayılan olarak tek yöntemin doğru arama işlemleri gerçekleştirmek, oynatıcının ekleyebilirsiniz. ExoPlayer bu tür dosyaları aranamaz olarak değerlendirir. Modern medyaların çoğu kapsayıcı biçimleri arasında arama için meta veriler (örnek bir dizin gibi) bulunur. iyi tanımlanmış arama algoritması (örneğin, Ogg için interpolasyonlu iki bölüm araması) veya Bu, içeriklerinin sabit bit hızında olduğunu gösterir. Verimli arama işlemleri mümkün ve bu durumlarda ExoPlayer tarafından desteklenir.

Aramanız gerekiyorsa ancak aranamayan bir medyaya sahipseniz, kapsayıcı biçimi kullanmaya başlamanıza yardımcı olur. MP3, ADTS ve AMR dosyaları için dosyaların hiçbir zaman sabit olmadığı varsayımıyla arama yöntemini de etkinleştirebilirsiniz. (açıklandığı şekilde bit hızı) burada bulabilirsiniz.

Bazı MP3 dosyalarında arama neden hatalı oluyor?

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

  1. Tam arama için kapsayıcı biçimi ideal olarak kesin sonuç verir. zamandan bayta eşlemeyi kullanmayı düşünebilirsiniz. Bu eşleme, oyuncunun bir karşılık gelen bayt uzaklığına sarma zamanı isteğinde bulundu ve ayrıştırıp oynatabilirsiniz. Kullanılabilecek başlıklar bu eşlemeyi MP3'te (XING başlıkları gibi) belirtmek genellikle emin olun.
  2. Kesin bir zamandan bayta eşleme (veya herhangi bir zamandan bayta eşleme) oluşturulduğunda, tam olarak kapsayıcının akışta mutlak örnek zaman damgaları içerip içermediğine bakar. İçinde Bu durumda, oyuncu arama süresini ilgili tahminin en iyi tahminiyle bayt uzaklığı, bu ofsetten medya istemeye başlayın, ilki ayrıştır mutlak örnek zaman damgasını kullanabilir ve açıklamalı bir ikili program araması yapabilirsiniz doğru örneği bulana kadar yavaşlıyor. Maalesef MP3 akışa mutlak örnek zaman damgaları eklediğinden, bu yaklaşım yapmasını sağlar.

Bu nedenlerle, bir VBR MP3 dosyasında kesin arama yapmanın tek yolu dosyanın tamamını tarayabilir ve oynatıcıya gitmiş olur. Bu strateji, FLAG_ENABLE_INDEX_SEEKING kullanılarak etkinleştirilebilir. Bu ayar, DefaultExtractorsFactory üzerinde setMp3ExtractorFlags. Büyük MP3 dosyaları için iyi ölçeklenmeyeceğini, (özellikle kullanıcı kısa süre içinde akışın sonuna yaklaşmaya çalışıyorsa) (oynatma işlemi başlatıldıktan sonra) (oynatıcının, indirilene kadar beklemesi gerekir) ve sarmayı gerçekleştirmeden önce tüm akışı dizine eklemiştir. ExoPlayer'da, Bu durumda doğruluktan çok hızı optimize etmeye Bu nedenle FLAG_ENABLE_INDEX_SEEKING varsayılan olarak devre dışıdır.

Oynattığınız medyayı siz kontrol ediyorsanız daha fazla uygun kapsayıcı formatıdır (örneğin, MP4). Bildiğimiz hiçbir kullanım alanı yok Bu örnekte, MP3 medya biçimi için en iyi seçimdir.

Videomdaki arama işlemi neden yavaş?

Oynatıcı bir videoda yeni bir oynatma konumu istediğinde iki işlem yapması gerekir. şeyler:

  1. Yeni oynatma konumuna karşılık gelen verileri arabelleğe yükleyin (veriler önceden arabelleğe alınmışsa bu işlem gerekli olmayabilir).
  2. Önce video kod çözücüyü temizleyin ve I-karesinden (animasyon karesi) kod çözmeyi başlatın Çoğu videoda kullanılan kare içi kodlama nedeniyle yeni oynatma konumunu biçimlendirmelerini kullanabilirsiniz. Aramanın doğru olduğundan (yani, oynatma tam olarak arama konumunda başladığından), önceki I-karesinin ve arama konumunun kodunun çözülmesi gerekir ve (ekranda gösterilmeden) silinir.

(1)'in neden olduğu gecikme, veya verileri diskte önceden önbelleğe alma yöntemini kullanabilirsiniz.

(2)'deki gecikme, doğruluğun azaltılmasıyla azaltılabilir. ExoPlayer.setSeekParameters kullanarak veya videoyu yeniden kodlayarak daha sık I-çerçevelere sahip olma (bu da daha büyük bir çıktı dosyasına neden olur).

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ı uygun fiyata tespit etmek için AUD'den yararlanır. Benzer şekilde bazı MPEG-TS dosyaları IDR animasyon kareleri içermez. Varsayılan olarak yalnızca bu tür ExoPlayer tarafından değerlendirilen animasyon karelerinin sayısı.

Oynaması istendiğinde ExoPlayer arabelleğe alma durumunda kalmış gibi görünecek AUD veya IDR animasyon kareleri içermeyen MPEG-TS dosyası. Bu tür dosyaları oynatmanız gerekirse FLAG_DETECT_ACCESS_UNITS ve Sırasıyla FLAG_ALLOW_NON_IDR_KEYFRAMES. Bu flag'ler üzerinde DefaultExtractorsFactory: setTsExtractorFlags veya şurada: DefaultHlsExtractorFactory kullanarak oluşturucu. FLAG_DETECT_ACCESS_UNITS kullanımının AUD tabanlı çerçeve sınırı algılamaya göre hesaplama açısından pahalıdır. Kullanım FLAG_ALLOW_NON_IDR_KEYFRAMES, oynatmanın başlatılması ve bazı MPEG-TS dosyaları oynatılırken sarma sonrasında.

Bazı MPEG-TS dosyalarında altyazılar neden bulunamıyor?

Bazı MPEG-TS dosyaları CEA-608 parçaları içerir ancak bunları olduğu için ExoPlayer bunları algılayamaz. Bu beklenen altyazı parçasını listeleyerek erişilebilirlik de dahil olmak üzere DefaultExtractorsFactory için altyazı biçimleri şu verileri MPEG-TS akışında tanımlamak için kullanılabilecek araçlardır:

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();

Bazı MP4/FMP4 dosyaları neden yanlış oynatılıyor?

Bazı MP4/FMP4 dosyaları, medya zaman çizelgesini örnek listelerini atlama, taşıma veya tekrarlama. ExoPlayer'da kısmi destek mevcut düzenleme listelerini uygulamak için kullanılır. Örneğin, örnek gruplarını geciktirebilir veya tekrarlayabilir bir senkronizasyon örneğinde başlıyor ancak ses örneklerini veya senkronizasyon örneğinde başlamayan düzenlemeler için videodan önce gösterilen medyalar.

Medyanın bu bölümünün beklenmedik bir şekilde eksik olduğunu veya tekrarlandığını görüyorsanız Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS ayarlamayı deneyin veya FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS, bu da düzenleme listelerini tamamen yoksaymasını sağlayabilirsiniz. Bunlar, üzerinde DefaultExtractorsFactory setMp4ExtractorFlags veya setFragmentedMp4ExtractorFlags.

Bazı akışlar neden HTTP yanıt kodu 301 veya 302 ile 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 bir istekte bulunup durum kodu 301 veya 302 olan bir yanıt alırsa, normalde yeniden yönlendirmeyi izler. normal şekilde oynatmaya başlayabilirsiniz. Bunun varsayılan olarak gerçekleşmediği bir durum protokoller arası yönlendirmeler içindir. Protokoller arası yönlendirme, HTTP'den HTTP'ye veya tam tersi (ya da daha az sıklıkla birlikte çalışır). Bir URL'nin protokoller arası yönlendirmeye neden olup olmadığını wget komut satırı aracını aşağıdaki gibi görürsünüz:

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

Çıkış şu şekilde 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 kaynağı https://yourserver.com/test.mp3 - https://second.com/test.mp3. Her ikisi de HTTPS kullanılır. Bu nedenle bu, protokoller arası yönlendirme değildir. İkinci yönlendirme kaynağı https://second.com/test.mp3 - http://third.com/test.mp3. Bu, yani protokoller arası yönlendirmedir. ExoPlayer şunu yapmaz: bu yönlendirmeyi varsayılan yapılandırmasında uygular. Bu da oynatmanın başarısız olacağı anlamına gelir.

Gerekirse ExoPlayer'ı protokoller arası yönlendirmeleri takip edecek şekilde yapılandırabilirsiniz. örneklendirdiğinizde DefaultHttpDataSource.Factory bir uygulamadır. Ağ yığınını seçme ve yapılandırma hakkında bilgi edinin burada bulabilirsiniz.

Bazı akışlar neden UnrecognizedInputFormatException ile başarısız oluyor?

Bu soru, aşağıdaki biçimdeki oynatma hataları ile 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) oynatmaya çalışıyorsunuz ancak oynatıcı bunu aşamalı bir akış olarak oynatmaya çalışır. Böyle bir içeriği oynatmak için akışlar için ilgili ExoPlayer modülüne bağlı olmanız gerekir. Bazı durumlarda akış URI'si standart dosya uzantısıyla bitmez; MimeTypes.APPLICATION_MPD, MimeTypes.APPLICATION_M3U8 veya Açıkça belirtmek için MimeTypes.APPLICATION_SS - setMimeType / MediaItem.Builder akışın türünü belirtin.

Daha az yaygın olan ikinci neden ise ExoPlayer'ın kapsayıcıyı desteklememesidir. biçimi olabilir. Bu durumda, hata istediğiniz gibi çalışmaya devam edebilir, ancak lütfen Kapsayıcı biçimi ve test akışının ayrıntılarını içeren sorun izleyici. 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 çalışırken kesintili performans, duyulabilir kusurlar ve yüksek CPU kullanımı setPlaybackParameters API'yi kullanabilirsiniz. Çünkü optimizasyon bu API için önemli olan bir şey, bu komut dosyalarında çalışan hata ayıklama derlemelerinde devre dışı Android'in sürümleri.

Bu sorunun yalnızca hata ayıklama derlemelerini etkilediğini unutmayın. değil optimizasyonun her zaman etkin olduğu sürüm derlemelerini etkiler. Dolayısıyla son kullanıcılara sunduğunuz sürümler bu sorundan etkilenmemelidir.

"Oynatıcıya yanlış iş parçacığında erişildi" ne yapar? hataların anlamı nedir?

Başlangıç sayfasındaki Mesaj dizisiyle ilgili bir not bölümüne bakın.

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

Bu sorun, sunucu yanıtında bir ICY durum satırı varsa, bir web sitesini ziyaret eder. ICY durum satırları kullanımdan kaldırıldı ve kullanılmamalıdır. Bu nedenle, sunucuyu kontrol ediyorsanız sunucuyu HTTP uyumlu bir yanıt gönderin. Bunu yapamıyorsanız ExoPlayer OkHttp kitaplığı ICY'yi işleyebildiği için sorunu çözecektir doğru şekilde ekleyebilirsiniz.

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

Oynatıcının isCurrentWindowLive yöntemini sorgulayabilirsiniz. Ayrıca, pencerenin dinamik olup olmadığını anlamak için isCurrentWindowDynamic simgesine bakabilirsiniz (zaman içinde güncellenmeye devam eder)

Uygulamam arka planda çalışırken nasıl ses çalabilirim?

Uygulamanız açıkken sesin çalmaya devam etmesini sağlamak için bu adımları uygulayın arka plan:

  1. Çalışan bir ön plan hizmetinizin olması gerekir. Bu, sistemin sizi kaynaklarınızı boşa çıkarmak için uğraşmaz.
  2. Bir WifiLock ve bir WakeLock tutmanız gerekir. Bunlar, ve CPU'yu açık tutar. Bu işlem, yüksek bütçeli setWakeMode numaralı telefonu arayarak ExoPlayer. Bu işlem otomatik olarak gerekli kilitleri doğru zamanda edinip serbest bırakın.

Kilitleri açmanız (setWakeMode kullanmıyorsanız) ve uygulamayı durdurarak hizmeti kullanmaya devam edebilirsiniz.

ExoPlayer neden içeriğimi destekliyor ancak ExoPlayer Cast kitaplığı neden desteklemiyor?

Oynatmaya çalıştığınız içerik büyük ihtimalle CORS etkin. Cast çerçevesi, CORS'un etkinleştirilmiş olmasını gerektirir biraz zorlandık.

İçerik neden oynatılamıyor ancak hata gösterilmiyor?

İçeriği oynattığınız cihaz muhtemelen belirli bir medya örneği biçimini destekler. Kontrol etmek için oynatıcınızı dinleyici olarak EventLogger kullanıyor ve bir çizgi arıyorum aşağıdakine benzer:

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

NO_UNSUPPORTED_TYPE, cihazın medyanın kodunu çözemediği anlamına gelir mimeType tarafından belirtilen örnek biçimi. Android medya biçimlerine bakın dokümanlarına bakın. Nasıl oynatma için kullanılacak bir kod çözme kitaplığı mı var? yararlı olabilir.

Kod çözme kitaplığının yüklenmesini ve oynatma için kullanılmasını nasıl sağlayabilirim?

  • Kod çözücü kitaplıklarının çoğunda, bağımlılıkları kontrol etmek ve oluşturmak için manuel adımlar bulunur. ilgili kitaplık için BENİOKU’da bulunan adımları uyguladığınızdan emin olun. Örneğin, ExoPlayer FFmpeg kitaplığı için libraries/decoder_ffmpeg/README.md dosyasındaki talimatlar, oynatmak istediğiniz tüm biçimler için kod çözücüleri etkinleştirmek üzere yapılandırma işaretleri kullanın.
  • Yerel koda sahip kitaplıklar için doğru kodu kullandığınızdan emin olun sürümünü kullandığınızdan emin olun. sırasında ortaya çıkan hatalardır. .so göreceksiniz dosyaları her biri için kitaplık yolunun libs alt dizininde görünür desteklenen mimariyi seçin.
  • Demo uygulamasındaki kitaplığı kullanarak oynatmayı denemek için şu sayfaya göz atın: paket halinde bulunan kod çözücüleri etkinleştirme. Kütüphanenin BENİOKU bölümünü ziyaret edin: kendi uygulamanızdaki kitaplığı kullanmaya ilişkin talimatlar.
  • DefaultRenderersFactory kullanıyorsanız bir bilgi düzeyi görürsünüz "Loaded FfmpegAudioRenderer" gibi bir günlük satırı kod çözücü yüklendiğinden emin olun. Bu eksikse uygulamanın kitaplığını oluşturur.
  • Logcat'te LibraryLoader parametresine ait uyarı düzeyinde günlükler görürseniz bu kitaplığın yerel bileşeninin yüklenemediğini gösterir. Bu kütüphanenin BENİOKU bölümündeki adımları doğru uygulayıp uygulamadığınızı kontrol edin. ve talimatlar uygulanırken hata oluşmadığını kontrol edebilirsiniz.

Kod çözme kitaplıklarını kullanırken hâlâ sorun yaşıyorsanız lütfen Alakalı son sorunlar için Media3 sorun izleyici. Proje için ve kitaplığın yerel bölümünü oluşturmakla ilgiliyse lütfen bize yardımcı olmak için, BENİOKU talimatlarının çalıştırılmasından tam komut satırı çıkışını bir yöntem de ekledik.

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

Hayır, ExoPlayer, formun URL'leri gibi videoları YouTube'dan oynatamaz https://www.youtube.com/watch?v=... Bunun yerine YouTube IFrame Player API'si YouTube videolarını Android'de oynatmanın resmi yoludur.

Video oynatma takılıyor

Cihaz, örneğin aşağıdaki durumlarda içeriğin kodunu yeterince hızlı şekilde çözemeyebilir: İçerik bit hızı veya çözünürlüğü cihazın özelliklerini aşıyor. Şunlara ihtiyacınız olabilir: bu tür cihazlarda iyi performans elde etmek için düşük kaliteli içerikler kullanmak.

Android sürümü çalıştıran bir cihazda videoda takılma sorunu yaşıyorsanız Android 6.0'dan (API düzeyi 23) Android 11'e (API düzeyi 30) kadar olan sürümlerde, özellikle de DRM korumalı veya yüksek kare hızlı içerikler oynatırken eşzamansız arabellek sıraya alma özelliğini etkinleştirme.

Kararsız API lint hataları

Media3, API yüzeyinin bir alt kümesi için ikili program uyumluluğunu garanti eder. İlgili içeriği oluşturmak için kullanılan ikili program uyumluluğunu garanti etmeyen bölümler @UnstableApi. Bu ayrımı netleştirmek amacıyla, istikrarsız veri kullanımı, API sembolleri, @OptIn ile açıklama eklenmedikçe lint hatası oluşturur.

@UnstableApi ek açıklaması, bir API'nin kalitesi veya performansıyla ilgili hiçbir şey ifade etmez, yalnızca "API tarafından dondurulmuş" olmadığı gerçeğini ima eder.

Kararsız API lint hatalarını işlemek için iki seçeneğiniz vardır:

  • Aynı sonuca ulaşan kararlı bir API kullanmaya geçin.
  • Kararsız API'yi kullanmaya devam edin ve kullanıma not olarak @OptIn ekleyin. Bunun için daha sonra gösterilecek.
@OptIn ek açıklamasını ekleyin

Android Studio, ek açıklamayı eklemenize yardımcı olabilir:

Ekran görüntüsü: Etkinleştirme ek açıklaması nasıl eklenir?
Şekil 2: Android Studio ile @androidx.annotations.OptIn ek açıklaması ekleme.

Kotlin'de belirli kullanım sitelerine manuel olarak da ek açıklama ekleyebilirsiniz:

import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi

@OptIn(UnstableApi::class)
fun functionUsingUnstableApi() { ... }

Java'da da:

import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;

@OptIn(markerClass = UnstableApi.class)
private void methodUsingUnstableApis() { ... }

package-info.java dosyası ekleyerek paketlerin tamamı etkinleştirilebilir:

@OptIn(markerClass = UnstableApi.class)
package name.of.your.package;

import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;

Belirli lint hatasını atlayarak projelerin tamamı etkinleştirilebilir. lint.xml dosyası:

 <?xml version="1.0" encoding="utf-8"?>
 <lint>
   <issue id="UnsafeOptInUsageError">
     <option name="opt-in" value="androidx.media3.common.util.UnstableApi" />
   </issue>
 </lint>

Kullanılmaması gereken bir kotlin.OptIn ek açıklaması da bulunuyor. İnsanların androidx.annotation.OptIn ek açıklamasının kullanılması önemlidir.