Fehlerbehebung


Problem „Klartext-HTTP-Traffic ist nicht zulässig“ beheben Fehler

Dieser Fehler tritt auf, wenn Ihre App HTTP-Traffic im Klartext anfordert (d. h. http:// statt https://), wenn die Netzwerksicherheitskonfiguration aktiviert ist. nicht erlauben. Wenn deine App auf Android 9 (API-Level 28) oder höher ausgerichtet ist: Klartext HTTP-Traffic ist in der Standardkonfiguration deaktiviert.

Wenn Ihre App mit HTTP-Traffic im Klartext arbeiten muss, müssen Sie einen Netzwerksicherheitskonfiguration, die dies zulässt. Weitere Informationen finden Sie in der Dokumentation zur Netzwerksicherheit . Um den gesamten HTTP-Datenverkehr im Klartext zu ermöglichen, fügen Sie android:usesCleartextTraffic="true" zum application-Element des AndroidManifest.xml

Die ExoPlayer-Demo-App verwendet die Standard-Netzwerksicherheitskonfiguration. Klartext-HTTP-Traffic wird nicht zugelassen. Du kannst es aktivieren, indem du der Anleitung folgst oben.

"SSLHandshakeException", "CertPathValidatorException" beheben und "ERR_CERT_AUTHORITY_INVALID" Fehler

SSLHandshakeException, CertPathValidatorException und Alle ERR_CERT_AUTHORITY_INVALID deuten auf ein Problem mit der SSL-Verschlüsselung des Servers hin. Zertifikat. Diese Fehler sind nicht ExoPlayer-spezifisch. Weitere Informationen finden Sie unter SSL-Dokumentation von Android .

Warum sind einige Mediendateien nicht suchbar?

Standardmäßig unterstützt ExoPlayer die Suche in Medien nicht, wenn die einzige Methode für Bei einer genauen Suche muss der Spieler den Bereich scannen und indexieren. in der gesamten Datei. ExoPlayer stuft solche Dateien als nicht aufrufbar ein. Modernste Medien Container-Formate beinhalten Metadaten für die Suche (z. B. einen Beispielindex), haben einen einen klar definierten Suchalgorithmus (z. B. interpolierte Teilungssuche nach Ogg) oder weisen darauf hin, dass der Inhalt eine konstante Bitrate hat. Effiziente Suchfunktionen möglich und von ExoPlayer unterstützt.

Wenn Sie nach Inhalten suchen möchten, aber unleserliche Medien haben, empfehlen wir Ihnen, Ihre um ein geeigneteres Containerformat zu verwenden. Für MP3-, ADTS- und AMR-Dateien: können Sie auch die Suche aktivieren, vorausgesetzt, die Dateien haben eine konstante Bitrate, wie beschrieben hier.

Warum ist die Suche bei einigen MP3-Dateien ungenau?

MP3-Dateien mit variabler Bitrate (VBR) sind für Anwendungsfälle, in denen eine genaue Suche erfordern. Dafür gibt es zwei Gründe:

  1. Für eine exakte Suche bietet ein Containerformat im Idealfall eine präzise Time-to-Byte-Zuordnung in einem Header. Mit dieser Zuordnung kann ein Spieler zum entsprechenden Byte-Offset an und fordern Sie an, das Parsen und Abspielen von Medien mit diesem Offset. Die Überschriften, die für die diese Zuordnung in MP3-Dateien wie XING-Headern festlegen, sind ungenau.
  2. Für Containerformate, die keine genaue Time-to-Byte-Zuordnung bieten (oder einer Time-to-Byte-Zuordnung), können Sie trotzdem eine exakte Prüfen Sie, ob der Container absolute Beispielzeitstempel im Stream enthält. In In diesem Fall kann der Spieler die Suchzeit einer Schätzung der Byte-Offset, Medien-Absatz ab diesem Versatz anfordern, erste absoluten Beispiel-Zeitstempel und effektiv eine geführte Binärsuche durchführen bis das richtige Sample gefunden ist. MP3-Dateien werden nicht absolute Beispiel-Zeitstempel in den Stream zu integrieren. möglich.

Aus diesen Gründen kann eine genaue Suche nach einer VBR-MP3-Datei nur über die gesamte Datei zu scannen und manuell eine Time-to-Byte-Zuordnung im Player. Diese Strategie kann mit FLAG_ENABLE_INDEX_SEEKING aktiviert werden, der auf einem DefaultExtractorsFactory festgelegt werden kann: setMp3ExtractorFlags Die Skalierung auf große MP3-Dateien ist nicht optimal, vor allem, wenn der Nutzer versucht, das Ende des Streams kurz zu erreichen Nach dem Start der Wiedergabe muss der Player warten, bis der Download abgeschlossen ist. und indexiert den gesamten Stream vor der Suche. In ExoPlayer Geschwindigkeit statt Genauigkeit in diesem Fall zu optimieren. FLAG_ENABLE_INDEX_SEEKING ist daher standardmäßig deaktiviert.

Wenn Sie die Medien steuern, die gerade abgespielt werden, empfehlen wir Ihnen dringend, ein geeigneten Containerformat wie MP4. Es gibt keine uns bekannten Anwendungsfälle in dem MP3 die beste Wahl für das Medienformat ist.

Warum ist die Suche in meinem Video langsam?

Wenn der Player in einem Video zu einer neuen Wiedergabeposition springt, müssen zwei Dinge:

  1. Daten, die der neuen Wiedergabeposition entsprechen, in den Zwischenspeicher laden (Dies ist möglicherweise nicht erforderlich, wenn diese Daten bereits zwischengespeichert wurden.)
  2. Leeren Sie den Videodecoder und beginnen Sie vor der Decodierung aus dem I-Frame (Keyframe) der neuen Wiedergabeposition aufgrund der von den meisten Videos verwendeten Intra-Frame-Codierung Komprimierungsformaten. Damit die Suche genau ist, d. h. Wiedergabe exakt an der Suchposition beginnt), alle Frames zwischen der vorherige I-Frame und die Suchposition müssen decodiert werden verworfen (ohne auf dem Bildschirm angezeigt zu werden).

Die durch (1) verursachte Latenz kann entweder durch Erhöhung des Werts vom Player oder durch Pre-Caching der Daten auf der Festplatte im Arbeitsspeicher zwischengespeichert.

Die durch (2) verursachte Latenz kann entweder durch Reduzierung der Genauigkeit der Suche mit ExoPlayer.setSeekParameters oder eine Neucodierung des Videos um häufigere I-Frames zu verwenden (was zu einer größeren Ausgabedatei führt).

Warum werden einige MPEG-TS-Dateien nicht abgespielt?

Einige MPEG-TS-Dateien enthalten keine AUDs (Access Unit Delimiter). Standardmäßig ExoPlayer nutzt AUDs, um Frame-Grenzen kostengünstig zu erkennen. Auch einige MPEG-TS-Dateien enthalten keine IDR-Keyframes. Standardmäßig sind dies die einzigen von ExoPlayer berücksichtigten Keyframes aus.

Der ExoPlayer scheint in der Pufferung zu hängen, wenn eine Aufforderung zur Wiedergabe eines MPEG-TS-Datei ohne AUDs oder IDR-Keyframes Wenn Sie solche Dateien abspielen möchten, können Sie dazu FLAG_DETECT_ACCESS_UNITS und FLAG_ALLOW_NON_IDR_KEYFRAMES. Diese Flags können auf einer DefaultExtractorsFactory mit setTsExtractorFlags oder auf einem DefaultHlsExtractorFactory mit dem Konstruktor Die Verwendung von FLAG_DETECT_ACCESS_UNITS hat keine Nebeneffekte, außer dass im Vergleich zur AUD-basierten Frame-Grenzenerkennung rechenintensiv. Verwendung von FLAG_ALLOW_NON_IDR_KEYFRAMES kann zu einer vorübergehenden Beschädigung der Darstellung am Start der Wiedergabe und unmittelbar nach einer Suche bei der Wiedergabe einiger MPEG-TS-Dateien.

Warum werden in einigen MPEG-TS-Dateien keine Untertitel gefunden?

Einige MPEG-TS-Dateien enthalten CEA-608-Tracks, deklarieren diese aber nicht im Containermetadaten, sodass ExoPlayer sie nicht erkennen kann. Sie können manuell etwaige Untertiteltracks angeben, indem du eine Liste der erwarteten in DefaultExtractorsFactory untertiteln, einschließlich der Bedienungshilfen Kanäle, mit denen sie im MPEG-TS-Stream identifiziert werden können:

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

Warum werden einige MP4-/FMP4-Dateien nicht korrekt wiedergegeben?

Einige MP4-/FMP4-Dateien enthalten Bearbeitungslisten, in denen die Medienzeitachse das Überspringen, Verschieben oder Wiederholen von Stichprobenlisten. ExoPlayer wird teilweise unterstützt zum Anwenden von Bearbeitungslisten. Sie können beispielsweise Stichprobengruppen verzögern oder wiederholen mit einem Synchronisierungsbeispiel beginnen, aber keine Audiobeispiele oder Pre-Roll-Medien für Bearbeitungen, die nicht bei einem Synchronisierungsbeispiel gestartet werden.

Wenn Sie feststellen, dass ein Teil des Mediums unerwartet fehlt oder wiederholt wird, versuchen Sie, Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS festzulegen oder FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS. Dies führt dazu, dass wird der Extraktor die Bearbeitungslisten vollständig ignorieren. Diese können auf einem DefaultExtractorsFactory mit setMp4ExtractorFlags oder setFragmentedMp4ExtractorFlags

Warum schlagen einige Streams mit dem HTTP-Antwortcode 301 oder 302 fehl?

Die HTTP-Antwortcodes 301 und 302 weisen beide auf eine Weiterleitung hin. Kurze Beschreibungen finden Sie bei Wikipedia. Wenn ExoPlayer eine Anfrage sendet und eine mit dem Statuscode 301 oder 302, folgt er normalerweise der Weiterleitung, und starte die Wiedergabe wie gewohnt. In diesem Fall geschieht dies nicht standardmäßig, sind protokollübergreifende Weiterleitungen. Eine protokollübergreifende Weiterleitung leitet die Nutzer von HTTPS zu HTTP oder umgekehrt (oder seltener zwischen zwei Protokolle). Sie können testen, ob eine URL eine protokollübergreifende Weiterleitung verursacht: wget-Befehlszeilentool:

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

Die Ausgabe sollte in etwa so aussehen:

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

In diesem Beispiel gibt es zwei Weiterleitungen. Die erste Weiterleitung https://yourserver.com/test.mp3 in https://second.com/test.mp3. Beide sind HTTPS. Es handelt sich also nicht um eine protokollübergreifende Weiterleitung. Die zweite Weiterleitung https://second.com/test.mp3 in http://third.com/test.mp3. Dadurch wird weitergeleitet, von HTTPS zu HTTP sowie eine protokollübergreifende Weiterleitung. ExoPlayer wird keine folgen Sie dieser Weiterleitung in der Standardkonfiguration, was bedeutet, dass die Wiedergabe fehlschlägt.

Bei Bedarf können Sie ExoPlayer so konfigurieren, dass protokollübergreifende Weiterleitungen befolgt werden. beim Instanziieren von DefaultHttpDataSource.Factory-Instanzen in Ihrem . Weitere Informationen zum Auswählen und Konfigurieren des Netzwerkstacks hier.

Warum schlagen einige Streams mit der Ausnahme „UnrecognizedInputFormatException“ fehl?

Diese Frage bezieht sich auf Wiedergabefehler in der folgenden Form:

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

Für diesen Fehler gibt es zwei mögliche Ursachen. Die häufigste Ursache ist, Sie versuchen DASH (mpd), HLS (m3u8) oder SmoothStreaming (ism, isml) wiederzugeben. wird jedoch ein progressiver Stream abgespielt. Um solche Streams müssen Sie auf das jeweilige ExoPlayer-Modul angewiesen sein. In Fällen, in denen Wenn der Stream-URI nicht mit der Dateiendung „Standard“ endet, können Sie auch MimeTypes.APPLICATION_MPD, MimeTypes.APPLICATION_M3U8 oder MimeTypes.APPLICATION_SS bis setMimeType von MediaItem.Builder, um explizit gibt den Streamtyp an.

Die zweite, weniger häufig auftretende Ursache ist, dass ExoPlayer den Container nicht unterstützt. Format des Mediums, das Sie wiedergeben möchten. In diesem Fall ist der Fehler wie vorgesehen funktioniert. Sie können jedoch gerne eine Funktionsanfrage an unser Problemverfolgung mit Details zum Containerformat und Teststream. Suchen Sie nach einer Funktionsanfrage, bevor Sie eine neue einreichen.

Warum funktioniert „setWiedergabeParameters“ auf einigen Geräten nicht richtig?

Wenn du einen Debug-Build deiner App unter Android M und niedriger ausführst, eine abgehackte Leistung, hörbare Artefakte und eine hohe CPU-Auslastung mit der setPlaybackParameters API. Das liegt daran, dass eine Optimierung die für diese API wichtig sind, ist für Debug-Builds, die auf diesen Versionen von Android.

Beachten Sie, dass sich dieses Problem nur auf Debug-Builds auswirkt. Es funktioniert nicht wirken sich auf Release-Builds aus, für die die Optimierung immer aktiviert ist. Daher ist der Releases, die Sie für Endnutzer zur Verfügung stellen, sollten von diesem Problem nicht betroffen sein.

Was muss ich tun, wenn der Zugriff auf den Player im falschen Thread erfolgt? Fehler bedeuten?

Weitere Informationen finden Sie auf der Seite "Erste Schritte" unter Ein Hinweis zu Threading.

Wie kann ich die Meldung "Unerwartete Statuszeile: ICY 200 OK" korrigieren?

Dieses Problem kann auftreten, wenn die Serverantwort eine ICY-Statuszeile, statt HTTP-kompatibel. ICY-Statuszeilen wurden eingestellt und sollte nicht verwendet werden. Wenn Sie also über den Server verfügen, sollten Sie ihn aktualisieren, eine HTTP-konforme Antwort. Ist dies nicht möglich, verwenden Sie das Die ExoPlayer-OkHttp-Bibliothek behebt das Problem, da sie ICY verarbeiten kann. die richtigen Statuszeilen angezeigt.

Wie kann ich abfragen, ob es sich bei dem wiedergegebenen Stream um einen Livestream handelt?

Du kannst die Methode isCurrentWindowLive des Spielers abfragen. Darüber hinaus können Sie Sie können isCurrentWindowDynamic prüfen, um herauszufinden, ob das Fenster dynamisch ist (d. h. die Aktualisierung erfolgt im Laufe der Zeit).

Wie kann ich die Audiowiedergabe fortsetzen, wenn meine App im Hintergrund läuft?

Mit diesen Schritten sorgen Sie für eine unterbrechungsfreie Audiowiedergabe, wenn Ihre App installiert ist. Hintergrund:

  1. Sie benötigen einen laufenden Dienst im Vordergrund. Dadurch wird verhindert, dass das System Ihren Prozess abzubrechen, um Ressourcen freizugeben.
  2. Du musst ein WifiLock und ein WakeLock halten. Sie sorgen dafür, dass die das WLAN-Radio und die CPU aktiviert. Das ist ganz einfach, wenn Sie ExoPlayer durch Aufrufen von setWakeMode. Rufen Sie die erforderlichen Sperren zum richtigen Zeitpunkt ab und lassen Sie sie wieder los.

Es ist wichtig, dass Sie die Sperren aufheben (wenn Sie setWakeMode nicht verwenden) und sobald keine Audioinhalte mehr abgespielt werden.

Warum unterstützt ExoPlayer meine Inhalte, die Cast-Bibliothek von ExoPlayer jedoch nicht?

Möglicherweise sind die Inhalte, die du dir ansehen möchtest, CORS aktiviert Für das Cast-Framework müssen Inhalte CORS aktiviert sein in um sie abzuspielen.

Warum werden Inhalte nicht abgespielt, obwohl keine Fehlermeldung angezeigt wird?

Möglicherweise nutzt das Gerät, auf dem Sie die Inhalte wiedergeben, ein bestimmtes Medienbeispielformat unterstützen. Dies können Sie ganz einfach bestätigen, indem Sie EventLogger als Listener für den Player und suche nach einer Linie ähnlich wie hier in Logcat:

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

NO_UNSUPPORTED_TYPE bedeutet, dass das Gerät die Medien nicht decodieren kann. Beispielformat, das durch mimeType angegeben wird. Medienformate für Android Dokumentation finden Sie Informationen zu unterstützten Beispielformaten. Wie erhalte ich eine Decodierungsbibliothek zum Laden und Verwenden für die Wiedergabe? könnte auch nützlich sein.

Wie kann ich eine Decodierungsbibliothek laden und für die Wiedergabe verwenden?

  • Die meisten Decoderbibliotheken haben manuelle Schritte zum Auschecken und Erstellen der Abhängigkeiten. Stellen Sie sicher, dass Sie die Schritte in der README-Datei für die entsprechende Bibliothek befolgt haben. Für die ExoPlayer-FFmpeg-Bibliothek müssen beispielsweise library/decoder_ffmpeg/README.md, einschließlich der Übergabe von um Decodierer für die Formate zu aktivieren, die du wiedergeben möchtest.
  • Verwenden Sie bei Bibliotheken mit nativem Code den richtigen des Android-NDK entsprechend der Angabe in der README-Datei. Achten Sie auf Fehler, die während der Konfiguration und Erstellung auftreten. Hier sollte .so zu sehen sein. werden die Dateien im Unterverzeichnis libs des Bibliothekspfads für jedes Architektur unterstützt, nachdem Sie die Schritte in der README-Datei ausgeführt haben.
  • Wie du die Wiedergabe mit der Bibliothek in der Demo-App testest, erfährst du unter Gebündelte Decoder aktivieren. Weitere Informationen finden Sie in der README-Datei der Bibliothek für Anweisungen zur Verwendung der Bibliothek über deine eigene App.
  • Wenn Sie DefaultRenderersFactory verwenden, sollte eine Infoebene angezeigt werden. Log-Zeile wie „Loaded FfmpegAudioRenderer“. in Logcat ein, wenn der Decoder lädt. Wenn dies fehlt, stellen Sie sicher, dass die Anwendung eine Abhängigkeit vom Decodierungsbibliothek.
  • Wenn Sie in Logcat Logs auf Warnungsebene von LibraryLoader sehen, ist dies zeigt an, dass die native Komponente der Bibliothek nicht geladen werden konnte. Wenn dieses überprüfen Sie, ob Sie die Schritte in der README-Datei der Bibliothek korrekt befolgt haben. und dass beim Befolgen der Anweisungen keine Fehler ausgegeben wurden.

Sollten weiterhin Probleme bei der Verwendung von Decodierungsbibliotheken auftreten, überprüfen Sie die Media3-Problemverfolgung für aktuelle relevante Probleme Wenn Sie es eine neue Ausgabe gibt, die sich auf den Bau des nativen Teils der Bibliothek bezieht, Vollständige Befehlszeilenausgabe zur Ausführung von README-Anweisungen um das Problem zu diagnostizieren.

Kann ich YouTube-Videos direkt mit ExoPlayer wiedergeben?

Nein, ExoPlayer kann keine YouTube-Videos, z. B. URLs im folgenden Format, abspielen. https://www.youtube.com/watch?v=... Verwenden Sie stattdessen das YouTube- iFrame Player API die offizielle Methode zum Abspielen von YouTube-Videos auf Android.

Videowiedergabe ruckelt

Das Gerät kann den Inhalt möglicherweise nicht schnell genug decodieren, wenn beispielsweise Die Bitrate oder Auflösung des Inhalts überschreitet die Gerätefunktionen. Möglicherweise benötigen Sie Inhalte von geringerer Qualität zu verwenden, um auf solchen Geräten eine gute Leistung zu erzielen.

Video stockende Videos auf Geräten mit Android-Versionen von Android 6.0 (API-Level 23) bis einschließlich Android 11 (API-Level 30) insbesondere bei der Wiedergabe von DRM-geschützten Inhalten oder Inhalten mit hoher Frame-Rate, asynchrone Pufferwarteschlangen aktivieren.

Instabile API-Lint-Fehler

Media3 garantiert die binäre Kompatibilität für einen Teil der API-Oberfläche. Die Teile, die keine binäre Kompatibilität garantieren, sind mit @UnstableApi Um diese Unterscheidung zu verdeutlichen, API-Symbole generieren einen Lint-Fehler, sofern sie nicht mit @OptIn gekennzeichnet sind.

Die Anmerkung @UnstableApi impliziert nichts über die Qualität oder Leistung einer API, sondern nur die Tatsache, dass sie nicht „API-eingefroren“ ist.

Sie haben zwei Möglichkeiten, um instabile API-Lint-Fehler zu handhaben:

  • Wechseln Sie zu einer stabilen API, mit der Sie dasselbe Ergebnis erzielen.
  • Verwenden Sie weiterhin die instabile API und vermerken Sie die Nutzung mit @OptIn, als wie später dargestellt.
Annotation @OptIn hinzufügen

In Android Studio können Sie die Anmerkung hinzufügen:

<ph type="x-smartling-placeholder">
</ph> Screenshot: Optin-Anmerkung hinzufügen
Abbildung 2: Annotation @androidx.annotations.OptIn mit Android Studio hinzufügen

Sie können in Kotlin auch manuell Anmerkungen zu bestimmten Nutzungswebsites machen:

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

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

Und auch in Java:

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

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

Du kannst die Option für ganze Pakete aktivieren, indem du eine package-info.java-Datei hinzufügst:

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

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

Sie können die Aktivierung für ganze Projekte vornehmen, indem Sie den spezifischen Lint-Fehler in ihrer lint.xml-Datei:

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

Es gibt auch die Anmerkung kotlin.OptIn, die nicht verwendet werden sollte. Es ist ist es wichtig, die Anmerkung androidx.annotation.OptIn zu verwenden.