Convierte la cámara y el micrófono de tu Android en una webcam y un micrófono más de tu Linux Mint, por cable USB. Sin instalar nada en el teléfono, sin Wi-Fi, sin nube: todo se queda entre tu móvil y tu PC.
Idioma: PhoneCam incluye interfaz en español e inglés. El idioma se detecta automáticamente a partir del locale del sistema (español si corresponde; inglés en cualquier otro caso) y también puede cambiarse al instante con
Len el menú de texto, desde la opción de idioma del menú gráfico o conphonecam l.
phonecam l, con L en el menú de texto o desde el menú gráfico.PHONECAM_START_GRACE) para demostrar que sigue vivo y, si se cae, muestra el final de su registro en el propio error en vez de limitarse a señalar el archivo.TURN_SCREEN_OFF se aplica por ADB porque scrcpy desactiva el control en modo cámara; KEEP_AWAKE se aplica igual, y el valor anterior de Android en el móvil se restaura al terminar la captura.phonecam help-connection (ayuda sigue funcionando), la fuente de audio mic-voice-recognition (scrcpy 3.2+), el icono de la app incluido en el propio script, capturas en los dos idiomas y una suite de tests de regresión (bash tests/run_all.sh, sin necesitar teléfono).Para cualquier programa que elija cámara o micrófono —Zoom, Meet, Discord, OBS, Teams, el propio navegador— tu teléfono pasa a aparecer en la lista como una webcam cualquiera, sin que esa aplicación tenga que saber nada especial sobre PhoneCam ni sobre tu móvil.

Por dentro combina tres piezas ya existentes y las coordina desde un único script:
/dev/video* normal.PhoneCam no reinventa nada de eso: se encarga de instalarlo, conectarlo todo correctamente entre sí y ponerte un menú delante para que no tengas que recordar ni un solo comando.
Conectarlas bien es más que “encenderlas a la vez”. Al iniciar la webcam, PhoneCam le pide a scrcpy solo la cámara —sin pantalla, sin control remoto, para no gastar recursos de más— y la vuelca en el dispositivo de v4l2loopback. Al iniciar el micrófono, le pide solo audio y enruta él mismo el flujo de sonido hasta el micrófono virtual; si no lo consigue en unos segundos, te avisa y te explica cómo terminarlo a mano en pavucontrol.
.desktop, unidad systemd --user y hasta el icono de la aplicación viven en un solo .sh; el icono es el último bloque del archivo (base64 dentro de comentarios, nunca se ejecuta), así que una copia del script suelta lo instala todo. assets/ solo guarda las imágenes del repositorio. Se lee de un tirón, se audita de un tirón y se copia donde haga falta sin arrastrar una carpeta de dependencias./dev/video* estándar y el micrófono, un dispositivo PipeWire/PulseAudio normal. Cualquier programa que sepa elegir cámara o micrófono los ve directamente, sin integraciones ni plugins específicos.scrcpy de los repositorios de Mint/Ubuntu puede quedarse por detrás de las funciones y la versión de upstream que necesita PhoneCam. Por eso no depende de ese paquete: comprueba la versión instalada y, si falta o se queda corta, descarga la build oficial más reciente desde los releases de GitHub y la deja lista en ~/.local/bin, sin pedir sudo ni tocar el resto del sistema.yad instalado añade además un icono en la bandeja con acceso directo a todo. Más detalles en Detección automática y bandeja del sistema.adb atascado no puede congelar el menú ni el agente. Antes de dar una webcam o un micrófono por activos, comprueba que el proceso siga siendo de verdad scrcpy y no un PID reciclado por otro programa; al detenerlos, espera a que cierren de verdad antes de devolver el control, para que un reinicio inmediato no se encuentre el dispositivo todavía ocupado./dev/video42) ya está ocupado por otra cámara o capturadora, PhoneCam elige automáticamente el siguiente libre. Reinstalar reutiliza ese número y la configuración que ya tenías —no la sobrescribe— y de paso vuelve a comprobar (y si hace falta, actualizar) scrcpy.sudo) te deja los comandos exactos para revertirla. Más detalles en Desinstalar.zenity instalado tienes menús y formularios; sin él, cae automáticamente a un menú de texto igual de funcional. Ningún paso se queda bloqueado solo por faltar una herramienta gráfica.apt, así que cualquier base Ubuntu/Debian debería comportarse igual; en distribuciones sin apt (Fedora, Arch…) tendrás que instalar las dependencias a mano e invocar el script directamente, sin pasar por install.x86_64. En otras arquitecturas necesitas instalar scrcpy 2.3.1+ por tu cuenta; PhoneCam lo usará igual una vez esté en el PATH.sudo solo se pide durante la instalación (paquetes del sistema, módulo v4l2loopback, grupos video/plugdev); el resto —incluida la descarga de scrcpy— corre como usuario normal, salvo que te falten a la vez curl y wget al ir a descargar scrcpy (no debería pasarte tras una instalación normal, porque curl ya es una de las dependencias), en cuyo caso se ofrece instalar curl con sudo antes de seguir.git clone https://github.com/filonux/PhoneCam.git
cd PhoneCam/script
chmod +x phonecam.sh
./phonecam.sh install
No lo ejecutes con sudo: el propio instalador lo pedirá cuando de verdad lo necesite. Si quieres una instalación desatendida (sin preguntas, salvo la contraseña de sudo del sistema), usa ./phonecam.sh install --yes.
Durante la instalación, el script:
apt lo que hace falta: adb, curl, v4l2loopback-dkms, v4l-utils, pipewire, pipewire-pulse, wireplumber, pulseaudio-utils, zenity, yad, libnotify-bin y las cabeceras del kernel en uso.v4l2loopback para que la webcam virtual sobreviva a un reinicio —si el número de dispositivo que usa por defecto ya está ocupado por otra cámara o capturadora, elige automáticamente el siguiente libre—, y añade tu usuario a los grupos video y plugdev si hace falta.~/.local/bin/phonecam y añade esa carpeta al PATH si no estaba ya.systemd --user que detecta el teléfono automáticamente.Dos cosas a tener en cuenta:
video o plugdev, tienes que cerrar sesión y volver a entrar (o reiniciar) para que el permiso surta efecto — hasta entonces, /dev/video42 (o el número que se haya asignado) existirá pero no podrás escribir en él.Todo lo que crea la instalación queda aquí:
| Qué | Dónde |
|---|---|
| Comando instalado | ~/.local/bin/phonecam |
| Configuración | ~/.config/phonecam/phonecam.conf |
| Registros | ~/.local/share/phonecam/logs/ |
| Estado en ejecución (PID y locks de arranque por modo) | $XDG_RUNTIME_DIR/phonecam/ (o ~/.cache/phonecam/ si no hay XDG_RUNTIME_DIR) |
| scrcpy descargado por PhoneCam | ~/.local/share/phonecam/scrcpy/ |
| Icono de la aplicación | ~/.local/share/icons/hicolor/1024x1024/apps/phonecam.png |
| Lanzador de aplicaciones | ~/.local/share/applications/phonecam.desktop |
| Servicio del agente | ~/.config/systemd/user/phonecam-agent.service |
El icono se instala desde assets/phonecam-icon.png si instalas desde la carpeta del repositorio y, si no, desde la copia embebida en el script (en ese caso, un icono ya instalado se conserva). assets/icon2.png a icon5.png son iconos alternativos: para usar uno, cópialo sobre el icono instalado (reinstalar desde la carpeta del repositorio restaura el predeterminado; reinstalar desde el comando instalado conserva el tuyo).
Una vez instalado, phonecam funciona como cualquier otro comando del sistema. Si prefieres no instalarlo, exactamente lo mismo funciona ejecutando ./phonecam.sh <comando> desde script/.
| Comando | Qué hace |
|---|---|
phonecam / phonecam menu |
Abre el menú — gráfico si hay zenity, de texto si no. Es lo que se ejecuta si no pasas ningún comando. |
phonecam webcam |
Inicia solo la cámara del teléfono como webcam. |
phonecam mic |
Inicia solo el micrófono del teléfono. |
phonecam both |
Inicia cámara y micrófono a la vez. |
phonecam stop |
Detiene todos los procesos de PhoneCam. |
phonecam status |
Estado actual: conexión del teléfono, procesos activos, dispositivos virtuales. |
phonecam cameras |
Lista las cámaras disponibles en el teléfono. |
phonecam choose-cam |
Elige y guarda la cámara predeterminada — útil si el teléfono tiene varias. |
phonecam config |
Abre la configuración avanzada (formulario gráfico, o el archivo en tu editor si no hay zenity). |
phonecam help-connection |
Guía rápida de cómo conectar y autorizar el teléfono. ayuda y help-conexion funcionan igual, como alias por compatibilidad. |
phonecam version |
Muestra la versión instalada. |
phonecam install [--yes] |
Instala PhoneCam y sus dependencias. |
phonecam uninstall |
Desinstala PhoneCam. |
phonecam l |
Alterna el idioma de la interfaz entre inglés y español y guarda la elección. |
phonecam help (o -h / --help) |
Lista de comandos, con una línea de qué hace cada uno. |
(phonecam agent también existe, pero es de uso interno: lo lanza el servicio systemd --user que crea el instalador para la detección automática — ver Detección automática y bandeja del sistema. No hace falta ejecutarlo a mano.)
phonecam menu (o phonecam webcam / mic / both directamente).A partir de ahí, en la app donde quieras usarlo, elige el dispositivo como lo harías con cualquier cámara o micrófono normal: la webcam debería aparecer como “PhoneCam” (a veces se ve como “Dummy video device”, según cómo la lea la app) y el micrófono como “PhoneMic”.
Si tienes varios teléfonos conectados a la vez, PhoneCam te deja elegir cuál usar en el menú gráfico (en el de texto, coge el primero que encuentra y te avisa); si el teléfono tiene varias cámaras (angular, frontal, etc.), phonecam choose-cam te deja fijar cuál quieres como predeterminada.
Esta misma guía está siempre a mano con phonecam help-connection (ayuda y help-conexion también funcionan), o desde la opción “❓ Cómo conectar el teléfono” del propio menú.
phonecam config abre un formulario (o el archivo de texto, si no tienes zenity) sobre ~/.config/phonecam/phonecam.conf:
| Campo | Qué controla | Por defecto |
|---|---|---|
CAMERA_FACING |
Qué cámara usar por orientación: back, front o external |
back |
CAMERA_ID |
Fuerza una cámara concreta por ID (la fija phonecam choose-cam; tiene prioridad sobre CAMERA_FACING) |
vacío |
CAMERA_SIZE |
Resolución, formato ANCHOxALTO (vacío = la máxima que declare el teléfono) |
vacío |
CAMERA_FPS |
Fotogramas por segundo | 30 |
VIDEO_QUALITY_PROFILE |
balanced (H.264, mínima latencia, recomendado para videollamadas) o max (H.265, más calidad, algo más de latencia de decodificación) |
balanced |
AUDIO_SOURCE |
Fuente de audio del teléfono: mic o, con scrcpy 3.2+, mic-unprocessed, mic-voice-communication, mic-voice-recognition o mic-camcorder |
mic |
AUDIO_CODEC |
Códec del micrófono: opus, aac, flac o raw |
opus |
AUDIO_BITRATE |
Bitrate de audio, ej. 192K |
192K |
AUTO_MODE |
Qué hacer al conectar el móvil: ask, webcam, mic, both u off |
ask |
PHONECAM_LANG |
Idioma de la interfaz: auto, en o es |
auto |
TURN_SCREEN_OFF |
Apaga la pantalla del móvil después de iniciar la captura | false |
KEEP_AWAKE |
Mantiene despierto el móvil mientras PhoneCam captura y luego restaura su valor Android anterior | true |
El propio archivo .conf trae comentarios breves que explican cada opción —en el idioma de la interfaz activo en el momento de generarlo (inglés o español)—, así que también se puede editar a mano sin mirar esta tabla. Ahí viven además, aunque no en el formulario, el bitrate exacto de cada perfil de vídeo (VIDEO_BITRATE_BALANCED y VIDEO_BITRATE_MAX, 20M/30M por defecto), el dispositivo de vídeo virtual (V4L2_DEVICE) y los nombres de los dispositivos de audio virtuales (MIC_SINK_NAME, MIC_SOURCE_NAME).
KEEP_AWAKE=true se aplica mediante el ajuste Android stay_on_while_plugged_in y el valor numérico original se restaura cuando se detiene la última captura de PhoneCam (o, si el teléfono se desconectó durante una captura, lo restaura el agente en cuanto vuelve). TURN_SCREEN_OFF=true se gestiona por ADB porque scrcpy desactiva el control en el modo cámara; Android 15+ usa el comando de energía de pantalla y, en versiones anteriores compatibles, se usa la tecla de encendido solo cuando Android informa de forma inequívoca de que la pantalla está activa.
Tras lanzar scrcpy, PhoneCam lo vigila durante 2 segundos: si scrcpy termina por su cuenta (cámara en uso, un ajuste que el teléfono rechaza…), el inicio falla y muestra las últimas líneas de su registro en ~/.local/share/phonecam/logs/, en lugar de dar por activa una captura que no lo está. La variable de entorno PHONECAM_START_GRACE=SEGUNDOS cambia esa espera; 0 la desactiva.
El formulario valida los campos de texto libre —resolución, FPS y bitrate de audio— antes de guardar nada, así que un valor mal escrito no acaba apareciendo después como un fallo críptico de scrcpy; el resto de campos son listas desplegables, así que no hay forma de dejarlos con un valor inválido. Los archivos de configuración se sustituyen de forma atómica, para que una escritura interrumpida no deje un .conf a medias. Cualquier cambio guardado se aplica de inmediato a la sesión en la que lo cambiaste; el agente en segundo plano lo recoge en la siguiente conexión del teléfono.
La instalación deja activo un agente (phonecam agent, gestionado como servicio systemd --user) que vigila la conexión del teléfono sin que tengas que abrir el menú:
AUTO_MODE (ver tabla debajo).phonecam config o choose-cam en la siguiente conexión del teléfono, sin que haga falta reiniciar el servicio a mano.systemd lo reinicia solo.AUTO_MODE |
Qué hace el agente al conectar el teléfono |
|---|---|
ask (por defecto) |
Abre una ventana pequeña preguntando si quieres solo webcam, solo micrófono, ambos o no hacer nada. Si no tienes zenity, en su lugar te llega una notificación pidiéndote que abras phonecam menu. |
webcam / mic / both |
Arranca ese modo directamente, sin preguntar nada. |
off |
No hace nada automático; el uso manual con phonecam sigue disponible igual. |
Con yad instalado, además aparece un icono en la bandeja del sistema con accesos directos a: abrir el menú completo, solo webcam, solo micrófono, webcam + micrófono, ver el estado, detener todo, abrir la configuración y salir — esta última opción detiene el servicio de verdad, no solo esconde el icono.
phonecam uninstall
Tampoco lo ejecutes con sudo: se niega a arrancar como root, igual que el instalador. Detiene todos los procesos, desactiva y borra el agente en segundo plano, quita el comando instalado y el lanzador, libera el micrófono virtual y limpia los registros y archivos temporales. También borra la carpeta donde descargó scrcpy (~/.local/share/phonecam/scrcpy/); el enlace ~/.local/bin/scrcpy solo lo borra si todavía apunta ahí, así que si en algún momento pusiste tú tu propio scrcpy en su lugar, no lo toca. Lo único que te pregunta antes de borrar es la configuración guardada en ~/.config/phonecam; si respondes que no, se queda ahí por si reinstalas más adelante.
La webcam virtual no se revierte sola porque hacerlo necesita sudo: el propio comando imprime estos tres comandos exactos para hacerlo a mano cuando quieras.
sudo rm -f /etc/modprobe.d/phonecam-v4l2loopback.conf
sudo rm -f /etc/modules-load.d/phonecam-v4l2loopback.conf
sudo modprobe -r v4l2loopback
Los paquetes del sistema (v4l2loopback-dkms, pipewire…) tampoco se desinstalan, por si los usa alguna otra aplicación; el propio comando te lo recuerda, aunque ahí ya te toca a ti decidir con apt qué paquetes quitar si quieres dejar el sistema completamente limpio.
Scriptya es otro proyecto de Filonux: un menú que organiza tus scripts en carpetas, los ejecuta con búsqueda difusa y puede convertir cualquiera de ellos —phonecam.sh incluido— en una app independiente con su propio icono, en el menú de aplicaciones o en el escritorio, sin tener que escribir un .desktop a mano.
Le puedes apuntar a la carpeta script/ de este repositorio y lanzar PhoneCam desde ahí, o usar scriptya --icons para dejarlo instalado como app aparte. Scriptya también lee metadatos opcionales al principio de cada script (nombre para el menú, descripción, si pide confirmación, si necesita sudo…); phonecam.sh todavía no los incluye, pero es un candidato natural para una futura actualización.
PhoneCam incluye la interfaz completa en español e inglés: menús, avisos, mensajes de estado, formularios, instalador, desinstalador, notificaciones, ayuda y textos generados para el lanzador y el servicio. Los comentarios del script quedan en inglés y se centran en comportamiento y seguridad, no en notas históricas de implementación.
Por defecto, PhoneCam detecta el locale de LC_ALL, LC_MESSAGES o LANG: si empieza por es, usa español; en cualquier otro caso, usa inglés. Puedes forzar el idioma en ~/.config/phonecam/phonecam.conf con PHONECAM_LANG="es" o PHONECAM_LANG="en", o devolverlo a auto. Un PHONECAM_LANG exportado tiene prioridad sobre el archivo en esa ejecución, p. ej. PHONECAM_LANG=en phonecam status, útil al reportar un error.
Para cambiarlo rápidamente, pulsa L o l en el menú de texto, selecciona Cambiar idioma en el menú gráfico, o ejecuta phonecam l. El cambio se guarda y queda aplicado a las siguientes invocaciones.
Mini-roadmap, sujeto a que haya interés real:
.deb para instalar con un doble clic, sin pasar por git cloneSi te interesa alguna mejora, abre un issue y dilo — es la forma más simple de que se sepa que hay gente esperándola.
El proyecto incluye una batería de regresión centrada en la interfaz bilingüe y en conservar el funcionamiento existente. Desde la raíz del proyecto, ejecuta la suite completa:
bash tests/run_all.sh
Necesita Bash 4.4 o superior y python3 con Pillow (python3-pil), además de las herramientas habituales de un Linux de escritorio; la lista completa está en CONTRIBUTING.
La batería cubre la prioridad de los locales, la detección automática, el cambio persistente entre en/es, el atajo L/l, el despacho de los menús gráfico y de texto, la detección y selección de cámaras, la validación y lectura de la configuración avanzada, los ciclos de webcam/micrófono/ambos, el enrutado PipeWire/PulseAudio, las comprobaciones de V4L2, la versión mínima de scrcpy, sus rutas de descarga alternativas, la escritura atómica, la gestión de pantalla/estado de energía Android, la seguridad de PID y locks, las barreras de instalación y desinstalación, el agente automático, la ayuda, las rutas de error y las invariantes de los argumentos enviados a la pila de captura. También comprueba visualmente los textos con fuentes Linux, ejecuta el menú interactivo mediante pseudo-TTY y realiza una simulación de uso completa con herramientas externas controladas. tests/walkthrough_en.sh, incluido en esa misma ejecución, va un paso más allá: hace recorrer al binario instalado real un ciclo de vida completo sin privilegios de root — máquina limpia, instalación, uso diario, cambio de idioma y desinstalación — y comprueba el texto literal que el script imprime en tiempo real, no solo cómo está montado el catálogo de mensajes a nivel estático. Las pruebas están diseñadas para ejecutarse sin un teléfono físico ni modificar audio o vídeo reales del sistema.
Los issues y pull requests son bienvenidos. Hay plantillas para reportar un fallo o proponer una mejora, y la guía completa está en .github/CONTRIBUTING.md. Este proyecto sigue el código de conducta descrito en .github/CODE_OF_CONDUCT.md; si necesitas reportar algo relacionado con seguridad de forma privada, mira .github/SECURITY.md.
Consulta el archivo LICENSE de este repositorio.
Hecho por Filonux.