Utiliser des pistes multimédias

Une piste multimédia peut être un objet de flux audio ou vidéo, ou un objet de texte (sous-titre ou légende).

Un objet GCKMediaTrack représente une piste. Il se compose d'un identifiant numérique unique et d'autres attributs tels qu'un ID de contenu et un titre. Une instance GCKMediaTrack peut être créée comme suit :

Swift
let captionsTrack = GCKMediaTrack.init(identifier: 1,
                                       contentIdentifier: "https://some-url/caption_en.vtt",
                                       contentType: "text/vtt",
                                       type: GCKMediaTrackType.text,
                                       textSubtype: GCKMediaTextTrackSubtype.captions,
                                       name: "English Captions",
                                       languageCode: "en",
                                       customData: nil)
Objective-C
GCKMediaTrack *captionsTrack =
      [[GCKMediaTrack alloc] initWithIdentifier:1
                              contentIdentifier:@"https://some-url/caption_en.vtt"
                                    contentType:@"text/vtt"
                                           type:GCKMediaTrackTypeText
                                    textSubtype:GCKMediaTextTrackSubtypeCaptions
                                           name:@"English Captions"
                                   languageCode:@"en"
                                     customData:nil];

Un élément multimédia peut comporter plusieurs pistes. Par exemple, il peut comporter plusieurs sous-titres (chacun dans une langue différente) ou plusieurs flux audio alternatifs (pour différentes langues). GCKMediaInformation est la classe qui représente un élément multimédia. Pour associer une collection d'objets GCKMediaTrack à un élément multimédia, votre application doit mettre à jour sa propriété mediaTracks. Votre application doit établir cette association avant de charger le contenu multimédia sur le récepteur, comme dans le code suivant :

Swift
let tracks = [captionsTrack]

let url = URL.init(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
guard let mediaURL = url else {
  print("invalid mediaURL")
  return
}

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentURL: mediaURL)
mediaInfoBuilder.streamType = GCKMediaStreamType.none;
mediaInfoBuilder.contentType = "video/mp4"
mediaInfoBuilder.metadata = metadata;
mediaInfoBuilder.mediaTracks = tracks;
mediaInformation = mediaInfoBuilder.build()
Objective-C
NSArray *tracks = @[captionsTrack];

GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentURL:
   [NSURL URLWithString:@"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"]];
mediaInfoBuilder.streamType = GCKMediaStreamTypeNone;
mediaInfoBuilder.contentType = @"video/mp4";
mediaInfoBuilder.metadata = metadata;
mediaInfoBuilder.mediaTracks = tracks;
self.mediaInformation = [mediaInfoBuilder build];

Activez une ou plusieurs pistes associées à l'élément multimédia (après le chargement du contenu multimédia) en appelant -[setActiveTrackIDs:] sur GCKRemoteMediaClient et en transmettant les ID des pistes à activer. Par exemple, le code suivant active la piste de sous-titres créée ci-dessus.

Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
Objective-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];

Pour désactiver une piste sur l'élément multimédia actuel, appelez -[setActiveTrackIDs:] sur GCKRemoteMediaClient avec un tableau vide ou nil. Le code suivant désactive la piste de sous-titres.

Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
Objective-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];

Mettre en forme les pistes de texte

La classe GCKMediaTextTrackStyle encapsule les informations de style d'une piste de texte. Un style de piste peut être appliqué à l'élément multimédia en cours de lecture en appelant -[GCKRemoteMediaClient setTextTrackStyle]. Le style de piste créé dans le code ci-dessous rend le texte rouge (FF) à 50% d'opacité (80) et définit une police avec serif.

Swift
let textTrackStyle = GCKMediaTextTrackStyle.createDefault()
textTrackStyle.foregroundColor = GCKColor.init(cssString: "#FF000080")
textTrackStyle.fontFamily = "serif"
styleChangeRequest = sessionManager.currentSession?.remoteMediaClient?.setTextTrackStyle(textTrackStyle)
styleChangeRequest?.delegate = self
Objective-C
GCKMediaTextTrackStyle *textTrackStyle = [GCKMediaTextTrackStyle createDefault];
[textTrackStyle setForegroundColor:[[GCKColor alloc] initWithCSSString:@"#FF000080"]];
[textTrackStyle setFontFamily:@"serif"];
self.styleChangeRequest = [self.sessionManager.currentSession.remoteMediaClient setTextTrackStyle:textTrackStyle];
self.styleChangeRequest.delegate = self;

Vous pouvez utiliser l'objet GCKRequest renvoyé pour suivre cette requête.

Swift
// MARK: - GCKRequestDelegate

func requestDidComplete(_ request: GCKRequest) {
  if request == styleChangeRequest {
    print("Style update completed.")
    styleChangeRequest = nil
  }
}
Objective-C
#pragma mark - GCKRequestDelegate

- (void)requestDidComplete:(GCKRequest *)request {
  if (request == self.styleChangeRequest) {
    NSLog(@"Style update completed.");
    self.styleChangeRequest = nil;
  }
}

Pour en savoir plus, consultez la section Mises à jour de l'état ci-dessous. Les applications doivent permettre aux utilisateurs de modifier le style des pistes de texte, soit à l'aide des paramètres fournis par le système, soit par l'application elle-même. Un style par défaut est fourni. Il peut être récupéré à l'aide de la méthode statique +[GCKMediaTextTrackStyle createDefault]. Vous pouvez modifier les éléments de style suivants des pistes de texte :

  • Couleur et opacité du texte (premier plan)
  • Couleur et opacité de l'arrière-plan
  • Type de contour
  • Couleur du contour
  • Mise à l'échelle de la police
  • Famille de polices
  • Style de police

Recevoir des informations sur l'état

Lorsque plusieurs expéditeurs sont connectés au même récepteur, il est important que chacun d'eux soit informé des modifications apportées au récepteur, même si elles ont été initiées par d'autres expéditeurs.

Pour vous assurer que votre expéditeur reçoit des informations sur l'état de la part du destinataire, votre application doit enregistrer un GCKRemoteMediaClientListener. Si le GCKMediaTextTrackStyle du contenu multimédia actuel change, tous les émetteurs connectés seront avertis par le biais des rappels -[remoteMediaClient:didUpdateMediaMetadata:] et -[remoteMediaClient:didUpdateMediaStatus:]. Dans ce cas, le SDK Receiver ne vérifie pas si le nouveau style est différent du précédent et envoie une notification à tous les expéditeurs connectés. Toutefois, si la liste des pistes actives est mise à jour, seul le -[remoteMediaClient:didUpdateMediaStatus:] dans les expéditeurs associés sera averti.

Répondre aux exigences CORS

Pour le streaming multimédia adaptatif, Google Cast nécessite la présence d'en-têtes CORS. Toutefois, même les flux multimédias mp4 simples nécessitent CORS s'ils incluent des pistes. Si vous souhaitez activer les pistes pour un contenu multimédia, vous devez activer CORS pour vos flux de pistes et vos flux multimédias. Par conséquent, si vous ne disposez pas d'en-têtes CORS pour votre contenu multimédia mp4 simple sur votre serveur et que vous ajoutez ensuite une piste de sous-titres simple, vous ne pourrez pas diffuser votre contenu multimédia en streaming, sauf si vous mettez à jour votre serveur pour inclure l'en-tête CORS approprié. De plus, vous devez autoriser au moins les en-têtes suivants : Content-Type, Accept-Encoding et Range. Notez que les deux derniers en-têtes sont des en-têtes supplémentaires dont vous n'aviez peut-être pas besoin auparavant.