MediaTrack
reprezentuje ścieżkę multimedialną, którą może być strumień audio, wideo lub tekst
(np. napisy). Aplikacja może grupować, zmieniać styl i aktywować
ścieżek multimedialnych.
Konfigurowanie ścieżki
Możesz skonfigurować ścieżkę i przypisać do niej unikalny identyfikator. Następujący kod: tworzy ścieżkę tekstową w języku angielskim, francuską ścieżkę tekstową i francuską ścieżkę audio, każdy z własnym identyfikatorem:
val englishSubtitle = MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build() val frenchSubtitle = MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build() val frenchAudio = MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build()
MediaTrack englishSubtitle = new MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build(); MediaTrack frenchSubtitle = new MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build(); MediaTrack frenchAudio = new MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build();
Grupuj ścieżki
Możesz zgrupować wiele ścieżek w element multimedialny reprezentowany przez
MediaInfo
Instancja MediaInfo
pobiera tablicę ścieżek audio i agreguje inne informacje o elemencie multimedialnym.
Na przykład aplikacja może dodać te 3 ścieżki multimedialne do pliku danych
poprzez przekazanie listy tych 3 ścieżek
MediaInfo.Builder.setMediaTracks(List)
Twoja aplikacja musi powiązać ścieżki w MediaInfo
w ten sposób, zanim zostanie wczytana
z multimediów do odbiorcy.
val tracks: MutableList<MediaTrack> = ArrayList<MediaTrack>() tracks.add(englishSubtitle) tracks.add(frenchSubtitle) tracks.add(frenchAudio) val mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build()
List tracks = new ArrayList(); tracks.add(englishSubtitle); tracks.add(frenchSubtitle); tracks.add(frenchAudio); MediaInfo mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build();
Usuń ścieżki
Aby usunąć wszystkie ścieżki z bieżących multimediów (np. wyłączyć trzy
napisów w przykładzie), wywołaj
MediaInfo.Builder.setMediaTracks(List)
i przekazać pustą listę identyfikatorów.
Zaktualizuj utwory
Twoja aplikacja może aktywować jedną lub więcej ścieżek powiązanych z multimediami
(po wczytaniu multimediów), przez wywołanie
RemoteMediaClient.setActiveMediaTracks(long[])
i przekazywanie identyfikatorów ścieżek do aktywacji. W tym przykładzie aktywujesz
Francuskie napisy i francuska ścieżka dźwiękowa:
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(longArrayOf(2, 3)) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.status.statusCode ) } })
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(new long[]{2, 3}) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.getStatus().getStatusCode()); } });
Zmienianie stylu ścieżek tekstowych
TextTrackStyle
zawiera informacje o stylu ścieżki tekstowej. Po utworzeniu lub zaktualizowaniu
istniejącego TextTrackStyle, możesz zastosować go do obecnie odtwarzanych
element multimedialny przez wywołanie
RemoteMediaClient.setTextTrackStyle
podobny do tego:
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setTextTrackStyle(style) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.status.statusCode ) } })
remoteMediaClient.setTextTrackStyle(style) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.getStatus().getStatusCode()); } });
Aplikacja powinna pozwalać użytkownikom na aktualizowanie stylu ścieżek tekstowych za pomocą: ustawienia określone przez system lub aplikację. Android KitKat i nowszych, możesz zastosować systemowe ustawienia napisów określone przez platforma:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
W przypadku wersji starszych niż KitKat powyższe wywołanie zwróci obiekt, którego są niezdefiniowane, więc musisz wypełnić te pola w aplikacji, na wybory użytkownika i wartości domyślne. Możesz zmienić styl poniższego tekstu elementy stylu ścieżki:
- Kolor i przezroczystość pierwszego planu (tekstu)
- kolor i przezroczystość tła;
- Typ krawędzi
- Kolor krawędzi
- Skala czcionki
- Rodzina czcionek
- Styl czcionki
Na przykład ustaw kolor tekstu na czerwony (FF) z przezroczystością 50% (80) w następujący sposób:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
W wersji KitKat i nowszych zarejestruj aplikację, aby otrzymywać powiadomienia
po aktualizacji systemowych ustawień napisów. W tym celu
wdrożyć
CaptioningManager.CaptioningChangeListener
w aplikacji i zarejestruj tego detektora, wywołując:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
Gdy do aplikacji zadzwonimy, że ustawienia napisów uległy zmianie,
będzie musiał pobrać nowe ustawienia i zaktualizować styl tekstu
napisy do multimediów, które są obecnie odtwarzane w wyniku połączenia
RemoteMediaClient.setTextTrackStyle
i przekazywanie jej w nowym stylu.
Otrzymywanie aktualizacji stanu
Gdy z tym samym odbiornikiem jest połączonych wielu nadawców, ważne jest, aby nadawcy, aby wiedzieć o zmianach w odbiorcy, nawet jeśli się zmienią zostały zainicjowane od innych nadawców.
W tym celu aplikacja powinna zarejestrować
RemoteMediaClient.Listener
i
RemoteMediaClient.ProgressListener
Jeśli
TextTrackStyle
o bieżących zmianach w multimediach, wszyscy połączeni nadawcy otrzymają powiadomienie
za pośrednictwem obu wyżej zarejestrowanych słuchaczy. W takim przypadku pakiet SDK odbierający
nie sprawdza, czy nowy styl różni się od poprzedniego oraz
powiadamia o wszystkich połączonych nadawcach niezależnie od tego. Jeśli jednak stan
zmian aktywnych ścieżek, tylko RemoteMediaClient.ProgressListener
w
połączeni nadawcy zostaną powiadomieni.
Spełnij wymagania CORS
Do adaptacyjnego strumieniowego przesyłania multimediów Google Cast wymaga obecności: CORS, ale nawet proste pliki MP4 strumienie multimediów wymagają CORS, jeśli zawierają ścieżki. Jeśli chcesz włączyć Ścieżki dla dowolnych multimediów, musisz włączyć CORS zarówno dla strumieni ścieżek, jak i dla multimediów strumienie. Jeśli więc nie masz nagłówków CORS dla prostych multimediów w formacie mp4, na serwerze. Gdy dodasz prostą ścieżkę z napisami, nie będzie można aby odtwarzać multimedia strumieniowo, chyba że zaktualizujesz serwer, dodając do Nagłówek CORS. Dodatkowo musisz zezwolić na dostęp do co najmniej tych nagłówków: Content-Type, Accept-Encoding i Range. Zwróć uwagę, że ostatnie 2 nagłówki są dodatkowe nagłówki, które mogły nie być wcześniej potrzebne.