Medientracks verwenden

MediaTrack steht für einen Medientrack. Dabei kann es sich um einen Audiostream, einen Videostream oder Text (z. B. Untertitel) handeln. Ihre App kann Medienspuren gruppieren, gestalten und aktivieren.

Track konfigurieren

Sie können einen Track konfigurieren und ihm eine eindeutige ID zuweisen. Mit dem folgenden Code werden eine englische Textspur, eine französische Textspur und eine französische Audiodatei mit jeweils eigener ID erstellt:

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

Gruppen-Tracks

Sie können mehrere Tracks in einem Medienelement gruppieren, das durch MediaInfo dargestellt wird. Eine Instanz von MediaInfo verwendet ein Array von Tracks und fasst andere Informationen über das Medienelement zusammen. Aufbauend auf diesem Beispiel kann Ihre App diese drei Medien-Tracks einem Medienobjekt hinzufügen, indem sie eine Liste dieser drei Tracks an MediaInfo.Builder.setMediaTracks(List) übergibt. Ihre App muss Tracks in einem MediaInfo auf diese Weise verknüpfen, bevor sie die Medien in den Empfänger lädt.

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

Tracks entfernen

Um alle Tracks aus dem aktuellen Medium zu entfernen (z. B. das Deaktivieren der drei Untertitel im Beispiel), rufen Sie MediaInfo.Builder.setMediaTracks(List) auf und übergeben Sie eine leere Liste von IDs.

Titel aktualisieren

Ihre App kann einen oder mehrere Tracks aktivieren, die mit dem Medienelement verknüpft waren (nach dem Laden der Medien), indem RemoteMediaClient.setActiveMediaTracks(long[]) aufgerufen und die IDs der zu aktivierenden Tracks übergeben werden. In diesem Beispiel werden die französische Untertitel und das französische Audio aktiviert:

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

Texttracks gestalten

TextTrackStyle kapselt die Stilinformationen eines Text-Tracks. Nachdem Sie einen TextTrackStyle erstellt oder aktualisiert haben, können Sie diesen Stil auf das aktuell wiedergegebene Medienelement anwenden. Dazu rufen Sie RemoteMediaClient.setTextTrackStyle wie folgt auf:

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

Ihre App sollte es Nutzern ermöglichen, den Stil für Textspuren entweder über die vom System bereitgestellten Einstellungen oder von der App selbst zu aktualisieren. Ab Android KitKat können Sie die systemweiten Untertiteleinstellungen des Frameworks verwenden:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

Bei Versionen vor KitKat gibt der obige Aufruf ein Objekt zurück, dessen Felder nicht definiert sind. Sie müssen diese Felder also auf der Grundlage der Nutzerauswahl und einiger Standardwerte füllen. Sie können die folgenden Text-Track-Stilelemente gestalten:

  • Farbe und Deckkraft des Vordergrunds (Text)
  • Farbe und Transparenz des Hintergrunds
  • Rahmentyp
  • Rahmenfarbe
  • Schriftskala
  • Schriftfamilie
  • Schriftart

Legen Sie die Textfarbe beispielsweise wie folgt auf Rot (FF) mit einer Deckkraft von 50 % (80) fest:

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

In KitKat und höheren Versionen solltest du deine App so registrieren, dass du benachrichtigt wirst, wenn systemweite Untertiteleinstellungen aktualisiert werden. Dazu musst du CaptioningManager.CaptioningChangeListener in deiner App implementieren und diesen Listener mit folgendem Aufruf registrieren:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
CaptioningManager.addCaptioningChangeListener(yourChangeListener);

Wenn deine App einen Callback erhält, dass sich die Untertiteleinstellungen geändert haben, musst du die neuen Einstellungen extrahieren und den Stil des Untertitels für die aktuell wiedergegebenen Medien aktualisieren. Dazu musst du RemoteMediaClient.setTextTrackStyle aufrufen und den neuen Stil übergeben.

Statusupdates erhalten

Wenn mehrere Absender mit demselben Empfänger verbunden sind, ist es wichtig, dass jeder Sender über die Änderungen beim Empfänger informiert ist, auch wenn diese Änderungen von anderen Absendern initiiert wurden.

Zu diesem Zweck sollte Ihre Anwendung RemoteMediaClient.Listener und RemoteMediaClient.ProgressListener registrieren.

Wenn sich der TextTrackStyle des aktuellen Mediums ändert, werden alle verbundenen Absender über beide oben registrierten Listener benachrichtigt. In diesem Fall überprüft das Empfänger-SDK nicht, ob sich der neue Stil vom vorherigen unterscheidet, und benachrichtigt alle verbundenen Absender unabhängig davon. Wenn sich der Status von „Aktiv“ jedoch ändert, werden nur die RemoteMediaClient.ProgressListener der verbundenen Absender benachrichtigt.

CORS-Anforderungen erfüllen

Für adaptives Medienstreaming benötigt Google Cast CORS-Header. Auch für einfache MP4-Medienstreams ist CORS erforderlich, wenn sie Tracks enthalten. Wenn Sie Tracks für beliebige Medien aktivieren möchten, müssen Sie CORS sowohl für Ihre Track- als auch für Ihre Medienstreams aktivieren. Wenn auf Ihrem Server keine CORS-Header für Ihre einfachen MP4-Medien zur Verfügung stehen und Sie dann eine einfache Untertitelspur hinzufügen, können Sie Ihre Medien erst streamen, wenn Sie Ihren Server mit dem entsprechenden CORS-Header aktualisieren. Außerdem müssen Sie mindestens die folgenden Header zulassen: Content-Type, Accept-Encoding und Range. Die letzten beiden Header sind zusätzliche Header, die Sie möglicherweise zuvor nicht benötigt haben.