Fehlerbehebung


Fehler des Typs „Klartext-HTTP-Traffic nicht zulässig“ beheben

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

Wenn Ihre App mit Klartext-HTTP-Traffic arbeiten muss, müssen Sie eine Netzwerksicherheitskonfiguration verwenden, die dies zulässt. Weitere Informationen finden Sie in der Dokumentation zur Netzwerksicherheit von Android. Wenn Sie jeglichen Klartext-HTTP-Traffic zulassen möchten, können Sie einfach android:usesCleartextTraffic="true" in das application-Element der AndroidManifest.xml Ihrer App einfügen.

Die ExoPlayer-Demo-App verwendet die Standardkonfiguration für die Netzwerksicherheit und lässt daher keinen Klartext-HTTP-Traffic zu. Sie können es wie oben beschrieben aktivieren.

Fehler „SSLHandshakeException“, „CertPathValidatorException“ und „ERR_CERT_AUTHORITY_INVALID“ beheben

SSLHandshakeException, CertPathValidatorException und ERR_CERT_AUTHORITY_INVALID weisen auf ein Problem mit dem SSL-Zertifikat des Servers hin. Diese Fehler sind nicht ExoPlayer-spezifisch. Weitere Informationen finden Sie in der SSL-Dokumentation von Android.

Warum kann nach einigen Mediendateien nicht gesucht werden?

Standardmäßig unterstützt ExoPlayer keine Suche in Medien. Die einzige Methode für genaue Suchvorgänge besteht darin, dass der Player die gesamte Datei scannt und indexiert. ExoPlayer stuft solche Dateien als nicht lesbar ein. Die meisten modernen Mediencontainerformate enthalten Metadaten für die Suche (z. B. ein Stichprobenindex), haben einen klar definierten Suchalgorithmus (z. B. die interpolierte Suche nach Ogg) oder geben an, dass ihr Inhalt eine konstante Bitrate hat. In diesen Fällen sind effiziente Suchvorgänge möglich und werden von ExoPlayer unterstützt.

Wenn Sie eine Suche benötigen, aber über nicht lesbare Medien verfügen, empfehlen wir, die Inhalte in ein geeigneteres Containerformat zu konvertieren. Bei MP3-, ADTS- und AMR-Dateien können Sie die Suche auch unter der Annahme aktivieren, dass die Dateien eine konstante Bitrate haben, wie hier beschrieben.

Warum ist die Suche in einigen MP3-Dateien ungenau?

MP3-Dateien mit variabler Bitrate (VBR) sind grundsätzlich nicht für Anwendungsfälle geeignet, in denen eine exakte Suche erforderlich ist. Dafür gibt es zwei Gründe:

  1. Für eine genaue Suche bietet ein Containerformat im Idealfall eine genaue Zeit-zu-Byte-Zuordnung in einem Header. Durch diese Zuordnung kann ein Player eine angeforderte Suchzeit dem entsprechenden Byte-Offset zuordnen und mit dem Anfordern, Parsen und Abspielen von Medien von diesem Offset aus beginnen. Die verfügbaren Header (z. B. XING-Header) zur Angabe dieser Zuordnung in MP3 sind leider oft ungenau.
  2. Bei Containerformaten, die keine genaue Zeit-zu-Byte-Zuordnung (oder überhaupt keine Zeit-zu-Byte-Zuordnung) bieten, ist es dennoch möglich, eine exakte Suche durchzuführen, wenn der Container absolute Beispielzeitstempel im Stream enthält. In diesem Fall kann ein Player die Suchzeit einer bestmöglichen Schätzung des entsprechenden Byte-Offsets zuordnen, Medien aus diesem Offset anfordern, den Zeitstempel der ersten absoluten Stichprobe parsen und effektiv eine geführte binäre Suche in den Medien durchführen, bis das richtige Sample gefunden ist. Leider enthält MP3 keine absoluten Beispielzeitstempel im Stream, sodass dieser Ansatz nicht möglich ist.

Aus diesem Grund besteht die einzige Möglichkeit für eine exakte Suche in einer VBR-MP3-Datei darin, die gesamte Datei zu scannen und manuell eine Zeit-zu-Byte-Zuordnung im Player zu erstellen. Diese Strategie kann mit FLAG_ENABLE_INDEX_SEEKING aktiviert werden, das mit setMp3ExtractorFlags für eine DefaultExtractorsFactory festgelegt werden kann. Eine gute Skalierung für große MP3-Dateien ist nicht möglich, vor allem, wenn der Nutzer versucht, kurz nach dem Start der Wiedergabe bis zum Ende des Streams zu springen. In diesem Fall muss der Player warten, bis der gesamte Stream heruntergeladen und indexiert wurde, bevor er die Suche durchführt. In ExoPlayer haben wir uns entschieden, in diesem Fall die Geschwindigkeit statt der Genauigkeit zu optimieren. FLAG_ENABLE_INDEX_SEEKING ist daher standardmäßig deaktiviert.

Wenn Sie die Wiedergabe von Medien steuern, empfehlen wir Ihnen dringend, ein geeigneteres Containerformat wie MP4 zu verwenden. Es gibt keine bekannten Anwendungsfälle, bei denen MP3 die beste Wahl für ein Medienformat ist.

Warum ist die Suche in meinem Video langsam?

Wenn der Player in einem Video zu einer neuen Wiedergabeposition navigiert, sind zwei Dinge erforderlich:

  1. Laden Sie die Daten, die der neuen Wiedergabeposition entsprechen, in den Zwischenspeicher. Dies ist möglicherweise nicht erforderlich, wenn diese Daten bereits zwischengespeichert wurden.
  2. Leeren Sie den Videodecoder und beginnen Sie mit der Decodierung vom I-Frame (Keyframe) vor der neuen Wiedergabeposition. Dies ist auf die Intra-Frame-Codierung der meisten Videokomprimierungsformate zurückzuführen. Um sicherzustellen, dass die Suche genau ist (d. h., die Wiedergabe beginnt genau an der Suchposition), müssen alle Frames zwischen dem vorherigen I-Frame und der Suchposition decodiert und sofort verworfen werden (ohne auf dem Bildschirm angezeigt zu werden).

Die durch (1) erzeugte Latenz kann abgemildert werden, indem entweder die Menge der vom Player im Arbeitsspeicher zwischengespeicherten Daten erhöht oder die Daten vorab im Cache gespeichert werden.

Die durch (2) erzeugte Latenz kann abgemildert werden, indem entweder die Genauigkeit der Suche mit ExoPlayer.setSeekParameters verringert oder das Video neu codiert wird, sodass es häufigere I-Frames hat (was zu einer größeren Ausgabedatei führt).

Warum werden einige MPEG-TS-Dateien nicht abgespielt?

Einige MPEG-TS-Dateien enthalten keine Access Unit Delimiter (AUDs). Standardmäßig nutzt ExoPlayer zur kostengünstigen Erkennung von Frame-Grenzen AUDs. Außerdem enthalten einige MPEG-TS-Dateien keine IDR-Keyframes. Standardmäßig sind dies der einzige Keyframe-Typ, der von ExoPlayer berücksichtigt wird.

Wenn ExoPlayer zum Abspielen einer MPEG-TS-Datei ohne AUD- oder IDR-Keyframes aufgefordert wird, erscheint der Zwischenspeichervorgang bei ExoPlayer. Wenn Sie solche Dateien abspielen müssen, können Sie FLAG_DETECT_ACCESS_UNITS bzw. FLAG_ALLOW_NON_IDR_KEYFRAMES verwenden. Diese Flags können mit setTsExtractorFlags für einen DefaultExtractorsFactory oder mit dem Konstruktor für ein DefaultHlsExtractorFactory festgelegt werden. Die Verwendung von FLAG_DETECT_ACCESS_UNITS ist im Vergleich zur AUD-basierten Erkennung der Frame-Grenzen rechenintensiv und hat keine weiteren Nebenwirkungen. Die Verwendung von FLAG_ALLOW_NON_IDR_KEYFRAMES kann bei der Wiedergabe einiger MPEG-TS-Dateien zu vorübergehenden Bildfehlern beim Start der Wiedergabe und direkt nach der Suche führen.

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

Einige MPEG-TS-Dateien enthalten CEA-608-Tracks, deklarieren sie aber nicht in den Containermetadaten, sodass ExoPlayer sie nicht erkennen kann. Sie können alle Untertiteltracks manuell angeben. Dazu stellen Sie eine Liste der erwarteten Untertitelformate für DefaultExtractorsFactory bereit, einschließlich der Kanäle für die Barrierefreiheit, die zu ihrer Identifizierung im MPEG-TS-Stream verwendet 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 richtig wiedergegeben?

Einige MP4-/FMP4-Dateien enthalten Bearbeitungslisten, in denen die Medienzeitachse neu geschrieben wird, indem Stichprobenlisten übersprungen, verschoben oder wiederholt werden. ExoPlayer bietet teilweise Unterstützung für das Anwenden von Bearbeitungslisten. Sie kann beispielsweise Gruppen von Samples, die mit einem Synchronisierungsbeispiel beginnen, verzögern oder wiederholen. Audiobeispiele oder Pre-Roll-Medien für Bearbeitungen, die nicht an einem Synchronisierungsbeispiel beginnen, werden jedoch nicht abgeschnitten.

Wenn Sie feststellen, dass ein Teil des Mediums unerwartet fehlt oder wiederholt wird, legen Sie Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS oder FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS fest. Dies führt dazu, dass der Extrahierer Bearbeitungslisten vollständig ignoriert. Diese können mit setMp4ExtractorFlags oder setFragmentedMp4ExtractorFlags für ein DefaultExtractorsFactory festgelegt werden.

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

Die HTTP-Antwortcodes 301 und 302 zeigen beide eine Weiterleitung an. Kurze Beschreibungen finden Sie auf Wikipedia. Wenn ExoPlayer eine Anfrage stellt und eine Antwort mit dem Statuscode 301 oder 302 erhält, folgt es normalerweise der Weiterleitung und startet die Wiedergabe wie gewohnt. Dies geschieht jedoch nicht standardmäßig bei protokollübergreifenden Weiterleitungen. Bei einer protokollübergreifenden Weiterleitung erfolgt eine Weiterleitung von HTTPS zu HTTP oder umgekehrt (oder seltener zwischen zwei Protokollpaaren). Mit dem wget-Befehlszeilentool können Sie folgendermaßen testen, ob eine URL eine protokollübergreifende Weiterleitung verursacht:

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 führt von https://yourserver.com/test.mp3 zu https://second.com/test.mp3. Beide sind HTTPS, sodass es sich nicht um eine protokollübergreifende Weiterleitung handelt. Die zweite Weiterleitung führt von https://second.com/test.mp3 zu http://third.com/test.mp3. Diese Weiterleitung erfolgt von HTTPS zu HTTP, ebenso wie eine protokollübergreifende Weiterleitung. ExoPlayer folgt dieser Weiterleitung in der Standardkonfiguration nicht, sodass die Wiedergabe fehlschlägt.

Bei Bedarf können Sie ExoPlayer so konfigurieren, dass bei der Instanziierung von DefaultHttpDataSource.Factory-Instanzen in Ihrer Anwendung protokollübergreifende Weiterleitungen verwendet werden. Weitere Informationen zum Auswählen und Konfigurieren des Netzwerkstacks finden Sie hier.

Warum treten bei einigen Streams Fehler auf?

Diese Frage bezieht sich auf Wiedergabefehler in folgender 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, dass Sie versuchen, DASH (mpd), HLS (m3u8) oder SmoothStreaming (ism, ISml)-Inhalte abzuspielen, der Player versucht jedoch, diesen als Progressive-Stream abzuspielen. Zum Abspielen solcher Streams ist das jeweilige ExoPlayer-Modul erforderlich. Falls der Stream-URI nicht mit der Standarddateierweiterung endet, können Sie auch MimeTypes.APPLICATION_MPD, MimeTypes.APPLICATION_M3U8 oder MimeTypes.APPLICATION_SS an setMimeType von MediaItem.Builder übergeben, um den Streamtyp explizit anzugeben.

Die zweite, seltenere Ursache ist, dass ExoPlayer das Containerformat der Medien, die Sie wiedergeben möchten, nicht unterstützt. In diesem Fall funktioniert der Fehler wie vorgesehen. Sie können jedoch eine Funktionsanfrage an unsere Problemverfolgung senden, einschließlich Details zum Containerformat und einem Teststream. Suchen Sie nach einer bestehenden Funktionsanfrage, bevor Sie eine neue einreichen.

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

Wenn Sie einen Debug-Build Ihrer App unter Android M und niedriger ausführen, kann es bei der Verwendung der setPlaybackParameters API zu einer ruckeligen Leistung, hörbaren Artefakten und einer hohen CPU-Auslastung kommen. Das liegt daran, dass eine für diese API wichtige Optimierung für Debug-Builds deaktiviert ist, die auf diesen Android-Versionen ausgeführt werden.

Beachten Sie, dass dieses Problem nur Debug-Builds betrifft. Sie hat keinen Einfluss auf Release-Builds, für die die Optimierung immer aktiviert ist. Daher dürfte die Releases, die Sie Endnutzern zur Verfügung stellen, von diesem Problem nicht betroffen sein.

Was bedeutet die Fehlermeldung „Auf den Spieler wird im falschen Thread zugegriffen“?

Weitere Informationen finden Sie auf der Seite „Erste Schritte“ unter Hinweis zu Threads.

Wie kann ich den Fehler „Unerwartete Statuszeile: ICY 200 OK“ beheben?

Dieses Problem kann auftreten, wenn die Serverantwort eine ICY-Statuszeile statt einer HTTP-konformen Zeile enthält. ICY-Statuszeilen wurden eingestellt und sollten nicht verwendet werden. Wenn Sie den Server steuern, sollten Sie ihn so aktualisieren, dass eine HTTP-konforme Antwort zurückgegeben wird. Wenn das nicht möglich ist, können Sie das Problem mithilfe der ExoPlayer OkHttp-Bibliothek beheben, da diese ICY-Statuszeilen korrekt verarbeiten kann.

Wie kann ich abfragen, ob der abgespielte Stream ein Livestream ist?

Du kannst die isCurrentWindowLive-Methode des Players abfragen. Außerdem können Sie isCurrentWindowDynamic prüfen, um herauszufinden, ob das Fenster dynamisch ist (d. h., die Aktualisierung wird im Laufe der Zeit beibehalten).

Wie setze ich die Audiowiedergabe fort, wenn meine App im Hintergrund läuft?

So kannst du dafür sorgen, dass Audioinhalte auch dann weiterhin abgespielt werden, wenn die App im Hintergrund ausgeführt wird:

  1. Sie benötigen einen laufenden Dienst im Vordergrund. Dadurch wird verhindert, dass das System Ihren Prozess beendet, um Ressourcen freizugeben.
  2. Du musst eine WifiLock und eine WakeLock in der Hand halten. Diese sorgen dafür, dass das System die WLAN-Funkschnittstelle und die CPU aktiv hält. Wenn Sie ExoPlayer verwenden, ist dies einfach. Rufen Sie dazu setWakeMode auf. Dadurch werden die erforderlichen Sperren zum richtigen Zeitpunkt automatisch akquiriert und freigegeben.

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

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

Möglicherweise ist der Inhalt, den Sie wiedergeben möchten, nicht CORS-fähig. Für das Cast-Framework müssen Inhalte CORS aktiviert sein, damit sie abgespielt werden können.

Warum werden Inhalte nicht abgespielt, aber es werden keine Fehler angezeigt?

Möglicherweise unterstützt das Gerät, auf dem Sie die Inhalte wiedergeben, ein bestimmtes Medienbeispielformat nicht. Dies lässt sich leicht prüfen, indem Sie dem Player einen EventLogger als Listener hinzufügen und in Logcat nach einer Zeile wie dieser suchen:

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

NO_UNSUPPORTED_TYPE bedeutet, dass das Gerät das in mimeType angegebene Medienbeispielformat nicht decodieren kann. Informationen zu den unterstützten Beispielformaten findest du in der Dokumentation zu Android-Medienformaten. Wie kann ich dafür sorgen, dass eine Decodierungsbibliothek geladen und für die Wiedergabe verwendet wird?

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

  • Bei den meisten Decoderbibliotheken sind manuelle Schritte zum Auschecken und Erstellen der Abhängigkeiten erforderlich. Führen Sie daher die Schritte in der Infodatei für die jeweilige Bibliothek aus. Für die ExoPlayer-FFmpeg-Bibliothek müssen Sie beispielsweise der Anleitung unter domains/decoder_ffmpeg/README.md folgen, einschließlich der Übergabe von Konfigurations-Flags, um Decodierer für alle Formate zu aktivieren, die wiedergegeben werden sollen.
  • Achten Sie bei Bibliotheken mit nativem Code darauf, dass Sie die richtige Version des Android-NDK verwenden, wie in der README-Datei angegeben, und suchen Sie nach Fehlern, die während der Konfiguration und Erstellung auftreten. Nachdem Sie die Schritte in der README-Datei ausgeführt haben, sollten für jede unterstützte Architektur im Unterverzeichnis libs des Bibliothekspfads .so-Dateien angezeigt werden.
  • Wie Sie die Wiedergabe mithilfe der Bibliothek in der Demo-App testen, erfahren Sie unter Gebündelte Decodierer aktivieren. Eine Anleitung zur Verwendung der Bibliothek über Ihre eigene Anwendung finden Sie in der README-Datei für die Bibliothek.
  • Wenn Sie DefaultRenderersFactory verwenden, sollte beim Laden des Decoders in Logcat eine Protokollzeile auf Infoebene wie „Loaded FfmpegAudioRenderer“ angezeigt werden. Wenn diese Angabe fehlt, prüfen Sie, ob die Anwendung eine Abhängigkeit von der Decodierungsbibliothek hat.
  • Wenn in Logcat Logs auf Warnungsebene von LibraryLoader angezeigt werden, ist das Laden der nativen Komponente der Bibliothek fehlgeschlagen. Prüfen Sie in diesem Fall, ob Sie die Schritte in der README-Datei der Bibliothek korrekt ausgeführt haben und keine Fehler ausgegeben haben.

Wenn Sie weiterhin Probleme bei der Verwendung von Decodierungsbibliotheken haben, finden Sie in der Media3-Problemverfolgung aktuelle relevante Probleme. Wenn Sie ein neues Problem melden müssen, das sich auf das Erstellen des nativen Teils der Bibliothek bezieht, fügen Sie die vollständige Befehlszeilenausgabe aus der Ausführung der Readme-Anleitung hinzu, damit wir das Problem diagnostizieren können.

Kann ich YouTube-Videos direkt mit ExoPlayer abspielen?

Nein, ExoPlayer kann keine Videos von YouTube abspielen, z. B. URLs des Formats https://www.youtube.com/watch?v=.... Verwende stattdessen die YouTube iFrame Player API, die offiziell zum Abspielen von YouTube-Videos auf Android-Geräten.

Videowiedergabe ruckelt

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

Wenn Videos auf einem Gerät mit Android 6.0 (API-Level 23) bis einschließlich Android 11 (API-Level 30) ruckeln, insbesondere beim Abspielen von DRM-geschützten Inhalten oder Inhalten mit hoher Framerate, können Sie die asynchrone Zwischenspeicherung ausprobieren.