Controlar el foco de una webcam en macOS sin interrumpir la captura
FocusDock empezó con una frustración de escritorio: una Logitech C920 montada como cámara cenital para mostrar objetos, libros y superficies. El autofocus podía cambiar de plano durante la toma. La solución que quería era pequeña: ajustar el foco y dejar abierta la aplicación de captura que ya estaba usando.
Ese requisito definió el alcance. FocusDock no crea una cámara virtual, no captura vídeo ni procesa fotogramas. La aplicación configura controles de la cámara física; la otra aplicación sigue siendo responsable de grabar.
Consultar primero qué permite la cámara
La parte difícil no es dibujar un slider. Es representar correctamente lo que el dispositivo y su controlador exponen en esa Mac.
FocusDock usa AVFoundation para descubrir cámaras externas. Después consulta controles mediante CoreMediaIO: foco, exposición, shutter, balance de blancos, ganancia y otros controles de imagen. La interfaz se construye a partir de esas capacidades. Si macOS no presenta un control como disponible y escribible, la aplicación no inventa un rango universal para mostrarlo.
Para el foco manual, el slider utiliza el rango nativo reportado por la cámara y limita los valores antes de escribirlos. Así, una escala que funciona para un modelo no se presenta como si fuera válida para todos.
Mantener el cambio pequeño
La aplicación puede cambiar el modo de autofocus cuando el dispositivo permite escribir ese ajuste. También guarda preferencias, ajustes por cámara y presets localmente; cuando vuelve a conectarse una cámara conocida, puede restaurar su configuración.
Focus Lock es una corrección periódica por software: cada 600 milisegundos comprueba si el autofocus se reactivó y si el foco cambió; si hace falta, vuelve a desactivar el automático o a escribir el valor seleccionado. No es un bloqueo físico ni una promesa de que todos los controladores respetarán cada escritura.
Los presets pueden asociarse a los identificadores VID/PID de una cámara. Eso permite mostrar perfiles compatibles con el dispositivo conectado, en vez de aplicar indiscriminadamente valores guardados para otro hardware.
Por qué el flujo normal usa CoreMediaIO
El proyecto también conserva una implementación UVC directa sobre IOUSBHostInterface, enfocada en autofocus y foco absoluto. Se mantiene para diagnóstico y como posible alternativa, pero no es el backend predeterminado: abrir directamente la interfaz USB puede tomar su propiedad exclusiva y entrar en conflicto con la aplicación que está capturando vídeo.
El flujo habitual usa controles compartidos de CoreMediaIO para intentar coexistir con la captura. Eso es una decisión de diseño, no una certificación universal: la disponibilidad y el comportamiento de cada escritura dependen de la cámara, su firmware, el controlador y la aplicación de captura. El propio proyecto contempla validación manual por modelo.
Una utilidad nativa, no una nueva cadena de vídeo
La interfaz está hecha con SwiftUI y usa AppKit para el comportamiento de ventana, la barra de menú, el modo compacto y las preferencias de activación. El panel puede permanecer pequeño, cambiar a Mini Mode y ofrecer acceso rápido a presets desde la barra de menú.
La separación de responsabilidades queda así:
FocusDock
├─ descubre cámaras externas (AVFoundation)
├─ consulta y configura controles expuestos (CoreMediaIO)
├─ presenta los controles disponibles (SwiftUI)
└─ guarda preferencias y presets localmente
Aplicación de captura
└─ inicia y procesa la sesión de vídeo
Esta frontera evita construir una cámara virtual o duplicar el trabajo de OBS, Photo Booth u otra herramienta de grabación. FocusDock intenta resolver una necesidad puntual sin convertirse en el centro de toda la cadena de vídeo.
Lo que todavía hay que verificar
El proyecto apunta a macOS 14 o posterior. La exploración documentada con una Logitech C920 encontró controles de foco, exposición, temperatura del balance de blancos, ganancia, brillo, contraste, saturación, nitidez, compensación de contraluz y zoom. Eso describe controles detectados durante esa exploración; no demuestra que todos sean escribibles ni que se comporten igual en otros modelos.
La interfaz cambia propiedades de cámara, así que una comprobación completa debe hacerse con cada cámara y aplicación de captura que se quiera soportar. También hay que verificar que la app local se firme y notarice antes de prometer una descarga pública. El material de este artículo no acredita una distribución pública disponible.
La lección para este tipo de herramienta es concreta: cuando el hardware expone capacidades distintas, la interfaz debe seguir esas capacidades y comunicar sus límites. Un control preciso empieza por no fingir que todos los dispositivos son iguales.
¿Buscas alguien que piense así?
Hablemos sobre tu próximo proyecto.
Trabajo entre arquitectura, integraciones e IA aplicada. Si tu equipo necesita alguien que diseñe sistemas que se mantengan simples a medida que crecen, podría ser una buena conversación.