Compatibilité avec le contrôle du direct

Utilisez les API de contrôle du direct dans votre service d'entrée TV pour permettre aux utilisateurs de mettre en pause, de revenir en arrière et d'avancer rapidement dans les programmes en direct sur les chaînes de votre service. Si votre application est compatible avec le contrôle du direct, les utilisateurs bénéficient d'une plus grande flexibilité dans la façon dont ils regardent votre contenu :

  • Ils peuvent mettre en pause les programmes en cas d'interruption de courte durée, afin de ne jamais manquer les moments clés.
  • Ils peuvent avancer rapidement dans les contenus qu'ils ont déjà vus ou qui ne les intéressent pas.
  • Ils peuvent revenir en arrière et revoir leurs moments préférés dans les programmes.
Figure 1. Commandes de lecture Android TV utilisées pour le contrôle du direct.

Le contrôle du direct utilise des segments courts, temporaires et enregistrés de données de programme pour permettre la lecture de programmes en direct. Les utilisateurs ne peuvent pas lire ces enregistrements de contrôle du direct en dehors de la session de lecture en cours. Cela signifie qu'ils ne peuvent pas utiliser le contrôle du direct pour mettre en pause un programme et le regarder le lendemain, ni pour mettre en pause un programme et le regarder plus tard lorsqu'ils passent à une autre chaîne.

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

Ajouter la compatibilité avec le contrôle du direct

Pour ajouter la compatibilité avec le contrôle du direct à votre service d'entrée TV, vous devez implémenter les API de contrôle du direct dans votre classe TvInputService.Session, gérer l'enregistrement et la lecture des enregistrements de contrôle du direct dans votre application, et informer le système que votre service d'entrée est compatible avec le contrôle du direct.

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

Pour en savoir plus sur la façon d'informer le système que votre service d'entrée est compatible avec le contrôle du direct, consultez la section Informer le système de l'état du contrôle du direct.

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

Enregistrer du contenu au début d'une session

Un utilisateur peut mettre en pause, revenir en arrière et avancer rapidement dans un programme en accédant aux commandes de lecture de la chaîne, soit en appuyant sur Sélectionner pendant qu'il regarde un contenu, puis en accédant aux commandes de lecture, soit en utilisant des commandes de lecture dédiées sur un appareil distant.

Étant donné que l'utilisateur peut utiliser le contrôle du direct à tout moment lorsqu'il regarde un programme, votre service d'entrée TV doit commencer à enregistrer le contenu du contrôle du direct dès que l'utilisateur se connecte à une chaîne dans votre implémentation onTune(). Vous devez également informer le système que vous êtes en mesure d'enregistrer en appelant notifyTimeShiftStatusChanged(int), comme décrit dans la section Informer le système de l'état du contrôle du direct.

Gérer le stockage du contenu enregistré

Votre service d'entrée TV est responsable du stockage des enregistrements de contrôle du direct dans le stockage privé de l'application et de la lecture du contenu lorsque le système appelle vos méthodes de contrôle du direct, telles que onTimeShiftResume(). Si votre contenu est déjà stocké dans le cloud et que votre application peut gérer les enregistrements de contrôle du direct dans le cloud, vous pouvez utiliser le stockage cloud au lieu du stockage de l'application.

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

Étant donné que le contenu vidéo enregistré peut nécessiter une grande quantité de stockage, vous devez gérer soigneusement le contenu enregistré pendant la lecture de la session. Si la durée de la session de lecture dépasse la durée que vous pouvez enregistrer et stocker pour le contrôle du direct, ajustez votre enregistrement de contrôle du direct pour conserver le tampon actuel, 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 de votre enregistrement de contrôle du direct est de 30 minutes, ajustez votre enregistrement et l'heure de début pour inclure le contenu de la minute 1 à la minute 31.

Si votre service d'entrée TV ne peut pas prendre en charge le contrôle du direct en raison d'un manque de stockage, vous devez en informer le système. Pour en savoir plus sur la façon d'informer le système des restrictions de compatibilité avec le contrôle du direct, consultez la section Informer le système de l'état du contrôle du direct.

Lorsque l'utilisateur passe à une autre chaîne ou met fin à sa session de lecture, supprimez vos données de contrôle du direct enregistrées.

Informer le système de l'état du contrôle du direct

Si votre service d'entrée TV est compatible avec le contrôle du direct, appelez notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) dans votre implémentation de onTune() lorsqu'un utilisateur se connecte à une chaîne.

Pour informer le système de toute modification des fonctionnalités de contrôle du direct de votre service d'entrée, utilisez notifyTimeShiftStatusChanged(int). Par exemple, si votre service d'entrée TV ne peut pas prendre en charge le contrôle du direct 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 contrôle du direct, 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 qui ne peut pas prendre en charge le contrôle du direct. Cela concerne les services d'entrée utilisant le niveau d'API 22 et les versions antérieures.

Suivre les durées de lecture

La position de début d'un enregistrement de contrôle du direct est la position temporelle absolue la plus ancienne, en millisecondes depuis l'epoch, à laquelle l'utilisateur peut accéder. Il s'agit généralement du moment où la lecture vidéo commence après l'appel de onTune(). Toutefois, lorsque l'utilisateur regarde une quantité de contenu qui dépasse ce que votre application peut enregistrer, vous devez commencer à enregistrer un nouveau segment pour le contrôle du direct et mettre à jour votre heure de début en conséquence.

La position actuelle d'un enregistrement de contrôle du direct est la position de lecture actuelle, en millisecondes depuis l'epoch. Cette position change en permanence 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 fournissez lorsque le système appelle votre onTimeShiftGetStartPosition() n'est jamais supérieure à la position temporelle actuelle que vous fournissez dans onTimeShiftGetCurrentPosition(). Le système utilise ces appels pour mettre à jour la durée du contrôle du direct dans l'interface utilisateur des commandes de lecture.

Compatibilité avec les paramètres de lecture

Pour modifier la vitesse de lecture pendant le contrôle du direct, le système utilise des 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 contrôle du direct est également compatible avec plusieurs niveaux de vitesse de lecture (2x ou 3x) pour revenir en arrière ou avancer rapidement.

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

Si votre moteur de lecture n'est pas compatible avec un paramètre, émulez le comportement attendu du mieux que vous le pouvez. Par exemple, si votre moteur de lecture n'est pas compatible avec la vitesse 2x, utilisez des opérations de recherche répétées sur votre moteur de lecture pour atteindre 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 qui nécessite un paramètre différent ou s'il passe à une autre chaîne.