A) Cambiar el .BAT para enviar en PARALELO (misma info a ambas RPis)
Qué hace
-
Genera un archivo temporal con el mensaje y lanza dos
ncaten paralelo (uno por IP) leyendo desde ese archivo. -
Así quitas el “micro-retardo” de la conexión TCP secuencial.
Sustituir SOLO la subrutina :SEND_ALL (lo demás igual)
Pega esto reemplazando tu :SEND_ALL actual:
REM ============================================ REM Subrutina: enviar a TODAS las RPi en paralelo REM Uso: call :SEND_ALL "mensaje" REM ============================================ :SEND_ALL setlocal EnableDelayedExpansion set "MSG=%~1" REM Archivo temporal con el mensaje (evita líos de comillas/pipes en START) set "TMPMSG=%TEMP%\marquee_msg.txt" > "!TMPMSG!" echo !MSG! for %%I in (%RPI_IPS%) do ( echo [%time%] -> %%I:%RPI_PORT% :: !MSG! >> "%LOG%" REM Lanzamos cada envío en paralelo (sin bloquear) start "" /b "%NCAT_EXE%" %%I %RPI_PORT% -w 1 < "!TMPMSG!" ) REM Nota: no borramos TMPMSG para evitar carrera con procesos en vuelo endlocal goto :eof
Si quieres limpiar el archivo temporal, puedes añadir un borrado con retardo al final (p.ej.timeout /t 2 >nul & del /q "!TMPMSG!"), pero no es necesario.
B) Acelerar la carga de vídeos en la RPi “lenta”
Aplica en ambas para homogeneidad (así reaccionan igual), pero está orientado a la nueva que notas más perezosa.
1) mpv: buffers y decodificación por hardware
/etc/mpv/mpv.conf (o el mpv.conf que estés usando para la marquesina):
# RENDIMIENTO / ARRANQUE RÁPIDO hwdec=auto-safe vo=gpu gpu-context=drm profile=gpu-hq cache=yes demuxer-readahead-secs=5 demuxer-max-bytes=128MiB prefetch-playlist=yes hr-seek=yes reset-on-next-file=no # TU AJUSTE DE PANTALLA keepaspect=no fs=yes no-audio loop-file=inf
Clave:cache=yes,demuxer-readahead-secs,demuxer-max-bytes→ el vídeo arranca antes y con menos tirones.
Asegúrate de que tu servicio mpv (el que usamos para la marquesina) no mata mpv por cada cambio, sino que usamos IPC loadfile … replace (ya lo tenías).
2) Almacenamiento / FS
-
Si los vídeos están en microSD, usa marca decente y formatea en ext4.
-
Si es USB, ext4 y monta con
noatime. Ejemplo en/etc/fstab:UUID=XXXX-XXXX /home/arcade/media ext4 defaults,noatime 0 2
-
Evita NTFS/ExFAT en la RPi para reproducción continua.
3) Red (si usa Wi-Fi)
-
Pásala a Ethernet si puedes. Si no:
-
Desactiva powersave:
sudo iw dev wlan0 set power_save off
-
Asegura canal estable en el router (5 GHz preferible), y señal fuerte.
-
C) (Opcional pero muy efectivo) Re-codificar tus vídeos para “abrir” más rápido
Si alguno va pesado, pasa a H.264 “ligero”, 30 fps, GOP corto (clave para “start rápido”):
Windows .bat dentro de la carpeta con los .mp4:
@echo off set "FFMPEG=ffmpeg" if not exist "out" mkdir "out" for %%F in (*.mp4) do ( echo Transcodificando: %%F "%FFMPEG%" -y -i "%%F" ^ -vf "scale='min(720,iw)':'min(1024,ih)':force_original_aspect_ratio=decrease,format=yuv420p,fps=30" ^ -c:v libx264 -preset veryfast -crf 20 -pix_fmt yuv420p ^ -x264-params keyint=60:min-keyint=60:scenecut=0 ^ -movflags +faststart -an ^ "out\%%~nF_arc.mp4" ) echo Listo. pause
-
Mantienes resolución razonable (≤720×1024), 30 fps, keyint=60 (clave cada 2 s) → seek/arranque instantáneo.
-
-movflags +faststartadelanta el moov atom (mejor primer frame).
Resumen operativo (paso a paso)
-
Sustituye
:SEND_ALLpor la versión en paralelo (sección A). -
Reinicia tu .bat y prueba: al cambiar juego/sistema, ambas pantallas deberían cambiar a la vez (diferencia ~indetectable).
-
En la RPi que notas lenta:
-
Añade/ajusta mpv.conf (sección B.1) y reinicia su servicio de marquesina.
-
Revisa el FS (B.2) y la red (B.3).
-
-
Si aún notas lentitud en esos vídeos concretos, re-codifícalos con el script (C).
Si quieres, te preparo un checklist para verificar que tu servicio marquee-mpv.service está usando esas opciones (y que el script de IPC hace loadfile ... replace sin relanzar mpv).
Tú dijiste:
Este es el bat actual. Corrige los cambios y así copio y pego
ChatGPT Plus
¡Listo! Te dejo tu .BAT completo con los cambios mínimos para enviar en paralelo a ambas RPi (192.168.1.138 y 192.168.1.145). Copia y pega tal cual.
@echo off
title RetroBat_MarqueeMonitor
setlocal enabledelayedexpansion
REM ================== CONFIG ==================
set "ESEVENT_FILE=C:\RetroBat\plugins\MarqueeManager\ESEvent.arg"
set "NCAT_EXE=C:\Program Files (x86)\Nmap\ncat.exe"
REM Lista de RPis destino (separadas por espacio)
set "RPI_IPS=192.168.1.138 192.168.1.145"
set "RPI_PORT=12345"
set "LOG=C:\temp\marquee_debug.log"
REM Separador que entiende la RPi (mejor ":" para evitar problemas de pipe en CMD)
set "SEPARATOR=:"
REM ============================================
if not exist "C:\temp" mkdir "C:\temp"
REM === Comprobación básica de ncat ===
if not exist "%NCAT_EXE%" ( echo [%date% %time%] ERROR: No se encuentra "%NCAT_EXE%". >> "%LOG%" echo ERROR: No se encuentra "%NCAT_EXE%". echo Instala Nmap o corrige la ruta y vuelve a ejecutar. goto :EOF
)
set "LAST_ROM="
set "LAST_SYS="
set "LAST_COMBO="
set "CURRENT_SYSTEM="
set "INITIALIZED=0"
echo Iniciando monitor inteligente de selección (sistema + juegos)...
echo ---------------------------------------------------------------
:loop
timeout /t 1 >nul
if not exist "%ESEVENT_FILE%" goto loop
REM === Tomar la ULTIMA línea del archivo ===
set "LINE="
for /f "usebackq delims=" %%A in ("%ESEVENT_FILE%") do ( set "LINE=%%A"
)
REM =======================
REM 1) EVENTO DE JUEGO
REM =======================
echo !LINE! | findstr /I "event=game-selected" >nul
if not errorlevel 1 ( REM Extraer param2 (ruta ROM) -> 3er token separado por & for /f "tokens=3 delims=&" %%a in ("!LINE!") do ( set "ROM_PATH=%%~a" ) REM Limpiar comillas y normalizar separadores set "ROM_PATH=!ROM_PATH:"=!" set "ROM_PATH=!ROM_PATH:/=\!"
REM Nombre base sin extensión (ENTRE COMILLAS para conservar espacios/paréntesis) for %%F in ("!ROM_PATH!") do ( set "ROM_NAME=%%~nF" )
REM Si no tenemos CURRENT_SYSTEM aún, usar el último sistema conocido if "!CURRENT_SYSTEM!"=="" if not "!LAST_SYS!"=="" set "CURRENT_SYSTEM=!LAST_SYS!"
REM Intento extra: si sigue vacío, intentar sacar param1=<sistema> de esta misma línea if "!CURRENT_SYSTEM!"=="" ( set "P1TMP=" for /f "tokens=1-10 delims=&" %%i in ("!LINE!") do ( for %%t in (%%i %%j %%k %%l %%m %%n %%o %%p %%q %%r) do ( echo %%t | findstr /I /B "param1=" >nul && set "P1TMP=%%t" ) ) if defined P1TMP ( for /f "tokens=2 delims==" %%u in ("!P1TMP!") do set "CURRENT_SYSTEM=%%~u" REM limpiar comillas/espacios iniciales set "CURRENT_SYSTEM=!CURRENT_SYSTEM:"=!" for /f "tokens=* delims= " %%z in ("!CURRENT_SYSTEM!") do set "CURRENT_SYSTEM=%%z" ) )
REM Debug echo [%time%] Juego detectado: ROM="!ROM_NAME!" SYS="!CURRENT_SYSTEM!" >> "%LOG%"
REM Inicialización: no enviamos el primer evento para evitar repeticiones en arranque if "!INITIALIZED!"=="0" ( set "LAST_ROM=!ROM_NAME!" if not "!CURRENT_SYSTEM!"=="" set "LAST_SYS=!CURRENT_SYSTEM!" set "LAST_COMBO=!CURRENT_SYSTEM!!SEPARATOR!!ROM_NAME!" set "INITIALIZED=1" echo [%time%] Inicializado con COMBO: !LAST_COMBO! >> "%LOG%" goto loop )
if "!ROM_NAME!"=="" goto loop if "!CURRENT_SYSTEM!"=="" ( echo [%time%] Aviso: sin sistema resuelto para la ROM "!ROM_NAME!", no se envía. >> "%LOG%" goto loop )
set "COMBO=!CURRENT_SYSTEM!!SEPARATOR!!ROM_NAME!" if /I "!COMBO!"=="!LAST_COMBO!" goto loop
echo [%time%] Enviando COMBO !COMBO! a las RPis... >> "%LOG%" call :SEND_ALL "!COMBO!"
set "LAST_ROM=!ROM_NAME!" set "LAST_SYS=!CURRENT_SYSTEM!" set "LAST_COMBO=!COMBO!" goto loop
)
REM =======================
REM 2) EVENTO DE SISTEMA
REM (admite system-selected y system-changed)
REM =======================
echo !LINE! | findstr /I "event=system-selected event=system-changed" >nul
if not errorlevel 1 ( REM param1="nombre_del_sistema" -> 2º token separado por & for /f "tokens=2 delims=&" %%a in ("!LINE!") do ( set "SYS_KV=%%~a" ) for /f "tokens=2 delims==" %%b in ("!SYS_KV!") do ( set "SYSTEM_RAW=%%~b" ) REM Quitar comillas y recortar espacios iniciales set "SYSTEM=!SYSTEM_RAW:"=!" for /f "tokens=* delims= " %%z in ("!SYSTEM!") do set "SYSTEM=%%z"
REM Debug echo [%time%] Sistema detectado: "!SYSTEM!" >> "%LOG%"
if "!INITIALIZED!"=="0" ( set "CURRENT_SYSTEM=!SYSTEM!" set "LAST_SYS=!SYSTEM!" set "INITIALIZED=1" echo [%time%] Inicializado con SISTEMA: !SYSTEM! >> "%LOG%" goto loop )
if "!SYSTEM!"=="" goto loop if /I "!SYSTEM!"=="!LAST_SYS!" goto loop
echo [%time%] Enviando SISTEMA !SYSTEM! a las RPis... >> "%LOG%" call :SEND_ALL "!SYSTEM!"
set "CURRENT_SYSTEM=!SYSTEM!" set "LAST_SYS=!SYSTEM!" REM opcional: resetea combo al cambiar de sistema set "LAST_COMBO=" goto loop
)
goto loop
REM ============================================
REM Subrutina: enviar a TODAS las RPi en paralelo
REM Uso: call :SEND_ALL "mensaje"
REM ============================================
:SEND_ALL
setlocal EnableDelayedExpansion
set "MSG=%~1"
REM Guardamos el mensaje en un archivo temporal para que START pueda redirigirlo
set "TMPMSG=%TEMP%\marquee_msg.txt"
> "!TMPMSG!" echo !MSG!
for %%I in (%RPI_IPS%) do ( echo [%time%] -> %%I:%RPI_PORT% :: !MSG! >> "%LOG%" REM Lanzamos cada envío en paralelo (sin bloquear). Timeout corto (-w 1) start "" /b "%NCAT_EXE%" %%I %RPI_PORT% -w 1 < "!TMPMSG!"
)
REM Nota: no borramos TMPMSG inmediatamente para evitar carrera con procesos en vuelo.
endlocal
goto :eof
SrRubio
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.