Control remoto para lo que se está reproduciendo en tu PC Windows (Spotify, VLC, o streaming en el navegador/apps como Netflix, HBO Max, Paramount+) desde tu celular Android, por la misma red Wi-Fi.
El servicio de la PC solo interactúa con las teclas multimedia / controles de reproducción del sistema operativo (Windows System Media Transport Controls). Nunca accede, inicia sesión ni almacena información de tus cuentas en las plataformas de streaming — solo lee título, app y estado de reproducción, lo mismo que ya expone el centro de "Reproduciendo ahora" de Windows.
Funciones principales:
- Emparejamiento por código QR: la PC muestra un QR (clic derecho en el ícono de la bandeja → "Vincular nuevo dispositivo") que el celular escanea para conectar y emparejar en un solo paso — es el método principal; el descubrimiento por red e IP manual quedan como "Opciones avanzadas" por si el QR no es una opción.
- Detección y control de múltiples reproductores a la vez (Spotify, un video en el navegador, Paramount+, etc. simultáneamente) — deslizá hacia los lados en la pantalla de control para pasar de uno a otro.
- Interfaz personalizada por plataforma: cada app se identifica con su nombre y color de marca, y los botones se adaptan a lo que esa app realmente soporta (algunas exponen adelantar/retroceder 10s, otras solo play/pausa — ver la sección de solución de problemas sobre por qué).
- Reconexión automática: una vez emparejado, la app vuelve a conectar sola con tu PC cada vez que la abres, sin pedir el PIN de nuevo — y si la conexión se corta mientras la usas (la PC se reinicia, el Wi-Fi falla un momento), reintenta sola en segundo plano sin que tengas que cerrar y volver a abrir nada.
- Trackpad de mouse remoto: un botón "Mouse" abre un panel táctil para mover el cursor de la PC arrastrando el dedo, con doble toque como clic izquierdo.
- Gestión de dispositivos emparejados: clic derecho en la bandeja → "Dispositivos emparejados" muestra quién tiene acceso y permite revocarlo al instante.
- Atajo de doble clic: doble clic directo en el ícono de la bandeja de la PC pausa/reanuda lo que esté sonando, sin tocar el celular.
|
Servicio de PC / bandeja del sistema / instalador |
App Android |
Los archivos fuente están en docs/branding/. Se usan tal cual para el ícono de bandeja y del .exe/instalador en la PC, y se convierten a los formatos de mipmap adaptativos que exige Android para el ícono de la app y la pantalla de splash.
- Arquitectura
- Requisitos previos
- Estructura del proyecto
- Servicio de escritorio (PC)
- Aplicación Android
- Dónde quedan los instaladores generados
- Primer uso: vincular la PC con el celular
- Solución de problemas
- Licencia
| Componente | Tecnología | Rol |
|---|---|---|
Servicio de PC (pc-service/) |
Python 3.12 + asyncio | Detecta todas las sesiones de reproducción activas a la vez vía SMTC de Windows (no solo una), controla cada una por su propia sesión, mueve el mouse (pynput), expone un servidor WebSocket en la LAN, emparejamiento por PIN, descubrimiento por broadcast UDP, ícono en la bandeja del sistema. |
App Android (android-app/) |
Kotlin + Jetpack Compose | Descubre la PC en la red, se empareja y recuerda la conexión, muestra un selector/deslizador cuando hay varios reproductores activos y controla el que elijas (adaptando los botones a lo que esa plataforma realmente soporta), más un trackpad de mouse remoto. |
Comunicación: WebSocket (ws://) sobre la red local, con emparejamiento por PIN de un solo uso y token persistente por dispositivo. Ver el detalle completo del protocolo en pc-service/remote_media_server/protocol.py.
| Herramienta | Versión usada | Para qué | Descarga |
|---|---|---|---|
| Windows | 10/11 (64-bit) | Ejecutar el servicio de PC | — |
| Python | 3.12.x | Compilar y correr el servicio de PC (winsdk no publica binarios precompilados para Python 3.14+, por eso 3.12) |
python.org/downloads/release/python-31210 |
| Android Studio (incluye JDK 21 y Android SDK) | Ladybug o superior | Compilar la app Android | developer.android.com/studio |
| Inno Setup 6 | 6.7.x | Generar el instalador .exe de Windows |
jrsoftware.org/isdl.php |
| Android SDK Platform 36 + Build-Tools 36.0.0 | — | Se instalan desde el SDK Manager de Android Studio | — |
| ADB (incluido en el Android SDK) | — | Instalar el APK en un dispositivo físico | — |
Instalación rápida por línea de comandos (usando winget, incluido en Windows 10/11):
winget install --id Python.Python.3.12 -e
winget install --id JRSoftware.InnoSetup -e
winget install --id Google.AndroidStudio -eTras instalar Android Studio, ábrelo una vez y usa More Actions → SDK Manager para instalar Android SDK Platform 36 y Android SDK Build-Tools 36.0.0 si no vienen preseleccionados.
Control remoto/
├── LICENSE
├── README.md <- este archivo
├── pc-service/ <- servicio de Windows
│ ├── requirements.txt
│ ├── app_entry.py <- punto de entrada para PyInstaller
│ ├── remote_media_server/ <- código fuente del servicio
│ ├── tests/manual_ws_client.py <- cliente de prueba manual
│ └── packaging/
│ ├── build_exe.spec <- receta de PyInstaller
│ ├── installer.iss <- receta de Inno Setup
│ ├── app_icon.ico
│ ├── license_installer.txt <- términos mostrados en el instalador
│ ├── dist/ <- ControlRemotoMultimedia.exe (generado)
│ └── installer_output/ <- ControlRemotoMultimedia-Setup.exe (generado)
└── android-app/ <- app Android (Gradle)
├── gradlew.bat / gradlew
├── app/
│ └── build/outputs/apk/debug/ <- app-debug.apk (generado)
└── ...
Crea un entorno virtual con Python 3.12 e instala las dependencias:
cd "pc-service"
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install -r requirements.txt.\.venv\Scripts\python.exe -m remote_media_server.mainDeberías ver un ícono nuevo en la bandeja del sistema. Clic derecho → "Mostrar código de emparejamiento" para obtener el PIN y la IP que usará el celular.
.\.venv\Scripts\python.exe -m pip install pyinstaller
.\.venv\Scripts\python.exe -m PyInstaller packaging\build_exe.spec `
--distpath packaging\dist `
--workpath packaging\build `
--noconfirmEsto genera packaging\dist\ControlRemotoMultimedia.exe (un solo archivo, sin ventana de consola — los logs quedan en %APPDATA%\RemoteMediaControl\service.log).
cd packaging
& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer.issinstaller.iss define un asistente de instalación completo (Inno Setup, "modern wizard style") con:
- Pantalla de bienvenida.
- Página de aceptación de términos (
LicenseFile=license_installer.txt) — el usuario debe aceptar para continuar. - Página de selección de carpeta de instalación (por defecto
%LOCALAPPDATA%\Programs\Control Remoto Multimedia, sin requerir permisos de administrador; el usuario puede cambiarla). - Tareas opcionales marcables: iniciar automáticamente con Windows (activada por defecto, ya que el servicio está pensado para correr en segundo plano) y crear acceso directo en el escritorio.
- Acceso directo en el Menú Inicio + desinstalador registrado en "Agregar o quitar programas".
El resultado queda en packaging\installer_output\ControlRemotoMultimedia-Setup.exe.
Nota sobre SmartScreen/antivirus: el ejecutable no está firmado digitalmente (requiere un certificado de firma de código pagado). Es normal que Windows SmartScreen o el antivirus muestren una advertencia de "editor no reconocido" la primera vez — es esperable en software independiente sin firmar, no indica que el archivo esté dañado. Para continuar: "Más información" → "Ejecutar de todas formas".
Gradle necesita saber dónde está tu Android SDK. Cualquiera de estas dos opciones funciona:
- Opción A — variable de entorno (recomendada, no depende de un archivo local):
$env:ANDROID_SDK_ROOT = "$env:LOCALAPPDATA\Android\Sdk"
- Opción B — crea
android-app\local.properties(no se versiona en git) con:sdk.dir=C:/Users/TU_USUARIO/AppData/Local/Android/Sdk
Gradle también necesita un JDK 17+. Android Studio ya trae uno embebido (JBR):
$env:JAVA_HOME = "C:\Program Files\Android\Android Studio\jbr"El proyecto incluye el Gradle Wrapper (gradlew.bat), así que no hace falta instalar Gradle por separado:
cd "android-app"
.\gradlew.bat assembleDebugEsto descarga las dependencias (Compose, OkHttp, kotlinx.serialization, etc.) la primera vez y genera el APK.
Con el celular conectado por USB y la depuración USB activada (Ajustes → Opciones de desarrollador):
& "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe" install -r `
"app\build\outputs\apk\debug\app-debug.apk"Acepta el diálogo de autorización que aparece en el teléfono la primera vez.
⚠️ Las rutas de esta tabla son ubicaciones locales en tu disco (relativas a la carpeta del proyecto), no enlaces web. Estas carpetas están excluidas de git a propósito (ver.gitignoreen cada subproyecto) porque son artefactos generados — no existen en el repositorio ni en GitHub hasta que tú las subas manualmente (ver más abajo cómo publicarlas).
| Artefacto | Ruta dentro del proyecto | Qué es |
|---|---|---|
| Instalador de Windows | pc-service/packaging/installer_output/ControlRemotoMultimedia-Setup.exe |
El instalador con asistente (licencia, carpeta de instalación, inicio automático) — esto es lo que compartes/subes para que alguien instale el servicio de PC. |
| Ejecutable suelto | pc-service/packaging/dist/ControlRemotoMultimedia.exe |
El .exe sin empaquetar en instalador (por si prefieres distribuirlo como portable). |
| APK de Android | android-app/app/build/outputs/apk/debug/app-debug.apk |
El instalable para el celular. Firmado con la clave de debug de Android (válido para instalar directamente vía adb install o transfiriéndolo al teléfono; para publicarlo en Google Play se necesitaría además configurar una firma de release). |
Commitear binarios de ~10-30 MB directamente al repositorio no es buena práctica (infla el historial de git). La forma correcta es usar GitHub Releases, que están pensadas justo para esto:
- Sube el código (sin los binarios, ya excluidos por
.gitignore):git init git add . git commit -m "Version inicial" git branch -M main git remote add origin https://github.com/TU_USUARIO/Control-remoto.git git push -u origin main
- En GitHub, entra a tu repositorio → pestaña "Releases" → "Create a new release".
- Arrastra
ControlRemotoMultimedia-Setup.exeyapp-debug.apkal cuadro de "Attach binaries". - Publica el release. GitHub te dará ahí un enlace permanente y funcional para cada archivo (algo como
https://github.com/TU_USUARIO/Control-remoto/releases/download/v1.0.0/ControlRemotoMultimedia-Setup.exe), que sí puedes enlazar desde este README una vez lo tengas.
- Instala y abre el servicio en la PC (por el instalador o
ControlRemotoMultimedia.exedirecto). Aparecerá un ícono en la bandeja del sistema. - En el primer arranque, Windows puede preguntar si permitir la app en redes privadas — acepta, si no, el descubrimiento y la conexión no van a funcionar.
- Instala y abre la app en el Android.
- Empareja con la PC: en la PC, clic derecho en el ícono de la bandeja → "Vincular nuevo dispositivo" — aparece una ventana con un código QR. En el celular, toca "Escanear código QR" y apunta la cámara — conecta y empareja en un solo paso, sin escribir nada. Este paso solo se hace una vez — la app recuerda la conexión y reconecta sola en adelante.
- Si el QR no es una opción (sin cámara, PC sin monitor a mano, etc.), toca "Opciones avanzadas" en la pantalla de vinculación para desplegar la búsqueda automática por red y la entrada manual de IP + PIN.
- Reproduce algo (Spotify, VLC, Netflix/HBO/Paramount+, un video en el navegador) — la app pasa automáticamente a la pantalla de control, mostrando la plataforma detectada y los botones que esa sesión realmente soporta.
- Si hay más de un reproductor activo a la vez, desliza la pantalla hacia los lados para pasar de uno a otro.
- Toca "Mouse" en la parte superior para abrir el trackpad remoto: arrastra para mover el cursor de la PC, doble toque para hacer clic.
- Para administrar quién tiene acceso, clic derecho en la bandeja de la PC → "Dispositivos emparejados" — lista cada celular emparejado con un botón para revocarlo al instante. Y para un atajo rápido sin abrir el celular: doble clic directo en el ícono de la bandeja pausa/reanuda lo que esté sonando.
| Síntoma | Causa probable | Solución |
|---|---|---|
| La app Android no encuentra la PC | Firewall bloqueando el broadcast UDP, o están en redes Wi-Fi distintas | Acepta el permiso de firewall en la PC; en su defecto, ingresa la IP manualmente (la bandeja la muestra). |
winsdk falla al instalar (pip install) |
Estás usando una versión de Python distinta a 3.12 (no hay binario precompilado) | Usa exactamente py -3.12 al crear el entorno virtual. |
| Gradle no encuentra el SDK | Falta ANDROID_SDK_ROOT o local.properties |
Revisa la sección 5.1. |
| El instalador de Windows muestra advertencia de SmartScreen | El .exe no está firmado digitalmente |
Esperado en software sin firmar — "Más información" → "Ejecutar de todas formas". |
| Un botón de control no aparece para cierta plataforma (ej. adelantar/retroceder, siguiente capítulo) | Esa app/plataforma no expone esa acción al sistema operativo (limitación de Windows SMTC, no del proyecto) — confirmado incluso forzando el comando directamente, la app simplemente lo ignora | No hay solución posible desde este proyecto — la app solo muestra lo que la plataforma reporta soportar. |
| "Escanear código QR" pide acceso a la cámara y no escanea | Es el escáner del sistema (Google Play Services), no la app — puede tardar un momento en la primera vez que se usa en el dispositivo | Acepta el permiso de cámara si lo pide; si sigue sin funcionar, usa "Opciones avanzadas" para emparejar con IP manual + PIN. |
Este proyecto se distribuye bajo la licencia MIT.