Perguntas frequentes sobre o áudio da Web

Nos últimos meses, a API Web Audio do WebKit se tornou uma plataforma atraente para jogos e aplicativos de áudio na Web. À medida que os desenvolvedores se familiarizam com ele, ouço perguntas semelhantes repetidamente. Esta atualização rápida é uma tentativa de responder a algumas das perguntas mais frequentes para tornar sua experiência com a API Web Audio mais agradável.

P: Ajuda, não consigo fazer sons!

R: Se você não conhece a API Web Audio, consulte o tutorial de início ou a receita do Eric para reproduzir áudio com base na interação do usuário.

P: Quantos contextos de áudio devo ter?

A: Geralmente, é necessário incluir uma AudioContext por página, e um único contexto de áudio pode oferecer suporte a muitos nós conectados a ele. Embora seja possível incluir vários AudioContexts em uma única página, isso pode afetar a performance.

P: Tenho um AudioBufferSourceNode, que acabei de reproduzir com noteOn(), e quero reproduzir novamente, mas noteOn() não faz nada. Preciso de ajuda!

A: Quando um nó de origem termina a reprodução, ele não pode ser reproduzido novamente. Para reproduzir o buffer novamente, crie um novo AudioBufferSourceNode e chame noteOn().

Embora a recriação do nó de origem possa parecer ineficiente, os nós de origem são altamente otimizados para esse padrão. Além disso, se você mantiver um identificador para o AudioBuffer, não será necessário fazer outra solicitação ao recurso para tocar o mesmo som novamente. Se você precisar repetir esse padrão, encapsule a reprodução com uma função auxiliar simples, como playSound(buffer).

P: Ao reproduzir um som, por que você precisa criar um novo nó de origem toda vez?

A: A ideia dessa arquitetura é separar o recurso de áudio do estado de reprodução. Usando uma analogia de toca-discos, os buffers são análogos a discos e as fontes são análogas a cabeças de reprodução. Esse padrão é essencial porque muitos aplicativos envolvem várias versões do mesmo buffer sendo reproduzidas simultaneamente.

P: Como posso processar o som das tags audio e video?

A: MediaElementAudioSourceNode está em desenvolvimento. Quando disponível, ele vai funcionar mais ou menos assim (adicionando um efeito de filtro a uma amostra reproduzida pela tag de áudio):

<audio src="sounds/sample.wav" controls>
var audioElement = document.querySelector('audio');
var mediaSourceNode = context.createMediaElementSource(audioElement);
mediaSourceNode.connect(filter);
filter.connect(context.destination);

Esse recurso é acompanhado em este crbug. Nesta configuração, não é necessário chamar mediaSourceNode.noteOn(), a tag de áudio controla a reprodução.

P: Quando posso receber som de um microfone?

A: A parte de entrada de áudio será implementada como parte do WebRTC usando getUserMedia e estará disponível como um nó de origem especial na API Web Audio. Ele vai funcionar em conjunto com createMediaElementSource.

P: Como posso verificar quando um AudioSourceNode terminou de ser reproduzido?

A: No momento, é necessário usar um timer JavaScript, já que a API Web Audio não oferece suporte a essa funcionalidade. O snippet a seguir do tutorial "Como começar a usar a API Web Audio" é um exemplo disso em ação:

// Assume source and buffer are previously defined.
source.noteOn(0);
var timer = setTimeout(function() {
    console.log('playback finished');
}, buffer.duration * 1000);

Há um bug aberto para fazer com que a API Web Audio implemente um callback mais preciso.

P: O carregamento de sons faz com que toda a linha de execução da interface fique bloqueada e a interface não responda. Ajuda!**

A: Use a API decodeAudioData para carregamento assíncrono para evitar o bloqueio da linha de execução principal. Confira este exemplo.

P: A API Web Audio pode ser usada para processar sons mais rápido do que em tempo real?

A: Sim, estamos trabalhando em uma solução. Fique ligado!

P: Fiz um aplicativo incrível da API Web Audio, mas sempre que a guia em que ele está sendo executado vai para o segundo plano, os sons ficam estranhos.

A: Provavelmente, isso ocorre porque você está usando setTimeouts, que se comporta de maneira diferente se a página estiver em segundo plano. No futuro, a API Web Audio vai poder fazer callbacks em momentos específicos usando o timer interno do áudio da Web (atributo context.currentTime). Para mais informações, consulte esta solicitação de recurso.

Em geral, é recomendável interromper a reprodução quando o app for para o segundo plano. É possível detectar quando uma página vai para o segundo plano usando a API Page Visibility.

P: Como posso mudar o tom de um som usando a API Web Audio?

A: Mude o playbackRate no nó de origem.

P: Posso mudar o tom sem mudar a velocidade?

A: A API Web Audio pode ter um PitchNode no contexto de áudio, mas isso é difícil de implementar. Isso ocorre porque não há um algoritmo simples de mudança de tom na comunidade de áudio. Técnicas conhecidas criam artefatos, especialmente nos casos em que o deslocamento de tom é grande. Há dois tipos de abordagem para resolver esse problema:

  • Algoritmos de domínio de tempo, que causam artefatos de eco de segmento repetido.
  • Técnicas de domínio de frequência, que causam artefatos de som reverberante.

Embora não haja um nó nativo para fazer essas técnicas, é possível fazer isso com um JavaScriptAudioNode. Este snippet de código pode servir como ponto de partida.

P: Como posso criar um AudioContext com a taxa de amostragem que eu quiser?

R: No momento, não há suporte para isso, mas estamos analisando a situação. Consulte esta solicitação de recurso.

Se tiver outras dúvidas, faça perguntas no StackOverflow usando a tag web-audio.