Resposta curta: no Chrome 153, <camera> e <microphone> fazem mais sentido quando a página precisa de uma única capacidade — só vídeo ou só áudio — e quer que o pedido aconteça a partir de um controle visível, ativado diretamente pelo usuário e mediado pelo navegador. getUserMedia() continua sendo a escolha mais segura quando interoperabilidade entre navegadores, orquestração própria do fluxo, requisitos rígidos de dispositivo ou compatibilidade com código existente pesam mais.
O Chrome lista os dois elementos nas notas oficiais do Chrome 153, cuja versão Stable tem data de 8 de setembro de 2026. Eles seguem o modelo dos Capability Elements: a interface exibida na página é controlada e fortemente restrita pelo navegador, e a captura só começa depois de um sinal explícito de intenção do usuário. Isso muda principalmente quem controla o momento e a superfície do pedido de permissão; não elimina permissão, HTTPS, políticas do navegador ou a necessidade de fallback.
O que exatamente mudou no Chrome 153
<camera> medeia acesso a uma única MediaStreamTrack de vídeo; <microphone>, a uma única track de áudio. A especificação de Media Capture and Streams Extensions define para ambos uma propriedade somente leitura track, uma propriedade error, o método setConstraints() e os eventos track, cancel e error.
Na prática, o elemento encapsula a etapa de pedir a mídia. Ao ser ativado por uma interação genuína, o navegador inicia por baixo um fluxo equivalente a getUserMedia() para a capacidade correspondente. Se der certo, a track fica disponível em element.track e o evento track é disparado. Se o usuário desistir ou negar durante a interação, o fluxo pode resultar em cancel; falhas de outra natureza são expostas por error.
Isso não transforma getUserMedia() em API obsoleta. Os novos elementos são uma camada declarativa e especializada sobre o mesmo problema de captura, otimizada para um caso de uso mais estreito.
Matriz rápida: use quando / não use quando
| Situação | Melhor ponto de partida | Motivo |
|---|---|---|
| Capturar apenas vídeo, com ação clara do usuário | <camera> | Semântica de uma única capacidade, UI de intenção controlada pelo navegador e entrega direta de uma track de vídeo. |
| Capturar apenas áudio, como nota de voz ou teste de microfone | <microphone> | Evita pedir câmera sem necessidade e mantém o pedido contextual. |
| Precisar de câmera e microfone juntos | <usermedia> ou getUserMedia() | Os elementos do Chrome 153 foram desenhados para uma única capacidade; <usermedia> é o controle declarativo combinado. |
| Aplicação precisa funcionar de forma consistente fora de Chromium | getUserMedia() com progressive enhancement | O lançamento dos novos elementos ainda não deve ser tratado como suporte interoperável universal. |
| Fluxo depende de requisitos rígidos de câmera, resolução ou dispositivo | getUserMedia() ou validação adicional da track | O rascunho atual filtra constraints obrigatórias antes da solicitação feita pelo elemento. |
| Aplicação já tem uma camada madura de seleção, troca e retomada de dispositivos | Manter getUserMedia() e testar migração por etapas | O ganho do elemento é maior na intenção/permissão; não é automaticamente melhor para toda a orquestração de mídia. |
Exemplo mínimo com <camera> e fallback
Uma implementação de produção deve detectar suporte e conservar um caminho convencional. A detecção abaixo é coerente com a interface HTMLCameraElement exposta pela especificação:
<camera id="camera-control"> <button id="camera-fallback" type="button">Ativar câmera</button> </camera> <video id="preview" autoplay playsinline muted></video> <script> const preview = document.querySelector('#preview'); const fallback = document.querySelector('#camera-fallback'); if ('HTMLCameraElement' in window) { const camera = document.querySelector('#camera-control'); camera.setConstraints({ width: { ideal: 1280 }, height: { ideal: 720 } }); camera.addEventListener('track', () => { preview.srcObject = new MediaStream([camera.track]); }); camera.addEventListener('cancel', () => { console.log('O usuário não concluiu a liberação da câmera.'); }); camera.addEventListener('error', () => { console.error(camera.error); }); } else { fallback.addEventListener('click', async () => { preview.srcObject = await navigator.mediaDevices.getUserMedia({ video: true }); }); } </script>
Para microfone, a lógica é equivalente: teste 'HTMLMicrophoneElement' in window, escute track e use microphone.track. Se a aplicação precisa combinar áudio e vídeo em um único MediaStream, ela também pode montar esse stream a partir das tracks obtidas, mas nesse caso vale comparar a complexidade com <usermedia> ou com um único getUserMedia({audio:true, video:true}).
O que muda na permissão — e o que não muda
Com getUserMedia(), o site chama uma API imperativa e o navegador decide, de acordo com estado e heurísticas, se e como mostra o pedido. Nos Capability Elements, o controle de captura fica embutido na página, mas a apresentação é do navegador e a ativação precisa vir de uma ação real do usuário. A documentação do <usermedia>, que usa o mesmo modelo de segurança e recuperação citado pelo Chrome 153 para os novos elementos, descreve esse desenho como uma forma de dar ao navegador um sinal mais forte de intenção e oferecer uma recuperação mais direta quando o usuário já havia negado acesso.
- Não há concessão automática: o elemento não ignora a decisão do usuário nem políticas do sistema.
- HTTPS continua necessário: a especificação diz que <camera> e <microphone>, assim como getUserMedia(), só funcionam em contexto seguro; fora dele, o fallback pode ser exibido.
- Um clique sintético não substitui o usuário: a ativação é filtrada para aceitar ação genuína; eventos não confiáveis levam a falha, em vez de abrir captura silenciosamente.
- O prompt pode nem aparecer: se o navegador já puder atender ao pedido com a permissão existente, a captura pode seguir sem um novo prompt.
- Cancelamento e erro ficam separados: isso ajuda a não tratar toda desistência do usuário como falha técnica.
Portanto, a mudança é menos “uma nova permissão” e mais uma nova forma de expressar intenção e conduzir o ciclo de permissão/captura.
As constraints não são idênticas às de um getUserMedia() cru
setConstraints() existe tanto em <camera> quanto em <microphone>, mas há uma ressalva importante: no rascunho atual, o algoritmo remove constraints consideradas obrigatórias antes de construir a chamada de captura subjacente. Isso evita transformar o controle de permissão em uma superfície que pode falhar por exigências rígidas antes mesmo de o usuário concluir a escolha.
Consequência prática: se o seu produto depende de uma câmera específica, de uma resolução que precisa ser obrigatória ou de uma política estrita de seleção de dispositivo, não trate setConstraints() no Capability Element como substituto mecânico de toda a lógica existente. Valide track.getSettings(), teste applyConstraints() na track quando fizer sentido e mantenha o fluxo legado onde um requisito duro for essencial.
Há ainda detalhes de ciclo de vida que pedem teste
A própria proposta registra que o comportamento de uma nova ativação quando o elemento já possui uma track ainda precisa ser determinado; o algoritmo atual ignora a ativação se a track já estiver definida. Isso importa para interfaces que pretendem usar o mesmo controle para parar, reiniciar, trocar dispositivo ou recuperar uma captura encerrada.
Por isso, aplicações com lógica de mídia sofisticada devem testar explicitamente cenários como track.stop(), troca de câmera, suspensão, retomada e navegação entre estados. Se esses comportamentos forem centrais, getUserMedia() ainda oferece uma superfície conhecida e controlável enquanto a proposta evolui.
Como planejar o fallback sem duplicar toda a aplicação
A estratégia mais simples é separar aquisição da mídia do restante da aplicação. Crie uma função que recebe uma MediaStreamTrack ou MediaStream e conecta essa mídia ao preview, Web Audio, WebRTC ou pipeline de processamento. Depois, escolha apenas a camada de aquisição:
- se HTMLCameraElement existir, use <camera> para vídeo;
- se HTMLMicrophoneElement existir, use <microphone> para áudio;
- se não existir, acione navigator.mediaDevices.getUserMedia() a partir do botão de fallback;
- se for necessário câmera + microfone juntos, avalie <usermedia> quando suportado e mantenha o mesmo fallback convencional.
O Intent to Ship do Chromium descreveu a disponibilidade esperada como restrita a navegadores Chromium e não registrava sinal de Gecko ou WebKit naquele momento. Isso é suficiente para uma recomendação conservadora: não baseie produção em detecção de versão do Chrome; baseie em feature detection e mantenha fallback funcional.
Checklist antes de colocar em produção
- Confirme que o caso é realmente de uma única capacidade.
- Sirva a experiência em HTTPS e teste restrições de permissão do ambiente corporativo/gerenciado.
- Use 'HTMLCameraElement' in window e/ou 'HTMLMicrophoneElement' in window, não user-agent sniffing.
- Mantenha um botão de fallback que chama getUserMedia() em navegadores sem suporte.
- Teste os caminhos track, cancel e error separadamente.
- Não tente camuflar ou automatizar o controle: a UI e a ativação são deliberadamente protegidas pelo navegador.
- Se constraints rígidas forem requisito de negócio, valide a track adquirida em vez de presumir equivalência total com getUserMedia().
- Teste encerramento e reaquisição de mídia, porque o comportamento pós-track ainda tem pontos em aberto na proposta.
Regra de decisão: adote <camera> ou <microphone> quando o ganho de UX vier de um pedido contextual, explícito e de uma única capacidade. Continue com getUserMedia() quando você precisar de alcance entre navegadores, controle fino do fluxo ou comportamento já estabilizado. No Chrome 153, o melhor caminho de produção é progressive enhancement, não uma migração “tudo ou nada”.




