Użyj ścieżek multimedialnych

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:

Kotlin
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()
Java
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.

Kotlin
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()
Java
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:

Kotlin
// 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
                    )
                }
    })
Java
// 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:

Kotlin
// 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
                    )
                }
    })
Java
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:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
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:

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
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:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
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.