Compatibilité avec le contrôle du direct

Utilisez les API de décalage temporel dans votre service d'entrée TV pour permettre aux utilisateurs de suspendre, de revenir en arrière et d'avancer rapidement des programmes en direct sur vos canaux de service. Si votre application est compatible avec le décalage temporel, les utilisateurs peuvent regarder votre contenu de manière flexible:

  • Les utilisateurs peuvent suspendre des programmes tout en gérant une interruption de courte durée, afin de ne jamais manquer les moments clés.
  • Les utilisateurs peuvent parcourir rapidement des contenus qu'ils ont déjà vus ou qui ne les intéressent pas.
  • Les utilisateurs peuvent revenir en arrière et revoir leurs moments préférés dans les contenus du programme.

Figure 1 : Commandes de lecture Android TV utilisées pour le contrôle du direct.

Le décalage temporel utilise de courts segments de données de programme enregistrés temporairement pour permettre la lecture de programmes en direct. Les utilisateurs ne peuvent pas lire ces enregistrements avec décalage temporel en dehors de la session de lecture en cours. Cela signifie qu'ils ne peuvent pas utiliser le décalage temporel pour suspendre un programme pour le regarder le lendemain ou le mettre en pause pour le regarder plus tard s'il passe à une autre chaîne.

Utilisez les API d'enregistrement TV si vous souhaitez permettre à vos utilisateurs d'enregistrer du contenu de programme à regarder en dehors de la session de lecture en cours.

Ajouter la prise en charge du décalage temporel

Pour ajouter la prise en charge du décalage temporel à votre service d'entrée TV, vous devez implémenter les API de décalage temporel dans votre classe TvInputService.Session, gérer l'enregistrement et la lecture des enregistrements de décalage temporel dans votre application, et informer le système que votre service d'entrée le prend en charge.

Les méthodes TvInputService.Session que vous implémentez sont les suivantes:

Pour savoir comment informer le système que votre service d'entrée est compatible avec le décalage temporel, consultez la section Avertir le système de l'état du décalage temporel.

Si vous utilisez la bibliothèque associée TIF pour implémenter votre classe TvInputService.Session, vous obtenez automatiquement une implémentation du décalage temporel qui utilise ExoPlayer. Vous pouvez utiliser cette implémentation ou remplacer les méthodes d'API de décalage temporel dans BaseTvInputService.Session et fournir votre propre implémentation. Pour en savoir plus sur l'utilisation de la bibliothèque associée TIF, consultez Créer un service d'entrée TV à l'aide de la bibliothèque associée TIF.

Enregistrer du contenu au début d'une session

L'utilisateur peut suspendre, faire un retour arrière ou faire une avance rapide du contenu d'un programme en accédant aux commandes de lecture de la chaîne. Pour ce faire, il doit appuyer sur Sélectionner pendant le visionnage du contenu, puis accéder aux commandes de lecture, ou utiliser des commandes de lecture dédiées sur un appareil distant.

Étant donné que l'utilisateur peut utiliser le décalage temporel à tout moment pendant qu'il regarde le contenu d'un programme, votre service d'entrée TV doit commencer à enregistrer ce type de contenu dès que l'utilisateur accède à une chaîne dans votre implémentation onTune(). Vous devez également informer le système que vous pouvez enregistrer en appelant notifyTimeShiftStatusChanged(int), comme décrit dans la section Avertir le système de l'état du décalage temporel.

Gérer le stockage des contenus enregistrés

Votre service d'entrée TV est chargé de stocker les enregistrements de décalage temporel dans l'espace de stockage privé de votre application et de lire le contenu lorsque le système appelle vos méthodes de décalage temporel, telles que onTimeShiftResume(). Si votre contenu est déjà stocké dans le cloud et que votre application peut gérer les enregistrements de décalage temporel dans le cloud, vous pouvez utiliser le stockage cloud au lieu du stockage d'application.

Si votre contenu utilise du contenu protégé, votre service d'entrée TV est responsable du chiffrement approprié des contenus enregistrés et du déchiffrement du contenu lors de la lecture.

Étant donné que les contenus vidéo enregistrés peuvent nécessiter une grande quantité d'espace de stockage, vous devez les gérer avec soin lors de la lecture d'une session. Si la durée de la session de lecture dépasse la durée que vous pouvez enregistrer et stocker pour le décalage temporel, ajustez votre enregistrement par décalage afin de conserver la mémoire tampon actuelle, mais assurez-vous que l'heure actuelle est capturée. Par exemple, si l'utilisateur lit du contenu depuis 31 minutes et que la taille maximale d'enregistrement avec décalage temporel est de 30 minutes, ajustez l'heure de début et l'heure d'enregistrement pour qu'elles s'étendent de 1 minute à 31 minutes.

Si votre service d'entrée TV ne prend pas en charge le décalage temporel en raison d'un manque d'espace de stockage, vous devez en informer le système. Pour en savoir plus sur la manière d'informer le système des restrictions de compatibilité avec le décalage temporel, consultez la section Avertir le système de l'état du décalage temporel.

Lorsque l'utilisateur passe à une autre chaîne ou met fin à sa session de lecture, supprimez vos données de décalage temporel enregistrées.

Informer le système de l'état du décalage temporel

Si votre service d'entrée TV est compatible avec le décalage temporel, appelez notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) dans votre implémentation de onTune() lorsqu'un utilisateur sélectionne une chaîne.

Pour indiquer au système si des fonctionnalités de décalage temporel de votre service d'entrée changent, utilisez notifyTimeShiftStatusChanged(int). Par exemple, si votre service d'entrée TV ne prend pas en charge le décalage temporel en raison de restrictions d'espace de stockage ou pour d'autres raisons, appelez notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE).

Si votre service d'entrée TV n'est pas du tout compatible avec le décalage temporel, appelez notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) lorsqu'une session de lecture est créée. Le système traite tout service d'entrée qui n'appelle jamais notifyTimeShiftStatusChanged() comme un service d'entrée non compatible avec le décalage temporel. Cela concerne les services d'entrée utilisant les niveaux d'API 22 et précédents.

Suivre les temps de lecture

La position de départ d'un enregistrement avec décalage temporel est la première position absolue, en millisecondes depuis l'epoch, que l'utilisateur peut rechercher. Il s'agit généralement du moment où la lecture de la vidéo commence après l'appel de onTune(). Toutefois, lorsque l'utilisateur regarde une quantité de contenu supérieure à celle que votre application peut enregistrer, vous devez commencer à enregistrer un nouveau segment pour le décalage temporel et mettre à jour votre heure de début en conséquence.

La position actuelle d'un enregistrement avec décalage temporel correspond à la position de lecture actuelle, en millisecondes depuis l'epoch. Cette position change en continu pendant la lecture. En règle générale, vous pouvez utiliser votre moteur de lecture pour déterminer cette valeur, comme illustré dans l'exemple suivant:

Kotlin

override fun onTimeShiftGetCurrentPosition(): Long =
        tvPlayer?.run {
            currentProgram?.let { program ->
                currentPosition + program.startTimeUtcMillis
            }
        } ?: TvInputManager.TIME_SHIFT_INVALID_TIME

Java

@Override
public long onTimeShiftGetCurrentPosition() {
  if (getTvPlayer() != null && currentProgram != null) {
    return getTvPlayer().getCurrentPosition() +
      currentProgram.getStartTimeUtcMillis();
  }
  return TvInputManager.TIME_SHIFT_INVALID_TIME;
}

Assurez-vous que l'heure de début que vous indiquez lorsque le système appelle votre onTimeShiftGetStartPosition() n'est jamais supérieure à la position horaire actuelle que vous indiquez dans onTimeShiftGetCurrentPosition(). Le système utilise ces appels pour mettre à jour la durée du décalage temporel dans l'interface utilisateur des commandes de lecture.

Prendre en charge les paramètres de lecture

Pour modifier la vitesse de lecture pendant le décalage temporel, le système utilise les paramètres de lecture. Par exemple, si l'utilisateur décide de revenir en arrière dans la lecture en cours, de nouveaux paramètres de lecture sont transmis à votre application avec une vitesse de lecture négative. Le décalage temporel prend également en charge plusieurs niveaux, x2 ou x3, de vitesse de lecture pour le retour arrière ou l'avance rapide.

Le système appelle votre méthode onTimeShiftSetPlaybackParams(PlaybackParams) avec un objet PlaybackParams contenant les paramètres de la session en cours. Utilisez ces informations pour configurer correctement votre moteur de lecture multimédia.

Si votre moteur de lecture n'est pas compatible avec un paramètre, émulez le comportement attendu du mieux possible. Par exemple, si votre moteur de lecture n'est pas compatible avec la vitesse de lecture x2, utilisez des opérations de recherche répétées sur votre moteur de lecture pour obtenir une vitesse de lecture approximativement double.

Une fois les paramètres définis, ne les modifiez pas, sauf si l'utilisateur émet une commande de lecture nécessitant un paramètre différent ou passe à un nouveau canal.