Close

Cambios para carga de videos más rápido.

A project log for THE ULTIMATE MINI ARCADE

Classic arcade with all the latest technological advancements, ready for the classics. Enjoy!

srrubioSrRubio 09/01/2025 at 06:070 Comments

A) Cambiar el .BAT para enviar en PARALELO (misma info a ambas RPis)

Qué hace

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

3) Red (si usa Wi-Fi)

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


Resumen operativo (paso a paso)

  1. Sustituye :SEND_ALL por la versión en paralelo (sección A).

  2. Reinicia tu .bat y prueba: al cambiar juego/sistema, ambas pantallas deberían cambiar a la vez (diferencia ~indetectable).

  3. 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).

  4. 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

Discussions