Volver al Centro de conocimiento
Huella digital

Enumeración MediaDevices y privacidad de cámaras virtuales

Distingue la lista de cámaras y micrófonos del permiso y de una transmisión activa, y configura fuentes virtuales con límites claros.

BotBrowser Team

Documentación

Quieres la documentación estructurada de Huella digital?

Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.

La enumeración de dispositivos multimedia ayuda a elegir una cámara o un micrófono, pero no demuestra que la página pueda capturar desde ese dispositivo. enumerateDevices() informa de una vista de entradas y salidas filtrada por permisos y políticas; getUserMedia() solicita acceso por separado e intenta abrir una fuente real. Una cámara virtual debe proceder de software externo. Trata la lista como una superficie de privacidad y como una ayuda limitada para elegir: explica por qué se necesita el medio, solicita solo el flujo necesario y muestra qué fuente está activa. BotBrowser controla cómo se informa esta enumeración, pero no crea la fuente, no concede permisos ni garantiza una transmisión utilizable.

Esta distinción importa al revisar la identidad del navegador. La página puede saber que existe una categoría de cámara o micrófono antes de recibir una etiqueta útil, pero eso no prueba consentimiento, buen estado del hardware ni disponibilidad de un flujo. Para temas relacionados, consulta permisos y huella del navegador y privacidad de identidad de red WebRTC.

La enumeración, el permiso y la disponibilidad de la fuente son etapas distintas

Ver el video

Este video en inglés sigue una llamada a enumerateDevices() en una página de laboratorio controlada: el kind, el label y el deviceId que recibe una página, por qué las etiquetas siguen limitadas por permisos y en qué se diferencian el modo de perfil y el modo real como fuentes de dispositivos. Muestra una observación en un runner Ubuntu; no compara equipos, no concede permiso de captura ni establece identidad, anonimato, acceso ni la decisión de un sitio remoto.

Resumen

La enumeración es una vista de descubrimiento filtrada por permisos, no una prueba de captura. BotBrowser puede controlar la lista de dispositivos del perfil que se comunica a la página, pero el permiso, la disponibilidad de la fuente y el flujo siguen siendo condiciones separadas del navegador y del sistema operativo.

Contenido

Qué informa la enumeración de dispositivos

La notificación de cambios de dispositivos solo está disponible cuando el navegador la admite, y su oportunidad puede variar. Mantén la interfaz preparada para refrescarse y para que una fuente desaparezca antes de abrirla.

navigator.mediaDevices.enumerateDevices() devuelve registros MediaDeviceInfo de las entradas y salidas que el navegador muestra en el contexto actual. kind distingue entrada de audio, entrada de vídeo y salida de audio; label es el nombre visible cuando se permite divulgarlo. El navegador puede poner primero los dispositivos de captura predeterminados. El resultado es una vista ordenada y contextual, no un inventario completo del equipo. El primer registro tampoco es necesariamente “la cámara”: puede ser de otro tipo y el orden predeterminado no expresa la preferencia de la persona.

El contexto limita la lista. La página debe estar en un contexto seguro para usar las interfaces pertinentes; Permissions Policy puede excluir tipos de dispositivo y el estado del permiso afecta a los dispositivos y etiquetas expuestos. Antes del acceso pueden faltar entradas o aparecer etiquetas vacías. Conceder permiso puede hacer que la vista sea más informativa, pero no vuelve estable la lista. Un auricular conectado, otra cámara, un cambio de permiso o una regla del sistema operativo pueden modificarla.

Incluso sin etiquetas, la presencia y el tipo de entradas pueden revelar si el contexto parece tener opciones de cámara o micrófono. La cantidad, el orden y los cambios de nombre aportan contexto sobre el equipo. Por eso recopilar la lista repetidamente es una decisión de privacidad, no un diagnóstico inocuo. Si basta con que la persona elija una fuente para una llamada, mantén la lista en la interfaz en vez de enviarla a analítica. Para soporte, conserva solo el resultado concreto que ayude a resolver el caso, no el inventario completo.

Trata cada resultado como una instantánea. Conectar un auricular, activar una cámara virtual, cambiar un permiso o usar otro ordenador puede cambiar lo que informa el navegador. La especificación Media Capture define una notificación de cambio de dispositivos para los cambios visibles al documento, pero la aplicación todavía debe actualizar la lista en puntos razonables y gestionar que una fuente desaparezca entre la selección y la captura. La notificación no garantiza que todos los cambios de hardware o del sistema se comuniquen de inmediato en todos los navegadores.

Para que la decisión siga siendo legible en una pantalla estrecha, trata cada resultado como una ficha breve:

  • Aparece una entrada de vídeo. Permite concluir: el navegador informa de una opción de vídeo en este contexto. No demuestra: que la cámara esté encendida, autorizada o entregue imágenes. Siguiente: solicitar el flujo previsto y gestionar el resultado.
  • La etiqueta está vacía o es genérica. Permite concluir: el contexto no recibe un nombre útil. No demuestra: que el dispositivo falte o esté averiado. Siguiente: revisar contexto seguro, política, permisos y comportamiento esperado.
  • Aparecen varias entradas o cambia el orden. Permite concluir: se informan varias opciones o cambió la vista. No demuestra: que la primera sea preferida o que la lista sea estable. Siguiente: dejar elegir y actualizar la interfaz.
  • No aparece una entrada adecuada. Permite concluir: esta consulta no expone una opción coincidente. No demuestra: que no exista ninguna fuente física o virtual. Siguiente: revisar sistema operativo, aplicación fuente y política.

El valor de esta tabla es evitar que una observación del navegador se convierta en una afirmación excesiva sobre el hardware o el consentimiento. MediaDeviceInfo.label es un nombre para elegir; no identifica al propietario ni el contenido de la fuente. Tampoco es lo mismo que MediaStreamTrack.label, que corresponde a una pista después de iniciar la captura.

Por qué la lista está limitada y afecta a la privacidad

El acceso depende de varias capas. Las interfaces pertinentes requieren un contexto seguro; el navegador aplica permisos y la página que inserta el contenido puede estar limitada por Permissions Policy. El usuario puede rechazar y el sistema operativo puede bloquear el dispositivo por separado. Un permiso del navegador no significa que el sistema pueda entregar imágenes, y una opción del sistema no concede por sí sola permiso al origen web. Para ver cómo las políticas limitan las capacidades del navegador en general, consulta Permissions Policy, capacidades del navegador y privacidad.

El navegador puede mostrar solo dispositivos predeterminados o reservar las etiquetas hasta que el origen tenga permiso de captura. No afirmes que la enumeración siempre devuelve la lista completa ni que una etiqueta vacía es necesariamente un fallo. Explica el siguiente paso relevante: usar una página segura, revisar si la política de inserción permite ese tipo, comprobar el control de permisos del navegador cuando corresponda y volver a probar a partir de una acción del usuario. No solicites abrir una transmisión solo para revelar nombres si el producto no necesita capturar.

Las opciones informadas pueden variar entre entornos, de modo que un sitio que las recopile puede añadirlas a una huella más amplia del navegador. La respuesta adecuada es limitar los datos y explicar el motivo del acceso, no prometer que la enumeración es secreta o idéntica en todas partes. deviceId es único para el origen que llama y puede persistir entre sesiones según el modelo de privacidad del navegador, pero borrar el almacenamiento o usar navegación privada puede rotarlo. groupId se genera por documento y no es estable entre sesiones de navegación. Ninguno es una identidad permanente. No conserves nombres, cantidades ni identificadores más allá de lo necesario para elegir o prestar soporte. No uses la lista como factor de autenticación ni como sustituto de una identidad elegida por el usuario.

En una inserción de otro origen se aplican dos controles: la cabecera de la respuesta principal define la lista permitida y el atributo allow del iframe delega solo dentro de ella. Por ejemplo:

Permissions-Policy: camera=(self "https://meet.example"), microphone=(self "https://meet.example")
<iframe src="https://meet.example" allow="camera; microphone"></iframe>

Si la cabecera excluye el origen insertado, allow no puede añadir acceso. La política omite de enumerateDevices() los tipos de cámara o micrófono que bloquea; es la vista filtrada del origen, no una prueba de que el dispositivo no exista. getUserMedia() sigue siendo un paso distinto, sujeto al permiso y a la disponibilidad de la fuente.

El control que ve la persona debe corresponder a la solicitud: indica si la sesión necesita audio, vídeo o ambos; quién recibirá el contenido y si se grabará; y qué alternativa queda si se rechaza un permiso. Una llamada de soporte solo de audio no debería exigir la cámara. Una pantalla para elegir fuente no debería empezar a grabar silenciosamente. Mantén disponible el cambio de selección o la parada y haz que los controles funcionen sin depender de una vista previa. Sobre un tema relacionado con el audio, consulta Acceso a Web Audio API y flujos de audio prácticos.

Enumerar no equivale a obtener una transmisión

Detener una pista multimedia finaliza la captura activa; no revoca por sí solo el permiso del sitio para solicitudes futuras. Si la interfaz permite ambas acciones, deben tener controles separados.

enumerateDevices() responde qué registros ve ahora la página. getUserMedia() responde otra pregunta: si, tras aplicar el permiso pertinente, el navegador puede abrir una fuente de audio o vídeo y devolver un MediaStream. Una búsqueda correcta no equivale a una captura correcta. La solicitud también puede fallar si la persona la rechaza, el navegador o el sistema bloquea la capacidad, el contexto no es válido o no hay una fuente disponible. Puede quedar pendiente mientras la persona decide.

Gestiona el resultado como un estado de captura, no como un error de enumeración. Mantén una alternativa sin cámara o micrófono cuando el producto la admita y no repitas la misma solicitud tras un rechazo sin una nueva acción del usuario. Si la captura empieza, muestra la fuente elegida y el estado activo. Si se desconecta, informa de ello y deja que la persona decida si selecciona otra; cambiar silenciosamente puede alterar qué se captura y superar lo que esperaba.

En los registros separa las opciones informadas, el permiso, el resultado de captura, la pista seleccionada y el estado activo o finalizado. Así soporte puede distinguir una lista vacía de un rechazo, un bloqueo del sistema o una pista que terminó al desconectarse. No guardes el contenido multimedia ni toda la lista para separar estos casos. Para otra superficie de dispositivos con permisos, consulta Permisos de Web Bluetooth, selección de dispositivos y privacidad.

Qué añade una cámara virtual

Comprueba deviceId, groupId y kind=videoinput después de iniciar la fuente; esos campos demuestran que el navegador ve una entrada de vídeo, no que la aplicación haya concedido permiso para capturarla.

Compartir una pestaña o pantalla es una vía de captura independiente que requiere una selección del usuario. No es un dispositivo de cámara de enumerateDevices() ni una cámara virtual.

Una cámara virtual es una fuente que proporciona una aplicación instalada o una integración del sistema operativo. Puede ofrecer una escena compuesta, una presentación, un patrón de prueba u otra entrada aprobada. El navegador no la crea al enumerar dispositivos, y ver su nombre no demuestra que la aplicación propietaria esté abierta ni que produzca imágenes.

La fuente tiene su propio ciclo. Si el flujo lo requiere, inicia la aplicación autorizada antes del paso de captura. Después, la persona elige o solicita la cámara por la vía normal del navegador; se mantienen los permisos habituales y la captura depende de que la fuente esté disponible. Al acabar, detén la pista y cierra o desactiva la fuente con sus controles normales. Son acciones distintas: terminar la transmisión del navegador no necesariamente cierra la aplicación, y cerrar la fuente puede hacer que una pista elegida termine o falle.

Usa un nombre claro, como “Cámara de presentación”, e indica si muestra una cámara en directo, una escena compuesta o una imagen de prueba. Revisa el contenido real antes de compartirlo: una escena preparada puede exponer datos de cuenta o documentos internos igual que una cámara física puede mostrar una habitación. Es una opción válida para producción, formación, accesibilidad o pruebas legítimas, pero no elimina el consentimiento ni la revisión del contenido.

Si no aparece la fuente, revisa la cadena en orden: confirma que la aplicación fuente funciona y produce la escena esperada; comprueba si el sistema operativo la ofrece al navegador; revisa el resultado de enumeración; y después prueba una captura iniciada por el usuario. Cada paso responde a una pregunta diferente. Una entrada ausente no prueba que se pueda eludir la API ni que cambiar la lista produzca una transmisión.

Ruta de decisión para configurar y resolver problemas

Guarda secureContext=true, permission=granted y track.readyState=live como tres resultados distintos; mezclar esos estados oculta si el fallo está en el origen, el consentimiento o la fuente.

Esta ruta ayuda a elegir la siguiente comprobación sin mezclar descubrimiento, consentimiento y captura. Sirve para una pantalla de configuración, una guía de soporte o una prueba de versión porque cada resultado lleva a una acción acotada.

Usa la misma ruta como fichas cortas cuando la pantalla sea estrecha:

  • El contexto no es seguro o falta la interfaz necesaria. Significa: no se puede completar el flujo multimedia normal aquí. Acción: usar la página segura admitida o explicar la limitación.
  • No aparece el dispositivo. Significa: la vista filtrada por permisos y políticas no expone una opción. Acción: revisar la política de inserción y la fuente del sistema; no inferir ausencia física.
  • Hay dispositivo, pero la etiqueta está vacía. Significa: se descubrió la opción sin revelar un nombre útil. Acción: continuar solo si puede elegirse con seguridad; revisar permisos si el nombre es necesario.
  • La persona rechaza. Significa: no autorizó la captura. Acción: mantener la alternativa documentada y respetar la decisión.
  • Hay permiso, pero falla la captura. Significa: la autorización no hizo utilizable la fuente. Acción: revisar privacidad del sistema, aplicación fuente, conexión y error concreto.
  • La captura comienza y luego termina. Significa: una pista activa se detuvo o perdió la fuente. Acción: mostrar que terminó, limpiar el estado y preguntar antes de cambiar.

Para un flujo nuevo, empieza con la capacidad mínima que complete la tarea. Explica el propósito, solicita solo el tipo necesario y prueba el camino de rechazo. Después prueba una fuente ausente o desconectada, cambios en la lista y la parada correcta. En móvil y escritorio conserva el mismo significado aunque cambie el diálogo del navegador. Revisa también analítica y registros: guarda lo necesario para operar, no el contenido ni la lista completa por defecto.

En un flujo con cámara virtual añade dos comprobaciones: que la aplicación externa produzca la escena esperada y que, después del consentimiento, el navegador tenga una pista real seleccionada. La primera no demuestra la segunda. Confirma la fuente visible antes de compartir y deja el control de parada disponible durante toda la sesión. El resultado útil es una experiencia observable, no simplemente una lista que no esté vacía.

Control de enumeración y límites de BotBrowser

BotBrowser documenta --bot-media-devices como control de la forma en que navigator.mediaDevices.enumerateDevices() informa de dispositivos de audio y vídeo. De forma predeterminada devuelve la lista de dispositivos del perfil sin necesitar una opción adicional. Esto puede ayudar a mantener la vista informada alineada con un perfil elegido cuando el flujo depende de esa lista. BotBrowser controla la enumeración informada, pero no crea una cámara virtual, no concede permisos del navegador o del sistema operativo y no garantiza que la fuente elegida produzca un MediaStream.

El control afecta a la enumeración informada. No instala ni crea una cámara virtual, no inicia una aplicación fuente, no concede permisos del navegador o del sistema operativo ni garantiza que la fuente seleccionada produzca un MediaStream. La página y la plataforma siguen las reglas normales de permiso y captura. Valida la lista por separado del permiso y del flujo, y describe solo el resultado que se haya comprobado.

En la práctica, la lista de perfil puede hacer predecible la superficie de descubrimiento; el flujo visible al usuario sigue siendo responsable del consentimiento, la selección, los fallos de captura y la parada. Mantén esos límites claros en la interfaz y el soporte.

Continuación sobre Screen Capture

Screen Capture API añade una superficie elegida por el usuario; compara su ciclo de vida con este límite de enumeración en Screen Capture API: control del usuario y privacidad.

Conclusión práctica

Trata por separado la enumeración, el permiso y la disponibilidad del flujo. Usa el control de enumeración basado en perfil de BotBrowser solo para mantener coherente la vista comunicada con el perfil previsto; deja visibles el consentimiento, el software de cámara virtual, el acceso del sistema y la detención del flujo.

Fuentes

#MediaDevices#Cámara Virtual#Micrófono#Privacidad#Flujos Del Navegador

Este artículo forma parte de la guía: ¿Qué es la huella digital del navegador?

Ejecuta la misma comprobación en BotBrowser

Carga un perfil, mantén dentro del navegador las señales que acabas de leer y confirma el resultado en tu propia máquina antes del despliegue.