Podczas określania formatów obsługiwanych przez ExoPlayer należy pamiętać, że „formaty multimediów” są definiowane na wielu poziomach. Od najniższego do najwyższego poziomu są to:
- Format poszczególnych próbek multimedialnych (np. klatka wideo lub klatka audio). Są to przykładowe formaty. Pamiętaj, że typowy plik wideo zawiera multimedia w co najmniej 2 formatach próbkowania: jeden dla wideo (np. H.264) i jeden dla dźwięku (np. AAC).
- Format kontenera, w którym znajdują się próbki multimediów i powiązane metadane. Są to formaty kontenerów. Plik multimedialny ma jeden format kontenera (np. MP4), który jest zwykle oznaczony rozszerzeniem pliku. Pamiętaj, że w przypadku niektórych formatów wyłącznie dźwiękowych (np. MP3) format próbki i format kontenera mogą być takie same.
- technologie adaptacyjnego strumieniowego przesyłania danych, takie jak DASH, SmoothStreaming i HLS; Nie są to formaty multimediów, ale nadal trzeba określić, jaki poziom obsługi zapewnia ExoPlayer.
W sekcjach poniżej opisujemy obsługę ExoPlayera na poszczególnych poziomach, od najwyższego do najniższego. W dwóch ostatnich sekcjach opisujemy obsługę samodzielnych formatów napisów i odtwarzanie filmów HDR.
Strumieniowanie adaptacyjne
DASH
ExoPlayer obsługuje DASH w wielu formatach kontenerów. Strumienie multimediów muszą być rozdzielone, co oznacza, że w manifestach DASH muszą być zdefiniowane oddzielne elementy AdaptationSet dla wideo, audio i tekstu (wyjątkiem jest CEA-608, jak opisano w tabeli poniżej). Obsługiwane muszą być też formaty próbek audio i wideo (szczegółowe informacje znajdziesz w sekcji formaty próbek).
| Funkcja | Obsługiwane | Komentarze |
|---|---|---|
| Kontenery | ||
| FMP4 | TAK | Tylko strumienie zdemuksowane |
| WebM | TAK | Tylko strumienie zdemuksowane |
| Matroska | TAK | Tylko strumienie zdemuksowane |
| MPEG-TS | NIE | Brak planowanej obsługi |
| Napisy | ||
| TTML | TAK | Surowe lub osadzone w formacie FMP4 zgodnie z ISO/IEC 14496-30 |
| WebVTT | TAK | Surowe lub osadzone w formacie FMP4 zgodnie z ISO/IEC 14496-30 |
| CEA-608 | TAK | Osadzone w FMP4, gdy są sygnalizowane za pomocą deskryptorów ułatwień dostępu SCTE |
| CEA-708 | TAK | Osadzone w FMP4, gdy są sygnalizowane za pomocą deskryptorów ułatwień dostępu SCTE |
| Metadane | ||
| Metadane EMSG | TAK | Umieszczone w FMP4 |
| Ochrona treści | ||
| Widevine | TAK | Schemat „cenc”: API w wersji 19 lub nowszej; schemat „cbcs”: API w wersji 25 lub nowszej |
| PlayReady SL2000 | TAK | Android TV, tylko schemat „cenc” |
| ClearKey | TAK | Interfejs API w wersji 21 lub nowszej, tylko schemat „cenc” |
| Wstawianie reklam | ||
| Odtwarzanie z wieloma przedziałami czasu | TAK | |
| Wstawianie reklam sterowane przez serwer (xlinks) | NIE | |
| Reklamy po stronie serwera i po stronie klienta w pakiecie IMA SDK | TAK | Przewodnik po wstawianiu reklam |
| Odtwarzanie na żywo | ||
| Odtwarzanie na żywo | TAK | |
| Odtwarzanie na żywo w formacie CMAF z bardzo małym opóźnieniem | TAK | |
| Dane klienta Common Media (CMCD) | TAK | Przewodnik po integracji CMCD |
SmoothStreaming
ExoPlayer obsługuje SmoothStreaming w formacie kontenera FMP4. Strumienie multimediów muszą być rozdzielone, co oznacza, że wideo, audio i tekst muszą być zdefiniowane w odrębnych elementach StreamIndex w manifeście SmoothStreaming. Obsługiwane muszą być też formaty próbek audio i wideo (szczegółowe informacje znajdziesz w sekcji formaty próbek).
| Funkcja | Obsługiwane | Komentarze |
|---|---|---|
| Kontenery | ||
| FMP4 | TAK | Tylko strumienie zdemuksowane |
| Napisy | ||
| TTML | TAK | Umieszczone w FMP4 |
| Ochrona treści | ||
| PlayReady SL2000 | TAK | Tylko Android TV |
| Odtwarzanie na żywo | ||
| Odtwarzanie na żywo | TAK | |
| Common Media Client Data (CMCD) | TAK | Przewodnik po integracji |
HLS
ExoPlayer obsługuje HLS w wielu formatach kontenerów. Obsługiwane muszą być też formaty próbek audio i wideo (więcej informacji znajdziesz w sekcji formaty próbek). Gorąco zachęcamy producentów treści HLS do generowania wysokiej jakości strumieni HLS, jak opisano w tym poście na blogu.
| Funkcja | Obsługiwane | Komentarze |
|---|---|---|
| Kontenery | ||
| MPEG-TS | TAK | |
| FMP4/CMAF | TAK | |
| ADTS (AAC) | TAK | |
| MP3 | TAK | |
| Napisy | ||
| CEA-608 | TAK | |
| CEA-708 | TAK | |
| WebVTT | TAK | |
| Metadane | ||
| ID3 | TAK | |
| SCTE-35 | NIE | |
| Ochrona treści | ||
| AES-128 | TAK | |
| Przykładowy AES-128 | NIE | |
| Widevine | TAK | API w wersji 19+ (schemat „cenc”) i 25+ (schemat „cbcs”) |
| PlayReady SL2000 | TAK | Tylko Android TV |
| Kontrola serwera | ||
| Aktualizacje delta | TAK | |
| Blokowanie ponownego wczytywania playlisty | TAK | |
| Blokowanie wczytywania wskazówek wstępnego wczytywania | TAK | z wyjątkiem zakresów bajtów o nieokreślonej długości. |
| Wstawianie reklam | ||
| Wstawianie reklam sterowane przez serwer (reklamy pełnoekranowe) | Częściowo | Tylko VOD z X-ASSET-URI.
Transmisje na żywo i
X-ASSET-LIST zostaną dodane
później. |
| Reklamy po stronie serwera i po stronie klienta w pakiecie IMA SDK | TAK | Przewodnik po wstawianiu reklam |
| Odtwarzanie na żywo | ||
| Odtwarzanie na żywo | TAK | |
| HLS o małym opóźnieniu (Apple) | TAK | |
| HLS o niskim opóźnieniu (społeczność) | NIE | |
| Common Media Client Data CMCD | TAK | Przewodnik po integracji CMCD |
Progresywne formaty kontenerów
ExoPlayer może odtwarzać bezpośrednio strumienie w tych formatach kontenerów: Obsługiwane muszą być też formaty próbek audio i wideo (szczegółowe informacje znajdziesz w sekcji Formaty próbek). Informacje o obsługiwanych kontenerach i formatach obrazów znajdziesz w sekcji Obrazy.
| Format kontenera | Obsługiwane | Komentarze |
|---|---|---|
| MP4 | TAK | |
| M4A | TAK | |
| FMP4 | TAK | |
| WebM | TAK | |
| Matroska | TAK | |
| MP3 | TAK | Niektóre strumienie można przewijać tylko przy użyciu przewijania ze stałą szybkością transmisji** |
| Ogg | TAK | zawierające formaty Vorbis, Opus i FLAC; |
| WAV | TAK | |
| MPEG-TS | TAK | |
| MPEG-PS | TAK | |
| FLV | TAK | Nie można przewijać* |
| ADTS (AAC) | TAK | Można przewijać tylko przy użyciu przewijania ze stałą szybkością transmisji bitów** |
| FLAC | TAK | Korzystanie z biblioteki FLAC lub ekstraktora FLAC w bibliotece ExoPlayer*** |
| AMR | TAK | Można przewijać tylko przy użyciu przewijania ze stałą szybkością transmisji bitów** |
* Przewijanie jest niedostępne, ponieważ kontener nie zawiera metadanych (np. indeksu próbek), które umożliwiają odtwarzaczowi multimediów efektywne przewijanie. Jeśli wymagane jest wyszukiwanie, zalecamy użycie bardziej odpowiedniego formatu kontenera.
** Te ekstraktory mają flagi FLAG_ENABLE_CONSTANT_BITRATE_SEEKING umożliwiające przybliżone wyszukiwanie przy założeniu stałej szybkości transmisji. Ta funkcja nie jest domyślnie włączona. Najprostszym sposobem włączenia tej funkcji dla wszystkich ekstraktorów, które ją obsługują, jest użycie DefaultExtractorsFactory.setConstantBitrateSeekingEnabled, jak opisano tutaj.
*** Ekstraktor biblioteki FLAC generuje surowe dane audio, które mogą być obsługiwane przez platformę na wszystkich poziomach interfejsu API. Ekstraktor FLAC biblioteki ExoPlayer generuje ramki audio FLAC, dlatego wymaga dekodera FLAC (np. dekodera MediaCodec
obsługującego FLAC, który jest wymagany od poziomu interfejsu API 27, lub biblioteki FFmpeg z włączoną obsługą FLAC). DefaultExtractorsFactory korzysta z ekstraktora rozszerzeń, jeśli aplikacja została utworzona za pomocą biblioteki FLAC.
W przeciwnym razie używa ekstraktora biblioteki ExoPlayer.
RTSP
ExoPlayer obsługuje RTSP zarówno w przypadku transmisji na żywo, jak i na żądanie. Obsługiwane formaty próbek i typy sieci są wymienione poniżej.
Obsługiwane formaty próbek
- H264 (opis multimediów SDP musi zawierać dane SPS/PPS w atrybucie fmtp na potrzeby inicjowania dekodera).
- AAC (ze strumieniem bitów ADTS).
- AC3.
Obsługiwane typy sieci
- RTP przez UDP unicast (multicast nie jest obsługiwany).
- Przeplatany RTSP, RTP przez RTSP z użyciem TCP.
Przykładowe formaty
Domyślnie ExoPlayer używa dekoderów platformy Android. Dlatego obsługiwane formaty próbek zależą od platformy bazowej, a nie od ExoPlayera. Więcej informacji o formatach próbek obsługiwanych przez urządzenia z Androidem znajdziesz w sekcji Obsługiwane formaty multimediów. Pamiętaj, że poszczególne urządzenia mogą obsługiwać dodatkowe formaty, które nie są tutaj wymienione.
Oprócz dekoderów platformy Android ExoPlayer może też korzystać z rozszerzeń dekoderów programowych. Muszą one zostać utworzone ręcznie i uwzględnione w projektach, w których mają być używane. Obecnie udostępniamy biblioteki dekoderów programowych dla formatów AV1, VP9, FLAC, Opus, FFmpeg, MIDI, IAMF i MPEG-H.
Biblioteka FFmpeg
Biblioteka FFmpeg obsługuje dekodowanie różnych formatów próbek audio. Podczas tworzenia biblioteki możesz wybrać dekodery, które mają być w niej uwzględnione. Więcej informacji znajdziesz w pliku README.md biblioteki. W tabeli poniżej znajdziesz mapowanie formatu próbki audio na odpowiednią nazwę dekodera FFmpeg.
| Przykładowy format | Nazwy dekoderów |
|---|---|
| Vorbis | vorbis |
| Opus | opus |
| FLAC | flac |
| ALAC | alac |
| PCM μ-law | pcm_mulaw |
| PCM A-law | pcm_alaw |
| MP1, MP2, MP3 | mp3 |
| AMR-NB | amrnb |
| AMR-WB | amrwb |
| AAC | aac |
| AC-3 | ac3 |
| E-AC-3 | eac3 |
| DTS, DTS-HD | dca |
| TrueHD | mlp truehd |
Obrazy
ExoPlayer obsługuje te formaty obrazów: Więcej informacji o integracji z bibliotekami zewnętrznymi, które mogą obsługiwać inny zestaw formatów, znajdziesz w artykule Biblioteki wczytywania obrazów.
| Format obrazu | Obsługiwane | Uwagi |
|---|---|---|
| BMP | TAK | |
| GIF | NIE | Brak obsługi ekstraktora |
| JPEG | TAK | |
| Zdjęcie w ruchu JPEG | TAK | Obsługiwane są zdjęcia i filmy |
| JPEG Ultra HDR | TAK | W przypadku Androida w wersji starszej niż 14 lub na wyświetlaczach bez HDR przełącza się na SDR. |
| PNG | TAK | |
| WebP | TAK | |
| HEIF/HEIC | TAK | |
| Zdjęcie ruchome HEIC | TAK | |
| AVIF (wersja podstawowa) | TAK | Dekodowanie tylko na Androidzie 14 lub nowszym |
Samodzielne formaty napisów
ExoPlayer obsługuje samodzielne pliki z napisami w różnych formatach. Pliki z napisami można wczytywać z zewnątrz w sposób opisany na stronie elementów multimedialnych.
| Format kontenera | Obsługiwane | Typ MIME |
|---|---|---|
| WebVTT | TAK | MimeTypes.TEXT_VTT |
| TTML / SMPTE-TT | TAK | MimeTypes.APPLICATION_TTML |
| SubRip | TAK | MimeTypes.APPLICATION_SUBRIP |
| SubStationAlpha (SSA/ASS) | TAK | MimeTypes.TEXT_SSA |
Odtwarzanie filmów HDR
ExoPlayer obsługuje wyodrębnianie filmów HDR w różnych kontenerach, w tym Dolby Vision w MP4 i HDR10+ w Matroska/WebM. Dekodowanie i wyświetlanie treści HDR zależy od obsługi platformy Android i urządzenia. Więcej informacji o sprawdzaniu możliwości dekodowania i wyświetlania HDR oraz ograniczeń obsługi HDR w różnych wersjach Androida znajdziesz w sekcji Odtwarzanie filmów HDR.
Podczas odtwarzania strumienia HDR, który wymaga obsługi określonego profilu kodeka, domyślny selektor MediaCodec ExoPlayera wybierze dekoder obsługujący ten profil (jeśli jest dostępny), nawet jeśli inny dekoder tego samego typu MIME, który nie obsługuje tego profilu, znajduje się wyżej na liście kodeków. Może to spowodować wybranie dekodera programowego w przypadkach, gdy strumień przekracza możliwości dekodera sprzętowego dla tego samego typu MIME.