Le SDK Android TV Receiver est compatible avec les pauses publicitaires et les annonces associées dans un flux multimédia donné.
Pour en savoir plus sur le fonctionnement des pauses publicitaires, consultez Présentation des pauses publicitaires Web Receiver.
Gérer le chargement avec les coupures publicitaires
Dans l'application Android TV, les pauses sont incluses dans MediaLoadRequestData.
Les demandes de chargement peuvent être traitées normalement, et les AdBreakClipInfo et les AdBreakInfo peuvent être récupérés à partir de MediaInfo :
class MyMediaLoadCommandCallback : MediaLoadCommandCallback() { override fun onLoad( senderId: String?, loadRequestData: MediaLoadRequestData ): Task{ return Tasks.call { // Resolve the entity into your data structure and load media. val mediaInfo = loadRequestData.mediaInfo ... myPrepareAdBreaks(mediaInfo.adBreakClips, mediaInfo.adBreaks) // Update media metadata and state (this clears all previous status // overrides). castReceiverContext.getMediaStatusModifier() .setDataFromLoad(mediaInfo) // Ad breaks are set on the modifier. castReceiverContext.getMediaManager().broadcastMediaStatus() // Return the resolved MediaLoadRequestData to indicate load success. return loadRequestData } } }
public class MyMediaLoadCommandCallback extends MediaLoadCommandCallback { @Override public TaskonLoad(String senderId, MediaLoadRequestData loadRequestData) { return Tasks.call(() -> { // Resolve the entity into your data structure and load media. MediaInfo mediaInfo = loadRequestData.getMediaInfo(); ... myPrepareAdBreaks(mediaInfo.getAdBreakClips(), mediaInfo.getAdBreaks()); // Update media metadata and state (this clears all previous status // overrides). castReceiverContext.getMediaStatusModifier() .setDataFromLoad(mediaInfo); // Ad breaks are set on the modifier. castReceiverContext.getMediaManager().broadcastMediaStatus(); // Return the resolved MediaLoadRequestData to indicate load success. return loadRequestData; }); } }
Modifier les coupures publicitaires
Lorsque les annonces commencent à être diffusées, mettez à jour AdBreakStatus sur MediaStatusModifier pour indiquer que votre application a commencé à diffuser des annonces :
val breakStatus = AdBreakStatus.Builder() .setBreakId("b1") .setBreakClipId("bc1") .setCurrentBreakClipTimeInMs(breakClipProgress) .setCurrentBreakTimeInMs(breakProgress) .setWhenSkippableInMs(5000) // Set this field so that the ad break clip is skippable .build() castReceiverContext.getMediaStatusModifier() .setAdBreakStatus(breakStatus)
AdBreakStatus breakStatus = new AdBreakStatus.Builder() .setBreakId("b1") .setBreakClipId("bc1") .setCurrentBreakClipTimeInMs(breakClipProgress) .setCurrentBreakTimeInMs(breakProgress) .setWhenSkippableInMs(5000) // Set this field so that the ad break clip is skippable .build(); castReceiverContext.getMediaStatusModifier() .setAdBreakStatus(breakStatus);
Vous pouvez également modifier dynamiquement les pauses publicitaires après le chargement d'un élément :
var breakClip1: AdBreakClipInfo = ... var breakClip2: AdBreakClipInfo = ... var breakClip3: AdBreakClipInfo = ... var break1: AdBreakInfo = ... var break2: AdBreakInfo = ... mediaManager.getMediaStatusModifier().getMediaInfoModifier() .setAdBreakClips({breakClip1, breakClip2, breakClip3}) .setAdBreaks({break1, break2})
AdBreakClipInfo breakClip1 = ...
AdBreakClipInfo breakClip2 = ...
AdBreakClipInfo breakClip3 = ...
AdBreakInfo break1 = ...
AdBreakInfo break2 = ...
mediaManager.getMediaStatusModifier().getMediaInfoModifier()
.setAdBreakClips({breakClip1, breakClip2, breakClip3})
.setAdBreaks({break1, break2});Activer et gérer l'option de désactivation des annonces
Lorsqu'une coupure publicitaire est en cours de lecture, les expéditeurs affichent un bouton permettant d'ignorer le clip de coupure publicitaire en cours s'il est désactivable. Pour permettre à un utilisateur d'ignorer un clip d'emplacement publicitaire, utilisez MediaStatusModifier pour ajouter la commande multimédia COMMAND_SKIP_AD :
mMediaManager.getMediaStatusModifier().setMediaCommandSupported(MediaStatus.COMMAND_SKIP_AD, true)
mMediaManager.getMediaStatusModifier().setMediaCommandSupported(MediaStatus.COMMAND_SKIP_AD, true);
Pour gérer la commande SKIP_AD, implémentez le rappel onSkipAd dans vos MediaCommandCallback :
class MyMediaCommandCallback : MediaCommandCallback() { override fun onSkipAd(requestData: RequestData?): Task<Void?> { // Skip your ad ... return Tasks.forResult<Any?>(null) } } val mediaManager = CastReceiverContext.getInstance().mediaManager mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
public class MyMediaCommandCallback extends MediaCommandCallback { @Override public TaskonSkipAd(RequestData requestData) { // Skip your ad ... return Tasks.forResult(null); } } MediaManager mediaManager = CastReceiverContext.getInstance().getMediaManager(); mediaManager.setMediaCommandCallback(new MyMediaCommandCallback());
Assemblage côté client
Dans le stitching côté client, les annonces ne sont pas intégrées au flux. Pour Cast Connect, en plus de mettre à jour AdBreakStatus sur MediaStatusModifier, vous devez définir la vitesse de lecture sur 0 sur PlaybackStateCompat afin que les expéditeurs sachent qu'ils doivent geler la progression de la timeline du contenu.
// Playback speed should be 0 if content is not playing. if (adIsPlaying) { playbackSpeed = 0.0f } val stateBuilder = PlaybackStateCompat.Builder() .setActions(AVAILABLE_MEDIA_ACTIONS) stateBuilder.setState(playbackStateCompat, position, playbackSpeed) mediaSession.setPlaybackState(stateBuilder.build())
// Playback speed should be 0 if content is not playing. if (adIsPlaying) { playbackSpeed = 0.0f; } PlaybackStateCompat.Builder stateBuilder = new PlaybackStateCompat.Builder() .setActions(AVAILABLE_MEDIA_ACTIONS); stateBuilder.setState(playbackStateCompat, position, playbackSpeed); mediaSession.setPlaybackState(stateBuilder.build());
Une fois l'annonce terminée, vous devez rétablir la vitesse de lecture précédente.
Assemblage côté serveur
Pour l'assemblage côté serveur, les annonces sont intégrées. Le serveur est donc censé fournir un flux unique contenant à la fois le contenu et les annonces. Dans ce cas, la lecture peut se poursuivre normalement, car la timeline contient la durée de l'annonce en plus de celle du contenu.