Lecture multimédia : ce que vous devez savoir sur la lecture multimédia pour que vos applications se démarquent dans Windows 8

Blog des développeurs d'applications Windows 8

Indications sur la conception d'applications de style Metro pour Windows 8, par l'équipe d'ingénierie de Windows 8

Lecture multimédia : ce que vous devez savoir sur la lecture multimédia pour que vos applications se démarquent dans Windows 8

  • Comments 1

À l'occasion de Windows 8, nous avons apporté des modifications à notre système audio pour améliorer l'expérience utilisateur offerte par les applications. Dans ce billet, je détaille ces changements et explique comment vous pouvez en profiter dans vos applications multimédias. Ces informations vous permettront, je l'espère, de mieux comprendre comment fonctionne l'audio dans les applications du Windows Store, en particulier lorsqu'il s'agit de lire de l'audio en arrière-plan. Commençons par décrire un scénario d'utilisation courant.

Vous écoutez votre groupe préféré dans une application de musique sous Windows et un ami vous envoie en MP3 une fantastique version live d'un morceau de son groupe préféré. Lorsque vous ouvrez le MP3, le Lecteur Windows Media s'ouvre et commence la lecture du morceau. À cet instant, votre groupe favori et celui de votre ami sont lus simultanément. Au même moment, une alarme se déclenche pour vous rappeler d'aller chercher votre sœur à l'école, le tout dans une véritable cacophonie. Vous paniquez et fermez votre ordinateur portable. Comme moi, vous aimeriez sans doute pouvoir gérer facilement les sons provenant de votre ordinateur.

Pour les applications Windows 8, nous avons résolu ce problème en ajoutant un Gestionnaire de lecture et des commandes de transport multimédia. Le Gestionnaire de lecture utilise des catégories audio, qui affectent des comportements aux flux audio et, par extension, aux applications audio. Les flux audio entrants présents au premier plan sont toujours autorisés à lire l'audio. Néanmoins, en identifiant les flux, le Gestionnaire de lecture peut prendre des décisions avisées quant au traitement des différents flux situés au premier plan et à l'arrière-plan.

Par exemple, si une application pouvant fonctionner en arrière-plan est effectivement mise à l'arrière-plan pendant qu'elle lit de la musique, puis que l'utilisateur ouvre une nouvelle application au premier plan pour lire de la musique, le Gestionnaire de lecture coupe le son de l'application d'arrière-plan. L'expérience utilisateur est ainsi plus fluide et intuitive. Les utilisateurs écoutent ce qu'ils veulent écouter, sans entendre les autres flux. Ajoutez à cela une atténuation intelligente de la musique d'arrière-plan lors des alertes (alarmes, sonneries, etc.) et un accès facilité aux commandes de transport multimédia pour arrêter la lecture, lancer la lecture et passer à la piste suivante/précédente, et vous disposez alors d'un système complet, conçu pour vous éviter de paniquer et de devoir rechercher dans l'affolement les applications qui émettent les sons que vous ne souhaitez pas entendre.

Pourquoi cette démarche ?

Dans les versions précédentes de Windows, plusieurs applications pouvaient être ouvertes et exécutées simultanément. En matière d'audio, les utilisateurs pouvaient réduire le lecteur multimédia, travailler sur un document et naviguer sur le Web simultanément, sur un grand écran. Avec deux écrans, ils pouvaient même accomplir encore plus de tâches en simultané. Dans Windows 8 et son nouvel environnement immersif, les choses ont changé, notamment en ce qui concerne le nombre d'applications pouvant être affichées à l'écran. Avec une seule application au centre et une application ancrée, il est plus difficile qu'auparavant de trouver parmi les applications en arrière-plan laquelle émet les sons que vous ne souhaitez pas entendre. Voilà la principale raison qui nous a conduits à faire évoluer le Gestionnaire de lecture et les commandes de transport multimédia. Grâce à ces fonctionnalités, il est désormais bien plus simple de lancer et d'arrêter la lecture de la musique lorsque vous le souhaitez. En outre, comme le Gestionnaire de lecture peut couper le son des applications, les utilisateurs n'ont plus besoin de passer en revue toutes les applications mises en arrière-plan pour retrouver du calme.

Contrairement au Bureau, cet environnement ne possède pas de console de mixage audio. Elle reste disponible pour les applications de bureau, mais votre application n'y figure pas, car il serait selon nous peu judicieux d'obliger l'utilisateur à basculer sur le Bureau pour régler le volume relatif des applications. À la place, nous encourageons les développeurs d'applications à ne pas inclure de commande de volume dans leur application. Ainsi, les utilisateurs n'ont qu'à se concentrer sur la commande de volume principal, ce qui simplifie toutes les activités liées à la gestion du volume, mais là n'est pas le sujet de ce billet.

Catégories de flux

Pour permettre au système de gérer à quel moment les différents flux audio doivent être entendus, nous avons ajouté des catégories de flux. Ainsi, Windows peut désormais prendre des décisions logiques pour déterminer si tel flux doit ou non être audible. Les catégories audio déterminent la façon dont les flux sont traités lorsque les applications sont au premier plan (l'application est visible sur l'écran de l'appareil) ou à l'arrière-plan (l'application est masquée par une autre application). Les applications accèdent au premier plan lorsqu'elles sont lancées ou balayées vers le centre de l'écran. Lorsqu'elles sont ancrées, elles sont également conservées au premier plan.

Par exemple, une application qui lit des sons secondaires (tintements ou clics interactifs, par exemple) n'a en principe pas besoin d'être audible à l'arrière-plan. Ses sons risqueraient même de gêner l'utilisateur. Ainsi, le Gestionnaire de lecture coupe le son de cette application dès qu'elle est mise à l'arrière-plan. En revanche, une application multimédia chargée de lire votre sélection doit continuer la lecture, pour vous permettre d'écouter de la musique tout en naviguant sur le Web ou en travaillant.

Voici une courte description de la façon dont vous pouvez utiliser les catégories audio. Pour qu'une application Windows 8 puisse lire des données audio, la solution la plus simple consiste à utiliser une balise audio.

<audio controls="controls"> 
<source src="song.mp3"/>
</audio>

JavaScript

audtag = document.createElement('audio');
audtag.setAttribute("id", "audtag");
audtag.setAttribute("msAudioCategory", "BackgroundCapableMedia");
document.getElementById("MediaElement").appendChild(audtag);
audtag.load();

C#

En C#, vous pouvez définir la catégorie audio comme ceci :

Playback.SetAudioCategory(AudioCategory.BackgroundCapableMedia);
Playback.SelectFile();

Vous avez le choix entre plusieurs catégories audio. Le tableau ci-dessous recense les catégories disponibles et décrit le comportement associé à chacune d'entre elles. Vous devez choisir avec précaution la catégorie à associer à chaque flux, car ce choix déterminera le comportement de votre application.

Catégories de flux disponibles

Type de flux

Description

Fonctionnement en arrière-plan possible ?

ForeGroundOnlyMedia

Jeux et autres sons conçus pour fonctionner uniquement au premier plan, mais qui coupent les sons multimédias d'arrière-plan existants.

  • Flux audio d'un jeu, requis pour un jeu (jeux de danse, jeux de musique)
  • Films (mis en pause lorsqu'ils passent à l'arrière-plan)

Non

BackgroundCapableMedia

Pour les données audio dont la lecture doit continuer en arrière-plan. Exemples :

  • Lecture de fichiers multimédias locaux
  • Sélection de musique locale
  • Radio diffusée en continu
  • Sélection de musique diffusée en continu
  • Vidéos musicales
  • Audio diffusé en continu/radio, YouTube, Netflix, etc.

Oui

Communications

Pour la communication audio diffusée en continu, par exemple :

  • Voix sur IP (VoIP)
  • Discussion en temps réel ou autre type d'appel téléphonique

Oui

Alert

Sons d'alerte lus en boucle ou lus sur une longue durée :

  • Alarme
  • Sonnerie
  • Notification par sonnerie
  • Sons qui doivent réduire le volume audio existant

Non

GameMedia

Musique de fond des jeux.

Non

GameEffects

Effets sonores des jeux conçus pour se mélanger aux signaux audio existants :

  • Rebonds de balles, sons de moteur, etc.
  • Voix des personnages
  • Tous les sons non musicaux

Non

SoundEffects

Sons conçus pour se mélanger aux signaux audio existants (bips, tintements et autres sons courts).

Non

Other

Catégorie de flux par défaut utilisée pour les flux qui n'entrent pas dans les autres catégories.

Non

Voici quelques règles générales qui vous aideront à choisir la catégorie adaptée à votre flux audio :

  • Pour utiliser plusieurs types de flux, vous pouvez générer vos signaux audio et vidéo de façon dynamique et les détruire à la volée.
  • Les flux de la catégorie Communications sont considérés par défaut comme des données audio à faible latence. Ainsi, cela vous évite une étape supplémentaire lorsque vous concevez des applications à communication bidirectionnelle.
  • Utilisez le mode à faible latence uniquement lorsque cela est absolument nécessaire. En effet, les flux de communication basculent par défaut en mode à faible latence. Aussi, de nombreuses ressources processeur seront requises si vous envoyez un flux audio en mode à faible latence alors qu'un flux de communication a déjà été initialisé.

Catégories de flux et comportement des applications

[Les comportements des applications sont décrits en détail dans l'article Lecture audio dans une application de style Metro.]

La logique globale permettant de déterminer si une application doit ou non être audible dépend largement de sa présence ou non au premier plan. Cependant, dès que vous commencez à prendre en compte d'autres facteurs (applications de communication, applications de lecture multimédia avec lecture en arrière-plan), les choses deviennent plus complexes. Pas d'inquiétude cependant : en général, le comportement des applications basé sur le type de flux est relativement simple à expliquer. Voici les règles qui s'appliquent :

  • Si votre application est au premier plan, la catégorie de son flux audio n'a pas d'importance. Elle lit toujours les sons, sauf si le son du système est coupé ou si le volume est à zéro.
  • Une seule application audio pouvant fonctionner en arrière-plan peut être entendue, sauf si deux de ces applications sont au premier plan.
  • Les applications de communication atténuent toujours les autres sons système lors d'un appel entrant ou dans le cadre d'un flux de type « Communications ». Si une musique est lue en arrière-plan, pour réentendre la musique pendant un appel, l'utilisateur peut mettre l'application de musique au premier plan (en l'ancrant ou en la ramenant à l'avant en plein écran). Dans ce cas, la règle 1 s'applique.
  • Les sons issus d'une application de premier plan se mélangent aux signaux audio pouvant être lus en arrière-plan si les flux de premier plan ne sont pas incompatibles avec le flux d'arrière-plan. Par exemple, un flux ForegroundOnlyMedia coupe le son d'un flux BackgroundCapableMedia lu en arrière-plan, mais un flux GameEffects se mélange à un flux BackgroundCapableMedia, pour permettre aux utilisateurs de jouer tout en écoutant de la musique.

Lorsque vous choisissez une catégorie pour une application, vous devez suivre certaines règles pour que votre application fonctionne comme prévu. Pour qu'elle lise de l'audio en arrière-plan, vous devez respecter les consignes suivantes :

  • Le manifeste de l'application doit comporter une déclaration audio d'arrière-plan.
  • Vous devez définir msAudioCategory sur Communications ou sur BackgroundCapableMedia.
  • Votre application doit s'inscrire auprès des commandes de transport multimédia (nous reviendrons sur ce sujet plus tard).

Dans le cas des catégories qui ne lisent pas d'audio à l'arrière-plan, vous n'avez pas besoin d'utiliser un type multimédia compatible avec la lecture en arrière-plan. En lieu et place, choisissez Other, GameEffects ou tout autre type pertinent.

Pour obtenir des informations plus générales sur l'utilisation d'applications en arrière-plan, consultez le billet de blog suivant : http://blogs.msdn.com/b/windowsappdev_fr/archive/2012/06/01/rester-productif-lorsque-votre-application-n-est-pas-224-l-233-cran-160-t-226-ches-en-arri-232-re-plan.aspx.

Audio en arrière-plan et veille connectée

La veille connectée est un nouvel état d'alimentation basse consommation de Windows 8. Il permet aux appareils SoC (System-on-a-chip) de profiter d'un mode d'alimentation similaire à celui des smartphones. En veille connectée, l'appareil semble éteint, mais il ne l'est pas. Les applications peuvent continuer à lire de la musique à l'arrière-plan, à recevoir des mises à jour et à utiliser le réseau. Pour plus d'informations, consultez le billet de blog consacré à l'optimisation de l'efficacité énergétique des applications. Dans le cas des applications de lecture de musique en continu, vous devez suivre une procédure indispensable pour que votre application audio d'arrière-plan puisse continuer à lire en continu à partir du réseau lorsqu'un appareil entre en veille connectée.

Pour simplifier, si la connexion réseau est inactive, votre application ne pourra pas lire de l'audio en continu. L'audio local fonctionnera, mais si la sélection est déterminée par un serveur, votre application ne pourra pas accéder au morceau suivant tant que la connexion réseau n'aura pas été rétablie.

Pour que votre application puisse continuer à lire de la musique même lorsque l'appareil est en veille connectée, trois possibilités s'offrent à vous :

  1. Vous pouvez utiliser l'API Background Transfer, qui réalise pour vous tout le travail nécessaire.
  2. Vous pouvez inclure un flux d'octets MF existant dans un wrapper, si la quantité de données à transférer est minime.
  3. Vous pouvez utiliser une source Media Foundation personnalisée ou un flux d'octets.

Pour en savoir plus sur ces différentes options, consultez l'article consacré au développement d'une application multimédia d'arrière-plan économe en énergie.

Notifications système SoundLevel

Les notifications SoundLevel aident vos applications à savoir si elles peuvent ou non être entendues. Lorsque nous avons commencé à développer le Gestionnaire de lecture, nous ne savions pas si nous allions au final envoyer des notifications aux applications pour leur indiquer que leur son a été coupé. Rapidement, nous avons réalisé que nous risquions alors de nous retrouver avec de nombreuses applications d'arrière-plan générant un rendu audio ou vidéo et utilisant inutilement des ressources système, avec à la clé une perte importante d'autonomie. Par conséquent, dès lors que vous abonnez votre application aux notifications SoundLevel, le Gestionnaire de lecture lui envoie l'une des trois notifications suivantes, selon l'état d'audibilité de votre application :

  • SoundLevel(Full) signifie que l'audio issu de votre application est audible.
  • SoundLevel(Mute) signifie que l'audio issu de votre application n'est pas audible (mais que l'application peut quand même lire des flux audio).
  • SoundLevel(Low) signifie que l'audio issu de votre application a été atténué de -28 dB et est à peine audible.

Examinons dans quels cas chaque notification est envoyée et ce que votre application peut faire en réponse à chacune d'entre elles.

SoundLevel(Full)

Une notification SoundLevel(Full) est envoyée à votre application dans les cas suivants :

Action devant être réalisée par votre application :

Une application incapable de fonctionner en arrière-plan passe de l'arrière-plan au premier plan.

Aucune action requise.

L'application devient visible pour la première fois après le démarrage.

Aucune action requise.

SoundLevel(Mute)

Une notification SoundLevel(Mute) est envoyée à votre application dans les cas suivants :

Action devant être réalisée par votre application :

Une application incapable de fonctionner en arrière-plan passe du premier plan à l'arrière-plan.

Mise en pause.

Un autre type de flux similaire commence à être lu alors que votre application est en cours de lecture (par exemple si un deuxième flux BackgroundCapableMedia commence alors qu'un autre est toujours en cours de lecture, le son du premier flux est coupé).

Mise en pause pour économiser des ressources système (sauf si vous avez une bonne raison de ne pas le faire).

Si un flux de type Communications est lu en arrière-plan, l'application reçoit une notification SoundLevel(Mute) lorsqu'un autre flux Communications est démarré au premier plan.

Mise en attente de l'appel.

SoundLevel(Low)

Une notification SoundLevel(Low) est envoyée à votre application dans les cas suivants :

Action devant être réalisée par votre application :

Un flux de communication commence à être lu alors que votre application lit un flux audio.

Mise en pause si l'application lit des contenus que vous considérez comme importants pour l'utilisateur. Les sons sont audibles, mais le volume reste faible tant que l'application ne passe pas au premier plan. Vous êtes libre de choisir, mais nous vous recommandons par conséquent une mise en pause.

 

Voici un exemple montrant comment s'abonner aux événements SoundLevel et les utiliser :

JavaScript

// Create the media control. 

mediaControl = Windows.Media.MediaControl;

// Add event listeners for PBM notifications to illustrate app is
// getting a new SoundLevel and pass the audio tag to the function

mediaControl.addEventListener("soundlevelchanged", soundLevelChanged, false);


function soundLevelChanged() {

// Catch SoundLevel notifications and determine SoundLevel state. If it's muted, pause the player.

var soundLevel = Windows.Media.MediaControl.soundLevel;


switch (soundLevel) {

case Windows.Media.SoundLevel.muted:
log(getTimeStampedMessage("App sound level is: Muted"));
break;
case Windows.Media.SoundLevel.low:
log(getTimeStampedMessage("App sound level is: Low"));
break;
case Windows.Media.SoundLevel.full:
log(getTimeStampedMessage("App sound level is: Full"));
break;
}

C#

// add new handlers
MediaControl.SoundLevelChanged += MediaControl_SoundLevelChanged;
MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
MediaControl.PlayPressed += MediaControl_PlayPressed;
MediaControl.PausePressed += MediaControl_PausePressed;
MediaControl.StopPressed += MediaControl_StopPressed;

// save current handlers
SoundLevelChangedHandler = MediaControl_SoundLevelChanged;

string SoundLevelToString(SoundLevel level)
{
string LevelString;

switch (level)
{
case SoundLevel.Muted:
LevelString = "Muted";
break;
case SoundLevel.Low:
LevelString = "Low";
break;
case SoundLevel.Full:
LevelString = "Full";
break;
default:
LevelString = "Unknown";
break;
}
return LevelString;
}

Capture et bouclage

Ajoutons maintenant quelques remarques sur la capture et le bouclage. Tout d'abord, si vous décidez de créer une application de capture, vous devez utiliser la catégorie « Other » pour identifier le flux de capture (sinon, le système l'affectera à cette catégorie), mais surtout, sachez que vous ne pouvez pas affecter une autre catégorie à votre flux. Dans le cas des applications de communication, si vous avez identifié votre flux de rendu comme flux Communications, vous n'avez pas besoin d'identifier votre flux de capture.

Par ailleurs, lorsque le système envoie une notification SoundLevel(Mute), le rendu, la capture et le bouclage sont tous muets.

Pourquoi ne pas utiliser les notifications de visibilité ?

Bien que la visibilité d'une application soit étroitement liée à son audibilité, il est important d'écouter les événements SoundLevel uniquement si vous souhaitez savoir quand votre application est audible. Pour cela, n'utilisez pas les événements de visibilité. Sinon, l'état d'audibilité de votre application risque de se désynchroniser de son état de visibilité.

Commandes de transport multimédia

[Pour découvrir le guide d'utilisation complet, consultez l'article consacré aux commandes de transport système.]

L'ajout de commandes de transport multimédia (Media Transport Control) disponibles globalement (présentées sur l'illustration suivante) facilite grandement la lecture et le contrôle de la musique à partir d'une application de musique.

start_screen
Figure 1 : écran d'accueil et commandes de transport multimédia

mt_control
Figure 2 : agrandissement des commandes de transport multimédia
montrant la pochette et les métadonnées.

L'interface utilisateur de MTC (comme nous les appelons affectueusement au sein de l'équipe Plateforme multimédia) permet à l'utilisateur de lancer ou de suspendre la lecture audio, que l'application soit au premier plan ou à l'arrière-plan, même si l'application a été suspendue à l'arrière-plan. Cette interface est appelée lorsqu'un utilisateur appuie sur les boutons de volume sur un clavier ou une tablette. Elle s'affiche partout : dans le nouvel environnement immersif, sur le Bureau et même dans l'écran de verrouillage. Il s'agit là d'une nouveauté importante de Windows 8, et vos applications peuvent et doivent en profiter lorsque cela est nécessaire.

Revenons au scénario évoqué au début de ce billet (dans lequel l'utilisateur a plusieurs flux audio en cours de lecture et ferme l'écran de son ordinateur portable) : il s'agit justement d'un des scénarios dans lesquels une commande de transport globale nous semblait nécessaire. Comme l'utilisateur ne peut pas passer en revue les différentes fenêtres (contrairement à ce qui se passe sur le Bureau), il doit disposer d'un moyen pour arrêter rapidement une application qui génère des sons. Le fait d'associer l'interface de MTC aux commandes de volume nous a semblé être un choix intuitif, permettant en plus de fournir à l'utilisateur de nombreuses informations sur la lecture en cours sur le système, à l'aide d'un simple bouton.

Si vous utilisez une application multimédia (en particulier une application prenant en charge le fonctionnement en arrière-plan), voici comment associer les commandes :

JavaScript

// Assign the button object to MediaControls
MediaControls = Windows.Media.MediaControl;

// Add event listeners for the buttons
MediaControls.addEventListener(“playselected”, play, false);
MediaControls.addEventListener(“pauseselected”, pause, false);
MediaControls.addEventListener(“playpausetoggleselected”, playpausetoggle, false);

C#

using Windows.Media;
MediaControl.SoundLevelChanged += MediaControl_SoundLevelChanged;
MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
MediaControl.PlayPressed += MediaControl_PlayPressed;
MediaControl.PausePressed += MediaControl_PausePressed;
MediaControl.StopPressed += MediaControl_StopPressed;

L'extrait de code suivant montre comment activer les boutons Piste précédente et Piste suivante, en ajoutant des détecteurs d'événements à l'objet MediaControl.

JavaScript

// enable the previous track button
MediaControls.addEventListener(“previoustrackselected”, previoustrack, false);

// enable the next track button
MediaControls.addEventListener(“nexttrackselected”, nexttrack, false);

C#

MediaControl.NextTrackPressed += MediaControl_NextTrackPressed; 
MediaControl.PreviousTrackPressed -= MediaControl_PreviousTrackPressed;

Vous pouvez également ajouter les métadonnées relatives à l'artiste et la pochette au menu volant. Pour en savoir plus, consultez le livre blanc déjà évoqué plus haut.

L'interface de MTC est complétée par l'application multimédia en cours d'utilisation. Les éléments en question restent présents dans l'interface jusqu'à ce qu'ils soient effacés par le système. Voici dans quels cas l'interface est effacée :

  1. L'utilisateur ferme l'application.
  2. L'utilisateur efface les applications récemment utilisées de la liste de basculement entre applications.
  3. Le système arrête l'application pour libérer des ressources.
  4. L'application subit une défaillance.
  5. L'utilisateur arrête l'appareil.
  6. L'application se désinscrit des commandes MTC.

Résumé

Nous avons travaillé d'arrache-pied pour vous proposer un paradigme audio entièrement nouveau dans Windows 8, mieux adapté aux nouveaux formats d'appareils et à la nouvelle expérience utilisateur de Windows. Les catégories audio fournissent à Windows un contexte permettant au système de gérer de façon adéquate votre application. Si votre application a besoin de lire de l'audio en arrière-plan, il vous suffit de définir la catégorie, d'associer les commandes de transport multimédia et d'ajouter une déclaration au manifeste.

Les notifications SoundLevel vous indiquent si votre application est ou non audible. Vous disposez ainsi des informations dont vous avez besoin pour économiser la batterie, par exemple en suspendant la lecture audio si le flux est inaudible en arrière-plan.

L'interface de transport multimédia indique l'état du volume, ce qui permet aux utilisateurs de lancer et de suspendre rapidement la lecture audio dans une application multimédia, mais aussi d'obtenir les métadonnées relatives à l'artiste.

Nous espérons que vous utiliserez ces nouvelles technologies dans vos applications pour proposer de formidables expériences audio à vos clients. Globalement simples à mettre en œuvre, elles offrent d'immenses avantages aux utilisateurs.

--Johnny Bregar, Chef de projet, Windows

  • Loading...
Leave a Comment
  • Please add 4 and 5 and type the answer here:
  • Post