Reprodução de mídia: O que você precisa saber sobre a reprodução de mídia para aproveitar o máximo do seu aplicativo no Windows 8

Blog do desenvolvedor de aplicativos do Windows 8

Ideias sobre a criação de aplicativos com o estilo Metro para o Windows 8, da equipe de engenharia do Windows 8

Reprodução de mídia: O que você precisa saber sobre a reprodução de mídia para aproveitar o máximo do seu aplicativo no Windows 8

  • Comments 0

Realizamos algumas alterações no sistema de áudio do Windows 8 para melhorar a experiência com o aplicativo. Neste blog, vou falar dessas alterações e de como é possível aproveitá-las nos aplicativos de mídia. Espero que as informações o ajudem a entender melhor o funcionamento do áudio nos aplicativos da Windows Store, principalmente no que se refere à reprodução de áudio em segundo plano. Vou começar descrevendo uma situação comum ao usuário.

Você está ouvindo sua banda preferida em um aplicativo de música do Windows e um amigo lhe envia um mp3 de uma versão ao vivo de uma música da banda preferida dele. Quando você abre o mp3, o Windows Media Player inicia e começa a tocar a música. Agora tanto a sua banda favorita quanto a dele estão tocando ao mesmo tempo. O alarme então dispara, como lembrete de que é hora de buscar sua irmã na escola, no meio de uma bagunça sonora. Você entra em pânico e fecha o laptop. Se você for como eu, provavelmente está procurando uma forma melhor de administrar os sons emitidos pela sua máquina.

No caso dos aplicativos do Windows 8, solucionamos o problema introduzindo o Gerenciador de Reprodução de Mídia e os controles de Transporte de Mídia. O Gerenciador de Reprodução de Mídia utiliza categorias de áudio, que atribuem comportamentos a fluxos de áudio, e, por extensão, a aplicativos de áudio. Os fluxos de áudio de entrada no primeiro plano são sempre permitidos para a reprodução de áudio. Porém, ao marcar os fluxos, o Gerenciador de Reprodução de Mídia pode tomar decisões inteligentes sobre como lidar com vários fluxos no primeiro e no segundo planos.

Por exemplo, se um aplicativo que é capaz de funcionar em segundo plano estiver reproduzindo música e passar para o segundo plano e o usuário abrir um novo aplicativo no primeiro plano para a reprodução de música, o Gerenciador de Reprodução de Mídia desativará o áudio no aplicativo no segundo plano. Dessa forma, a experiência se torna mais fluida e intuitiva para o usuário. O usuário ouve o que quer ouvir, e não o que não quer. Com atenuação inteligente da música em segundo plano para os alertas (como alarmes e toques) e facilidade de acesso aos controles de Transporte de Mídia para interromper trilhas musicais, pular para a trilha anterior ou seguinte, desenvolvemos um sistema para que você não entre em pânico nem enlouqueça procurando aplicativos que fazem barulho quando você não quer.

Por que fizemos o que fizemos?

Nas versões anteriores do Windows, os usuários podiam ter vários aplicativos abertos e em execução simultânea. Em termos de áudio, eles podiam minimizar o media player, trabalhar em um documento e navegar na Web ao mesmo tempo, em um grande monitor. Com dois monitores, eles podiam ser muito mais multitarefa. No novo ambiente imersivo do Windows 8, as coisas mudaram quanto ao número de aplicativos visíveis na tela de uma vez. Com apenas um aplicativo no corpo e um ajustado, é mais problemático encontrar o aplicativo que está emitindo o som se ele estiver na pilha traseira. Esse é o principal motivo da evolução do Gerenciador de Reprodução de Mídia e dos controles de Transporte de Mídia. Com esses recursos, ficou muito mais fácil iniciar e interromper as músicas quando necessário. E, como o Gerenciador de Reprodução de Mídia pode desativar o áudio dos aplicativos que não devem emitir som, ele evita que os usuários tenham de percorrer a pilha de aplicativos até encontrar o que precisa ser desativado.

Não existe mixer de áudio nesse ambiente, como na área de trabalho. Ainda existem aplicativos de desktop, mas o seu aplicativo não será exibido aqui, porque não acreditamos que seja uma boa experiência entrar na área de trabalho para ajustar volumes relativos dos aplicativos. Em vez disso, preferimos que os aplicativos não incluam controles de volume. Dessa forma, os usuários se concentram no controle de volume principal, o que também ajuda a simplificar toda a experiência com o controle de volume, mas essa é outra história.

Categorias de fluxo

Para que o sistema possa gerenciar quando os fluxos de áudio podem ou não ser ouvidos, adicionamos categorias de fluxo. Assim, o Windows pode tomar algumas decisões lógicas sobre quando o áudio deve ser ouvido. As categorias de áudio determinam como lidar com os fluxos quando os aplicativos estão no primeiro plano (aplicativo visível no monitor do dispositivo) ou no segundo plano (aplicativo oculto por outro). Os aplicativos entram no primeiro plano quando iniciados ou tocados na tela. Eles também ficam no primeiro plano quando estão ajustados.

Por exemplo, um aplicativo que reproduz alguns sons incidentais - toques ou cliques interativos, que provavelmente não precisam ser ouvidos ao fundo. Seria inconveniente. Por isso, o Gerenciador de Reprodução de Mídia desativa o áudio do aplicativo assim que ele passa para o segundo plano. Porém, o aplicativo de mídia que estiver executando sua lista de reprodução de músicas deve continuar a reprodução para que você possa navegar na Web ou trabalhar enquanto ouve música.

Esta é uma rápida descrição de como usar as categorias de áudio. A maneira mais fácil de reproduzir áudio em um aplicativo do Windows 8 é por meio de uma marca de áudio.

<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#

Na linguagem C#, é possível definir a categoria de áudio desta forma:

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

Existem várias categorias de áudio para escolha. A tabela inclui as categorias disponíveis e fornece uma descrição do comportamento associado a cada uma. Você precisa escolher atentamente qual categoria será associada a qual fluxo, porque isso muda o comportamento do aplicativo.

Categorias de fluxo disponíveis

Tipo de fluxo

Descrição

Aceita funcionar em segundo plano?

ForeGroundOnlyMedia

Jogos ou outros sons que funcionam somente no primeiro plano, mas que desativarão os sons da mídia em segundo plano.

  • Áudio necessário para jogo (jogos de dança, jogos de música)
  • Longas metragem (desenvolvidos para pausar quando passam para segundo plano)

Não

BackgroundCapableMedia

Para o áudio que precisa continuar sendo reproduzido em segundo plano. Exemplos:

  • Reprodução de mídia local
  • Lista de reprodução local
  • Rádio de streaming
  • Lista de reprodução de streaming
  • Vídeos musicais
  • Áudio/rádio de streaming, YouTube, Netflix e assim por diante

Sim

Comunicações

Para comunicação de streaming de áudio, como:

  • VoIP
  • Conversa em tempo real ou outro tipo de chamada telefônica

Sim

Alerta

Sons de alerta em looping ou mais demorados:

  • Alarme
  • Toques
  • Notificação com toque
  • Sons que precisam diminuir o áudio existente

Não

GameMedia

Música em segundo plano reproduzida por um jogo

Não

GameEffects

Efeitos sonoros de jogos desenvolvidos para se misturarem ao áudio existente, como:

  • Bolas rebatidas, máquinas, entre outros
  • Personagens falantes
  • Todos os áudios que não são música

Não

SoundEffects

Sons desenvolvidos para se misturarem ao áudio existente, como bipes, toques e outros efeitos rápidos

Não

Outros

A categoria de fluxo padrão usada para fluxos não categorizados.

Não

Aqui vão algumas dicas para ajudá-lo a decidir como categorizar seu fluxo de áudio:

  • Para usar vários tipos de fluxo, você pode gerar marcas de áudio e vídeo dinamicamente, desfazendo-se delas à medida que as utiliza.
  • O uso da categoria Comunicações adota o áudio de baixa latência automaticamente como padrão. Isso diminui uma etapa durante a criação de aplicativos de comunicação bidirecionais.
  • Não configure a marca de áudio para usar o modo de baixa latência, a menos que seja absolutamente necessário. Isso porque os fluxos de comunicação já usam o modo de baixa latência como padrão. Um volume grande de recursos da CPU será necessário se você tiver um fluxo de áudio em modo de baixa latência e um fluxo de comunicação já inicializado.

Categorias de fluxo e comportamento do aplicativo

[O comportamento dos aplicativos está documentado mais detalhadamente no artigo em inglês Audio Playback in a Metro Style App (Reprodução de áudio em aplicativos estilo Metro)]

O motivo maior para determinar se um aplicativo pode ser ouvido baseia-se, principalmente, no fato de ele estar ou não em primeiro plano. Porém, quando você elabora outras considerações, como os aplicativos de comunicação e os aplicativos de mídia que podem ser executados em segundo plano, tudo se complica. Mas não se preocupe, em geral, é muito fácil de explicar o comportamento do aplicativo com base no tipo de fluxo. Estas são as regras aplicáveis:

  • Se o aplicativo está em primeiro plano, não importa a categoria de seu fluxo de áudio. Ele sempre reproduzirá áudio; a menos que o áudio do sistema esteja desativado ou que o volume esteja baixo.
  • Somente um aplicativo de áudio que aceita funcionar em segundo plano pode ser executado por vez, a menos que haja dois no primeiro plano.
  • Os aplicativos de comunicação sempre atenuarão outros sons do sistema quando entrar uma chamada do tipo de fluxo de comunicação. Se houver música em execução no segundo plano, para ouvi-la de novo durante uma chamada, o usuário pode trazer o aplicativo de música para o primeiro plano (ajustar o aplicativo ou apenas colocá-lo à frente em tela cheia), aplica-se a regra 1.
  • Os sons do aplicativo no primeiro plano se misturam aos do áudio em segundo plano se os fluxos de primeiro plano não são incompatíveis com o fluxo do segundo plano. Por exemplo, um fluxo ForegroundOnlyMedia desativa o áudio de um fluxo BackgroundCapableMedia executado em segundo plano, mas GameEffects mistura-se a BackgroundCapableMedia para que os usuários possam participar de jogos e ouvir música.

Quando você escolhe uma categoria de aplicativo, deve seguir algumas regras para que o aplicativo funcione como esperado. Para que o aplicativo execute áudio em segundo plano, é preciso:

  • Adicionar uma declaração de áudio em segundo plano ao manifesto do aplicativo
  • Definir msAudioCategory como Comunicações ou BackgroundCapableMedia
  • O aplicativo deve estar registrado para controles de transporte de mídia (mais informações posteriormente)

Para as categorias que não executam áudio em segundo plano, não é preciso usar um tipo de mídia que reproduza áudio em segundo plano. Escolha Outro ou use GameEffects ou outro tipo relevante.

Para obter informações gerais sobre como usar aplicativos em segundo plano, consulte http://blogs.msdn.com/b/windowsappdev_br/archive/2012/06/01/ser-produtivo-no-segundo-plano-tarefas-em-segundo-plano.aspx.

Áudio em segundo plano e em espera conectado

Em espera conectado é um novo estado de baixo consumo de energia do Windows 8 que permite um modo de energia parecido com o do smartphone em dispositivos SoC (sistema em chip). No modo em espera conectado, o dispositivo parece estar desligado, mas não está. Os aplicativos podem continuar a reproduzir música em segundo plano, receber atualizações e usar a rede. Para obter mais informações, verifique a postagem no blog em sobre como diminuir o consumo de energia dos aplicativos. Para o fluxo dos aplicativos de música, existem alguns procedimentos importantes, caso você queira que seu aplicativo de áudio em segundo plano continue a fluir da rede quando o dispositivo entrar em espera conectado.

Em suma, se a conexão da rede não estiver ativa, o aplicativo não executará áudio de streaming. O áudio local funciona bem, mas se você tiver um servidor a ditar uma lista de reprodução, o aplicativo não terá acesso à próxima música até a rede estar ativada.

Para que o aplicativo continue a manter o fluxo de música, mesmo quando o dispositivo está em espera conectado, há três opções:

  1. Use a API de transferência em segundo plano, que realizará todo o trabalho para você.
  2. Encapsule um fluxo de bytes MD quando precisar transferir somente um volume pequeno de dados.
  3. Use a origem Media Foundation personalizada ou fluxo de bytes.

Para obter detalhes sobre essas opções, consulte o artigo em inglês Writing a power savvy background media app (Desenvolvendo um aplicativo de mídia de segundo plano com consumo inteligente de energia).

Notificações do sistema SoundLevel

As notificações SoundLevel ajudam os aplicativos a saber quando podem ser ouvidos. Quando começamos a desenvolver o Gerenciador de Reprodução de Mídia, não tínhamos certeza se enviaríamos notificações aos aplicativos para informá-los de que seu áudio estava desativado; logo percebemos que os aplicativos ficariam em segundo plano processando áudio ou vídeo e consumindo recursos do sistema desnecessariamente, o que esgotaria a bateria. Portanto, quando você registra o aplicativo para receber notificações SoundLevel, o Gerenciador de Reprodução de Mídia envia ao aplicativo uma dessas três notificações, dependendo do estado audível do aplicativo:

  • SoundLevel(Full) significa que o áudio do aplicativo é audível
  • SoundLevel(Mute) significa que o áudio do aplicativo não é audível (mas ainda pode reproduzir áudio)
  • SoundLevel(Low) significa que o áudio do aplicativo foi atenuado em -28dB e praticamente não é audível (embora ainda seja)

Vamos falar sobre o motivo de cada notificação ser enviada e o que o aplicativo deve fazer em resposta a cada uma.

SoundLevel(Full)

A notificação SoundLevel(Full) será enviada ao aplicativos quando:

O que o aplicativo deve fazer:

Um aplicativo que não possa ser executado em segundo plano é transferido do segundo plano para o primeiro

Não requer qualquer ação

O aplicativo primeiro fica visível após a inicialização

Não requer qualquer ação

SoundLevel(Mute)

A notificação SoundLevel(Mute) será enviada ao aplicativo quando:

O que o aplicativo deve fazer:

Um aplicativo que não possa ser executado em segundo plano é transferido do primeiro plano para o segundo

Pausar

Outro tipo de fluxo semelhante começa a ser reproduzido enquanto o aplicativo está em execução (por exemplo, um segundo fluxo BackgroundCapableMedia começa enquanto outro está sendo reproduzido; o áudio do mais antigo é desativado)

Pausar (a menos que você tenha um bom motivo para não fazê-lo) para economizar recursos do sistema

Se um tipo de fluxo de Comunicação estiver no segundo plano, ele receberá um SoundLevel(Mute) quando outro fluxo de Comunicação for iniciado no primeiro plano

Colocar a chamada em espera

SoundLevel(Low)

A notificação SoundLevel(Low) será enviada ao aplicativo quando:

O que o aplicativo deve fazer:

Um fluxo de comunicação começa a ser reproduzido enquanto o aplicativo está reproduzindo áudio

Pausar se ele estiver reproduzindo conteúdo que você não quer que o usuário perca. Pode ser ouvido, mas o volume ficará baixo, a menos que ele seja transferido para o primeiro plano. Embora você possa escolher, é recomendável pausar.

 

Esta é uma amostra de como registrar e usar os eventos SoundLevel:

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;
}

Captura e loopback

Acrescentamos algumas considerações sobre captura e loopback. Primeiramente, se você optar por criar um aplicativo com base em captura, precisará utilizar a categoria "Outro" para marcar seu fluxo de captura (ou o sistema atribuirá essa categoria); no entanto, o mais importante é que não é possível capturar fluxo com outra categoria. Para os aplicativos de Comunicação, depois de rotular o fluxo de processamento como Comunicação, você não precisará marcar o fluxo de captura.

Além disso, quando o sistema envia SoundLevel(Mute), o áudio de processamento, captura e loopback é desativado.

Por que não usar notificações de visibilidade?

Embora a visibilidade do aplicativo esteja intimamente associada à sua capacidade audível, é importante ouvir somente os eventos de SoundLevel se quiser saber quando o aplicativo será ouvido. Não utilize eventos de visibilidade para isso ou o estado audível do aplicativo poderá ficar fora de sincronia com seu estado visível.

Controles de Transporte de Mídia

[Consulte Controles de transporte de mídia para ter um guia de uso completo.]

A inclusão do controle de Transporte de Mídia disponível globalmente (exibido na próxima imagem) facilita muito a reprodução e o controle de músicas em um aplicativo de música.

start_screen
Figura 1 - Visão da tela inicial com o controle de Transporte de Mídia

mt_control
Figure 2 - Visão recortada do controle de Transporte de Mídia apenas,
mostrando a arte do álbum e os metadados.

A interface do usuário do MTC (como conhecida pela equipe da plataforma de mídia) permite que o usuário reproduza/pause áudio no primeiro plano ou no segundo plano, mesmo que o aplicativo tenha sido suspenso no segundo plano. A interface do usuário é chamada quando o usuário pressiona os botões de volume no teclado ou no slate. Aparece em qualquer lugar: o novo ambiente imersivo, a área de trabalho e até mesmo a tela de bloqueio. É um grande acréscimo ao Windows 8, e seus aplicativos podem (e devem) fazer uso deles quando apropriado.

Voltando ao cenário inicial (em que o usuário tem vários áudios em execução e fecha o laptop), é por esse motivo que sentimos que um controle de transporte global desse tipo era necessário. Como não há várias janelas para alternância, como na área de trabalho, os usuários precisam de uma forma de interromper o aplicativo que está emitindo som rapidamente. Acreditamos que associar a interface do usuário do MTC aos controles de volume proporcionaria um recurso intuitivo e muitos detalhes sobre o que está em execução no sistema do usuário com um pressionamento de botão.

Se você está usando um aplicativo de mídia (e principalmente um que aceita execução em segundo plano, veja como associá-lo aos controles:

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;

O próximo snippet de código mostra como habilitar os botões Faixa Anterior e Próxima Faixa, adicionando ouvintes de eventos ao objeto 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;

Você também pode adicionar metadados artísticos e arte ao menu suspenso. Veja mais detalhes no white paper mencionado acima.

A interface do usuário do MTC é preenchida com o aplicativo de mídia em uso. A interface do usuário permanece preenchida até ser limpa pelo sistema. As situações em que a interface do usuário será limpa são:

  1. Usuário fecha o aplicativo
  2. Usuário limpa aplicativos recém-utilizados da lista de alternância de aplicativos
  3. Sistema encerra o aplicativo para liberar recursos
  4. Falha do aplicativo
  5. Usuário desliga a máquina
  6. Aplicativo cancela registro de controles MTC

Resumo

Trabalhamos intensamente para criar um paradigma de áudio totalmente novo para o Windows 8, que se alinha com os fatores forma e oferece uma nova experiência ao usuário do Windows. As categorias de áudio oferecem contexto ao Windows para que o sistema possa tratar o aplicativo corretamente. Se o aplicativo precisar reproduzir áudio em segundo plano, você só precisará definir essa categoria, conectar os controles de transporte de mídia e declarar no manifesto.

As notificações SoundLevel permitem que você saiba se os aplicativos podem ser ouvidos pelo usuário. Com isso, você tem as informações de que necessita e ajuda a economizar bateria, pausando o áudio se ele não puder ser ouvido no segundo plano.

A interface do usuário do Transporte de Mídia mostra o estado do volume, o que permite aos usuários iniciar e interromper o áudio rapidamente e obter informações do artista, em um aplicativo de mídia.

Esperamos que você use essas novas tecnologias em seus aplicativos para garantir uma excelente experiência com áudio aos clientes. É tudo fácil de implementar e pode representar um grande retorno do investimento para os usuários.

-- Johnny Bregar, gerente de programas, Windows

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