Diferencia entre revisiones de «Convertir MP4 a MP3»

De FSF
Sin resumen de edición
Sin resumen de edición
Línea 214: Línea 214:
echo ============================================================
echo ============================================================
echo CONVERSION TERMINADA
echo CONVERSION TERMINADA
echo ============================================================
echo.
echo Carpeta de salida:
echo "%DESTINO%"
echo.
echo Fecha final: %date%
echo Hora final:  %time%
echo ============================================================
echo FIN: %date% %time%>>"%LOG%"
echo ============================================================>>"%LOG%"
echo.
pause
endlocal
</pre>
== MP3 - Compacto ==
: {{a3|Convertir_MP4_a_MP3_WikiFSF_64MB.bat}}
----
<pre>
@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem ============================================================
rem CONVERTIDOR AUTOMATICO DE MP4 A MP3 PARA WIKIFSF
rem ============================================================
rem
rem Objetivo:
rem Crear archivos MP3 menores a 64 MB para poder subirlos a WikiFSF.
rem
rem MODO 1:
rem Arrastra uno o varios archivos MP4 encima de este BAT.
rem
rem MODO 2:
rem Si abres el BAT con doble clic, convierte todos los MP4 de:
rem E:\00_APP\00_YOUTUBE_Videos\Videos_Descargados
rem
rem Los MP3 se guardan en:
rem E:\00_APP\00_YOUTUBE_Videos\MP3_WikiFSF_64MB
rem
rem Estrategia:
rem 1. Calcula la duracion del audio con ffprobe.
rem 2. Elige un bitrate aproximado para quedar debajo de 60 MB.
rem 3. Convierte a MP3 mono.
rem 4. Verifica que el archivo pese menos de 64 MB.
rem 5. Si pesa mas, baja calidad y vuelve a intentar.
rem ============================================================
rem ============================================================
rem RUTAS PRINCIPALES
rem ============================================================
set "BASE=E:\00_APP\00_YOUTUBE_Videos"
set "FFMPEG=%BASE%\yt-dlp"
set "ORIGEN=%BASE%\Videos_Descargados"
set "DESTINO=%BASE%\MP3_WikiFSF_64MB"
set "LOG=%BASE%\registro_conversion_mp3_wikifsf.txt"
rem ============================================================
rem LIMITE DE TAMANO
rem ============================================================
rem 64 MB seguros para WikiFSF.
rem Se usa 64,000,000 bytes para dejar margen practico.
rem El calculo inicial apunta a 60,000,000 bytes.
set "LIMITE_BYTES=64000000"
set "OBJETIVO_BYTES=60000000"
rem ============================================================
rem CREAR CARPETA DE DESTINO
rem ============================================================
if not exist "%DESTINO%" (
    mkdir "%DESTINO%"
)
rem ============================================================
rem VERIFICAR FFMPEG
rem ============================================================
if not exist "%FFMPEG%\ffmpeg.exe" (
    echo.
    echo ============================================================
    echo ERROR: NO SE ENCONTRO FFMPEG
    echo ============================================================
    echo.
    echo Archivo esperado:
    echo "%FFMPEG%\ffmpeg.exe"
    echo.
    pause
    exit /b 1
)
if not exist "%FFMPEG%\ffprobe.exe" (
    echo.
    echo ============================================================
    echo ERROR: NO SE ENCONTRO FFPROBE
    echo ============================================================
    echo.
    echo Archivo esperado:
    echo "%FFMPEG%\ffprobe.exe"
    echo.
    pause
    exit /b 1
)
rem ============================================================
rem MOSTRAR INFORMACION
rem ============================================================
cls
echo ============================================================
echo        CONVERTIDOR MP4 A MP3 PARA WIKIFSF - 64 MB
echo ============================================================
echo.
echo FFmpeg:      %FFMPEG%\ffmpeg.exe
echo FFprobe:      %FFMPEG%\ffprobe.exe
echo Origen:      %ORIGEN%
echo Destino:      %DESTINO%
echo Limite:      64 MB maximo
echo Objetivo:    60 MB aprox. para margen de seguridad
echo Formato:      MP3 mono
echo.
echo Fecha: %date%
echo Hora:  %time%
echo.
echo ============================================================
echo.
rem ============================================================
rem REGISTRAR INICIO
rem ============================================================
echo.>>"%LOG%"
echo ============================================================>>"%LOG%"
echo INICIO: %date% %time%>>"%LOG%"
echo ORIGEN: %ORIGEN%>>"%LOG%"
echo DESTINO: %DESTINO%>>"%LOG%"
echo LIMITE_BYTES: %LIMITE_BYTES%>>"%LOG%"
echo OBJETIVO_BYTES: %OBJETIVO_BYTES%>>"%LOG%"
echo ============================================================>>"%LOG%"
rem ============================================================
rem MODO 1: ARCHIVOS ARRASTRADOS AL BAT
rem ============================================================
if not "%~1"=="" (
    echo Modo: archivos arrastrados al BAT
    echo.
    :loop_arrastrados
    if "%~1"=="" goto fin_conversion
    call :convertir "%~1"
    shift
    goto loop_arrastrados
)
rem ============================================================
rem MODO 2: CONVERTIR TODOS LOS MP4 DE LA CARPETA ORIGEN
rem ============================================================
echo Modo: convertir todos los MP4 de la carpeta origen
echo.
if not exist "%ORIGEN%\*.mp4" (
    echo.
    echo ============================================================
    echo NO SE ENCONTRARON ARCHIVOS MP4
    echo ============================================================
    echo.
    echo Carpeta revisada:
    echo "%ORIGEN%"
    echo.
    echo Tambien puedes arrastrar un MP4 encima de este BAT.
    echo.
    pause
    exit /b 0
)
for %%F in ("%ORIGEN%\*.mp4") do (
    call :convertir "%%~fF"
)
goto fin_conversion
rem ============================================================
rem FUNCION PRINCIPAL: CONVERTIR ARCHIVO
rem ============================================================
:convertir
set "ARCHIVO=%~1"
set "NOMBRE=%~n1"
set "SALIDA=%DESTINO%\%NOMBRE%_WikiFSF_64MB.mp3"
set "TEMP=%DESTINO%\%NOMBRE%_TEMP_WikiFSF.mp3"
set "OK=0"
echo ------------------------------------------------------------
echo Archivo:
echo "!ARCHIVO!"
echo.
echo ARCHIVO: "!ARCHIVO!">>"%LOG%"
if exist "!SALIDA!" (
    for %%S in ("!SALIDA!") do set "SIZE_EXISTE=%%~zS"
    if !SIZE_EXISTE! LEQ %LIMITE_BYTES% (
        echo Ya existe un MP3 valido menor a 64 MB. Se omite:
        echo "!SALIDA!"
        echo OMITIDO, YA EXISTE Y ES MENOR A 64 MB: "!SALIDA!">>"%LOG%"
        echo.
        exit /b 0
    ) else (
        echo Existe un MP3, pero pesa mas de 64 MB. Se reconstruira:
        echo "!SALIDA!"
        echo BORRANDO MP3 MAYOR A 64 MB: "!SALIDA!">>"%LOG%"
        del /q "!SALIDA!" >nul 2>nul
    )
)
rem ============================================================
rem OBTENER DURACION CON FFPROBE
rem ============================================================
set "DURACION="
for /f "usebackq tokens=*" %%D in (`"%FFMPEG%\ffprobe.exe" -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "!ARCHIVO!"`) do (
    set "DURACION=%%D"
)
if not defined DURACION (
    set "DURACION=0"
)
echo Duracion detectada: !DURACION! segundos
echo DURACION: !DURACION!>>"%LOG%"
rem ============================================================
rem CALCULAR BITRATE MAXIMO APROXIMADO
rem ============================================================
rem Formula aproximada:
rem bitrate_kbps = objetivo_bytes * 8 / 1000 / duracion_segundos
rem
rem Luego se elige una calidad de esta lista:
rem 128, 112, 96, 80, 64, 56, 48, 40, 32, 24, 16 kbps
rem ============================================================
set "MAXK=64"
for /f %%K in ('powershell -NoProfile -Command "$d=[double]::Parse('!DURACION!',[Globalization.CultureInfo]::InvariantCulture); if($d -le 0){64}else{[math]::Floor((%OBJETIVO_BYTES%*8/1000)/$d)}"') do (
    set "MAXK=%%K"
)
if not defined MAXK (
    set "MAXK=64"
)
set "STARTBIT=16"
for %%B in (128 112 96 80 64 56 48 40 32 24 16) do (
    if !MAXK! GEQ %%B (
        if "!STARTBIT!"=="16" (
            set "STARTBIT=%%B"
        )
    )
)
echo Bitrate maximo calculado: !MAXK! kbps
echo Bitrate inicial elegido:  !STARTBIT! kbps
echo MAXK: !MAXK!>>"%LOG%"
echo STARTBIT: !STARTBIT!>>"%LOG%"
echo.
rem ============================================================
rem INTENTOS DE CONVERSION
rem ============================================================
rem Inicia con el bitrate calculado.
rem Si el resultado pesa mas de 64 MB, baja de calidad.
rem ============================================================
for %%B in (128 112 96 80 64 56 48 40 32 24 16) do (
    if %%B LEQ !STARTBIT! (
        call :intentar_bitrate %%B
        if "!OK!"=="1" (
            goto conversion_exitosa
        )
    )
)
rem ============================================================
rem SI NINGUN INTENTO FUNCIONO
rem ============================================================
echo.
echo ============================================================
echo NO SE LOGRO CREAR UN MP3 MENOR A 64 MB
echo ============================================================
echo.
echo El archivo es demasiado largo incluso con calidad muy baja.
echo Recomendacion:
echo - Dividir el audio en partes.
echo - Usar OGG/OPUS si tu WikiFSF lo permite.
echo - Subirlo externo y enlazarlo.
echo.
echo ERROR: NO SE LOGRO MENOR A 64 MB: "!ARCHIVO!">>"%LOG%"
echo.
exit /b 0
rem ============================================================
rem CONVERSION EXITOSA
rem ============================================================
:conversion_exitosa
for %%S in ("!SALIDA!") do set "FINAL_SIZE=%%~zS"
set /a FINAL_MB=!FINAL_SIZE!/1048576
echo.
echo ============================================================
echo MP3 CREADO PARA WIKIFSF
echo ============================================================
echo.
echo Archivo:
echo "!SALIDA!"
echo.
echo Tamano final aproximado:
echo !FINAL_MB! MB
echo.
echo Estado:
echo LISTO PARA SUBIR A WIKIFSF
echo ============================================================
echo OK FINAL: "!SALIDA!">>"%LOG%"
echo TAMANO_FINAL_BYTES: !FINAL_SIZE!>>"%LOG%"
echo.
exit /b 0
rem ============================================================
rem FUNCION: INTENTAR CON UN BITRATE
rem ============================================================
:intentar_bitrate
set "BIT=%~1"
set "AR=44100"
if !BIT! LEQ 64 set "AR=32000"
if !BIT! LEQ 48 set "AR=22050"
if !BIT! LEQ 24 set "AR=16000"
set "OK=0"
if exist "!TEMP!" (
    del /q "!TEMP!" >nul 2>nul
)
echo Intentando conversion:
echo Bitrate: !BIT! kbps
echo Sample rate: !AR! Hz
echo.
echo INTENTO BITRATE: !BIT! kbps, AR: !AR!>>"%LOG%"
"%FFMPEG%\ffmpeg.exe" ^
-hide_banner ^
-y ^
-i "!ARCHIVO!" ^
-vn ^
-map 0:a:0 ^
-ac 1 ^
-ar !AR! ^
-codec:a libmp3lame ^
-b:a !BIT!k ^
"!TEMP!"
if errorlevel 1 (
    echo.
    echo ERROR: FFmpeg fallo con !BIT! kbps.
    echo ERROR FFMPEG CON BITRATE !BIT!>>"%LOG%"
    echo.
    set "OK=0"
    exit /b 0
)
if not exist "!TEMP!" (
    echo.
    echo ERROR: No se creo archivo temporal.
    echo ERROR: NO SE CREO TEMP>>"%LOG%"
    echo.
    set "OK=0"
    exit /b 0
)
for %%S in ("!TEMP!") do set "SIZE=%%~zS"
set /a SIZE_MB=!SIZE!/1048576
echo Tamano generado: !SIZE_MB! MB
echo SIZE_BYTES_BITRATE_!BIT!: !SIZE!>>"%LOG%"
if !SIZE! LEQ %LIMITE_BYTES% (
    move /y "!TEMP!" "!SALIDA!" >nul
    echo.
    echo Correcto. Archivo menor a 64 MB.
    echo BITRATE_FINAL: !BIT! kbps>>"%LOG%"
    echo.
    set "OK=1"
    exit /b 0
) else (
    echo.
    echo Todavia pesa mas de 64 MB. Bajando calidad...
    echo.
    del /q "!TEMP!" >nul 2>nul
    set "OK=0"
    exit /b 0
)
rem ============================================================
rem FINAL GENERAL
rem ============================================================
:fin_conversion
echo.
echo ============================================================
echo PROCESO TERMINADO
echo ============================================================
echo ============================================================
echo.
echo.

Revisión del 13:32 8 jul 2026

Convertidor de MP4 a MP3
complemento del script que baja videos de youtube

Programa BAT

Convertir_MP4_a_MP3.bat - - - Youtube Bajar Videos <<<--- complemento
@echo off
setlocal EnableExtensions

rem ============================================================
rem CONVERTIDOR AUTOMATICO DE MP4 A MP3
rem ============================================================
rem
rem Usa FFmpeg para extraer el audio de videos MP4
rem y convertirlo a MP3.
rem
rem MODO 1:
rem Arrastra uno o varios archivos MP4 encima de este BAT.
rem
rem MODO 2:
rem Si abres el BAT con doble clic, convierte todos los MP4 de:
rem E:\00_APP\00_YOUTUBE_Videos\Videos_Descargados
rem
rem Los MP3 se guardan en:
rem E:\00_APP\00_YOUTUBE_Videos\MP3_Convertidos
rem
rem Calidad:
rem MP3 VBR alta calidad para musica: -q:a 2
rem ============================================================


rem ============================================================
rem RUTAS PRINCIPALES
rem ============================================================

set "BASE=E:\00_APP\00_YOUTUBE_Videos"

set "FFMPEG=%BASE%\yt-dlp"

set "ORIGEN=%BASE%\Videos_Descargados"

set "DESTINO=%BASE%\MP3_Convertidos"

set "LOG=%BASE%\registro_conversion_mp3.txt"


rem ============================================================
rem CREAR CARPETA DE DESTINO
rem ============================================================

if not exist "%DESTINO%" (
    mkdir "%DESTINO%"
)


rem ============================================================
rem VERIFICAR FFMPEG
rem ============================================================

if not exist "%FFMPEG%\ffmpeg.exe" (
    echo.
    echo ============================================================
    echo ERROR: NO SE ENCONTRO FFMPEG
    echo ============================================================
    echo.
    echo Archivo esperado:
    echo "%FFMPEG%\ffmpeg.exe"
    echo.
    pause
    exit /b 1
)


rem ============================================================
rem MOSTRAR INFORMACION
rem ============================================================

cls

echo ============================================================
echo              CONVERTIDOR DE MP4 A MP3
echo ============================================================
echo.
echo FFmpeg:  %FFMPEG%\ffmpeg.exe
echo Origen:  %ORIGEN%
echo Destino: %DESTINO%
echo Calidad: MP3 VBR alta calidad para musica
echo.
echo Fecha: %date%
echo Hora:  %time%
echo.
echo ============================================================
echo.


rem ============================================================
rem REGISTRAR INICIO
rem ============================================================

echo.>>"%LOG%"
echo ============================================================>>"%LOG%"
echo INICIO: %date% %time%>>"%LOG%"
echo ORIGEN: %ORIGEN%>>"%LOG%"
echo DESTINO: %DESTINO%>>"%LOG%"
echo CALIDAD: MP3 VBR -q:a 2>>"%LOG%"
echo ============================================================>>"%LOG%"


rem ============================================================
rem MODO 1: ARCHIVOS ARRASTRADOS AL BAT
rem ============================================================

if not "%~1"=="" (
    echo Modo: archivos arrastrados al BAT
    echo.

    :loop_arrastrados
    if "%~1"=="" goto fin_conversion

    call :convertir "%~1"

    shift
    goto loop_arrastrados
)


rem ============================================================
rem MODO 2: CONVERTIR TODOS LOS MP4 DE LA CARPETA ORIGEN
rem ============================================================

echo Modo: convertir todos los MP4 de la carpeta origen
echo.

if not exist "%ORIGEN%\*.mp4" (
    echo.
    echo ============================================================
    echo NO SE ENCONTRARON ARCHIVOS MP4
    echo ============================================================
    echo.
    echo Carpeta revisada:
    echo "%ORIGEN%"
    echo.
    echo Puedes cambiar la ruta ORIGEN dentro de este BAT.
    echo.
    pause
    exit /b 0
)

for %%F in ("%ORIGEN%\*.mp4") do (
    call :convertir "%%~fF"
)

goto fin_conversion


rem ============================================================
rem FUNCION: CONVERTIR ARCHIVO
rem ============================================================

:convertir

set "ARCHIVO=%~1"
set "NOMBRE=%~n1"
set "SALIDA=%DESTINO%\%NOMBRE%.mp3"

echo ------------------------------------------------------------
echo Convirtiendo:
echo "%ARCHIVO%"
echo.

echo ARCHIVO: "%ARCHIVO%">>"%LOG%"

if exist "%SALIDA%" (
    echo Ya existe el MP3. Se omite:
    echo "%SALIDA%"
    echo OMITIDO, YA EXISTE: "%SALIDA%">>"%LOG%"
    echo.
    exit /b 0
)

"%FFMPEG%\ffmpeg.exe" ^
-hide_banner ^
-i "%ARCHIVO%" ^
-vn ^
-map 0:a:0 ^
-codec:a libmp3lame ^
-q:a 2 ^
"%SALIDA%"

if "%ERRORLEVEL%"=="0" (
    echo.
    echo MP3 creado correctamente:
    echo "%SALIDA%"
    echo OK: "%SALIDA%">>"%LOG%"
) else (
    echo.
    echo ERROR al convertir:
    echo "%ARCHIVO%"
    echo ERROR: "%ARCHIVO%">>"%LOG%"
)

echo.
exit /b 0


rem ============================================================
rem FINAL
rem ============================================================

:fin_conversion

echo.
echo ============================================================
echo CONVERSION TERMINADA
echo ============================================================
echo.
echo Carpeta de salida:
echo "%DESTINO%"
echo.
echo Fecha final: %date%
echo Hora final:  %time%
echo ============================================================

echo FIN: %date% %time%>>"%LOG%"
echo ============================================================>>"%LOG%"

echo.
pause

endlocal

MP3 - Compacto

Convertir_MP4_a_MP3_WikiFSF_64MB.bat

@echo off
setlocal EnableExtensions EnableDelayedExpansion

rem ============================================================
rem CONVERTIDOR AUTOMATICO DE MP4 A MP3 PARA WIKIFSF
rem ============================================================
rem
rem Objetivo:
rem Crear archivos MP3 menores a 64 MB para poder subirlos a WikiFSF.
rem
rem MODO 1:
rem Arrastra uno o varios archivos MP4 encima de este BAT.
rem
rem MODO 2:
rem Si abres el BAT con doble clic, convierte todos los MP4 de:
rem E:\00_APP\00_YOUTUBE_Videos\Videos_Descargados
rem
rem Los MP3 se guardan en:
rem E:\00_APP\00_YOUTUBE_Videos\MP3_WikiFSF_64MB
rem
rem Estrategia:
rem 1. Calcula la duracion del audio con ffprobe.
rem 2. Elige un bitrate aproximado para quedar debajo de 60 MB.
rem 3. Convierte a MP3 mono.
rem 4. Verifica que el archivo pese menos de 64 MB.
rem 5. Si pesa mas, baja calidad y vuelve a intentar.
rem ============================================================


rem ============================================================
rem RUTAS PRINCIPALES
rem ============================================================

set "BASE=E:\00_APP\00_YOUTUBE_Videos"

set "FFMPEG=%BASE%\yt-dlp"

set "ORIGEN=%BASE%\Videos_Descargados"

set "DESTINO=%BASE%\MP3_WikiFSF_64MB"

set "LOG=%BASE%\registro_conversion_mp3_wikifsf.txt"


rem ============================================================
rem LIMITE DE TAMANO
rem ============================================================
rem 64 MB seguros para WikiFSF.
rem Se usa 64,000,000 bytes para dejar margen practico.
rem El calculo inicial apunta a 60,000,000 bytes.

set "LIMITE_BYTES=64000000"
set "OBJETIVO_BYTES=60000000"


rem ============================================================
rem CREAR CARPETA DE DESTINO
rem ============================================================

if not exist "%DESTINO%" (
    mkdir "%DESTINO%"
)


rem ============================================================
rem VERIFICAR FFMPEG
rem ============================================================

if not exist "%FFMPEG%\ffmpeg.exe" (
    echo.
    echo ============================================================
    echo ERROR: NO SE ENCONTRO FFMPEG
    echo ============================================================
    echo.
    echo Archivo esperado:
    echo "%FFMPEG%\ffmpeg.exe"
    echo.
    pause
    exit /b 1
)

if not exist "%FFMPEG%\ffprobe.exe" (
    echo.
    echo ============================================================
    echo ERROR: NO SE ENCONTRO FFPROBE
    echo ============================================================
    echo.
    echo Archivo esperado:
    echo "%FFMPEG%\ffprobe.exe"
    echo.
    pause
    exit /b 1
)


rem ============================================================
rem MOSTRAR INFORMACION
rem ============================================================

cls

echo ============================================================
echo        CONVERTIDOR MP4 A MP3 PARA WIKIFSF - 64 MB
echo ============================================================
echo.
echo FFmpeg:       %FFMPEG%\ffmpeg.exe
echo FFprobe:      %FFMPEG%\ffprobe.exe
echo Origen:       %ORIGEN%
echo Destino:      %DESTINO%
echo Limite:       64 MB maximo
echo Objetivo:     60 MB aprox. para margen de seguridad
echo Formato:      MP3 mono
echo.
echo Fecha: %date%
echo Hora:  %time%
echo.
echo ============================================================
echo.


rem ============================================================
rem REGISTRAR INICIO
rem ============================================================

echo.>>"%LOG%"
echo ============================================================>>"%LOG%"
echo INICIO: %date% %time%>>"%LOG%"
echo ORIGEN: %ORIGEN%>>"%LOG%"
echo DESTINO: %DESTINO%>>"%LOG%"
echo LIMITE_BYTES: %LIMITE_BYTES%>>"%LOG%"
echo OBJETIVO_BYTES: %OBJETIVO_BYTES%>>"%LOG%"
echo ============================================================>>"%LOG%"


rem ============================================================
rem MODO 1: ARCHIVOS ARRASTRADOS AL BAT
rem ============================================================

if not "%~1"=="" (
    echo Modo: archivos arrastrados al BAT
    echo.

    :loop_arrastrados
    if "%~1"=="" goto fin_conversion

    call :convertir "%~1"

    shift
    goto loop_arrastrados
)


rem ============================================================
rem MODO 2: CONVERTIR TODOS LOS MP4 DE LA CARPETA ORIGEN
rem ============================================================

echo Modo: convertir todos los MP4 de la carpeta origen
echo.

if not exist "%ORIGEN%\*.mp4" (
    echo.
    echo ============================================================
    echo NO SE ENCONTRARON ARCHIVOS MP4
    echo ============================================================
    echo.
    echo Carpeta revisada:
    echo "%ORIGEN%"
    echo.
    echo Tambien puedes arrastrar un MP4 encima de este BAT.
    echo.
    pause
    exit /b 0
)

for %%F in ("%ORIGEN%\*.mp4") do (
    call :convertir "%%~fF"
)

goto fin_conversion


rem ============================================================
rem FUNCION PRINCIPAL: CONVERTIR ARCHIVO
rem ============================================================

:convertir

set "ARCHIVO=%~1"
set "NOMBRE=%~n1"
set "SALIDA=%DESTINO%\%NOMBRE%_WikiFSF_64MB.mp3"
set "TEMP=%DESTINO%\%NOMBRE%_TEMP_WikiFSF.mp3"
set "OK=0"

echo ------------------------------------------------------------
echo Archivo:
echo "!ARCHIVO!"
echo.

echo ARCHIVO: "!ARCHIVO!">>"%LOG%"

if exist "!SALIDA!" (
    for %%S in ("!SALIDA!") do set "SIZE_EXISTE=%%~zS"

    if !SIZE_EXISTE! LEQ %LIMITE_BYTES% (
        echo Ya existe un MP3 valido menor a 64 MB. Se omite:
        echo "!SALIDA!"
        echo OMITIDO, YA EXISTE Y ES MENOR A 64 MB: "!SALIDA!">>"%LOG%"
        echo.
        exit /b 0
    ) else (
        echo Existe un MP3, pero pesa mas de 64 MB. Se reconstruira:
        echo "!SALIDA!"
        echo BORRANDO MP3 MAYOR A 64 MB: "!SALIDA!">>"%LOG%"
        del /q "!SALIDA!" >nul 2>nul
    )
)


rem ============================================================
rem OBTENER DURACION CON FFPROBE
rem ============================================================

set "DURACION="

for /f "usebackq tokens=*" %%D in (`"%FFMPEG%\ffprobe.exe" -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "!ARCHIVO!"`) do (
    set "DURACION=%%D"
)

if not defined DURACION (
    set "DURACION=0"
)

echo Duracion detectada: !DURACION! segundos
echo DURACION: !DURACION!>>"%LOG%"


rem ============================================================
rem CALCULAR BITRATE MAXIMO APROXIMADO
rem ============================================================
rem Formula aproximada:
rem bitrate_kbps = objetivo_bytes * 8 / 1000 / duracion_segundos
rem
rem Luego se elige una calidad de esta lista:
rem 128, 112, 96, 80, 64, 56, 48, 40, 32, 24, 16 kbps
rem ============================================================

set "MAXK=64"

for /f %%K in ('powershell -NoProfile -Command "$d=[double]::Parse('!DURACION!',[Globalization.CultureInfo]::InvariantCulture); if($d -le 0){64}else{[math]::Floor((%OBJETIVO_BYTES%*8/1000)/$d)}"') do (
    set "MAXK=%%K"
)

if not defined MAXK (
    set "MAXK=64"
)

set "STARTBIT=16"

for %%B in (128 112 96 80 64 56 48 40 32 24 16) do (
    if !MAXK! GEQ %%B (
        if "!STARTBIT!"=="16" (
            set "STARTBIT=%%B"
        )
    )
)

echo Bitrate maximo calculado: !MAXK! kbps
echo Bitrate inicial elegido:   !STARTBIT! kbps
echo MAXK: !MAXK!>>"%LOG%"
echo STARTBIT: !STARTBIT!>>"%LOG%"
echo.


rem ============================================================
rem INTENTOS DE CONVERSION
rem ============================================================
rem Inicia con el bitrate calculado.
rem Si el resultado pesa mas de 64 MB, baja de calidad.
rem ============================================================

for %%B in (128 112 96 80 64 56 48 40 32 24 16) do (
    if %%B LEQ !STARTBIT! (
        call :intentar_bitrate %%B

        if "!OK!"=="1" (
            goto conversion_exitosa
        )
    )
)


rem ============================================================
rem SI NINGUN INTENTO FUNCIONO
rem ============================================================

echo.
echo ============================================================
echo NO SE LOGRO CREAR UN MP3 MENOR A 64 MB
echo ============================================================
echo.
echo El archivo es demasiado largo incluso con calidad muy baja.
echo Recomendacion:
echo - Dividir el audio en partes.
echo - Usar OGG/OPUS si tu WikiFSF lo permite.
echo - Subirlo externo y enlazarlo.
echo.
echo ERROR: NO SE LOGRO MENOR A 64 MB: "!ARCHIVO!">>"%LOG%"
echo.

exit /b 0


rem ============================================================
rem CONVERSION EXITOSA
rem ============================================================

:conversion_exitosa

for %%S in ("!SALIDA!") do set "FINAL_SIZE=%%~zS"
set /a FINAL_MB=!FINAL_SIZE!/1048576

echo.
echo ============================================================
echo MP3 CREADO PARA WIKIFSF
echo ============================================================
echo.
echo Archivo:
echo "!SALIDA!"
echo.
echo Tamano final aproximado:
echo !FINAL_MB! MB
echo.
echo Estado:
echo LISTO PARA SUBIR A WIKIFSF
echo ============================================================

echo OK FINAL: "!SALIDA!">>"%LOG%"
echo TAMANO_FINAL_BYTES: !FINAL_SIZE!>>"%LOG%"
echo.

exit /b 0


rem ============================================================
rem FUNCION: INTENTAR CON UN BITRATE
rem ============================================================

:intentar_bitrate

set "BIT=%~1"
set "AR=44100"

if !BIT! LEQ 64 set "AR=32000"
if !BIT! LEQ 48 set "AR=22050"
if !BIT! LEQ 24 set "AR=16000"

set "OK=0"

if exist "!TEMP!" (
    del /q "!TEMP!" >nul 2>nul
)

echo Intentando conversion:
echo Bitrate: !BIT! kbps
echo Sample rate: !AR! Hz
echo.

echo INTENTO BITRATE: !BIT! kbps, AR: !AR!>>"%LOG%"

"%FFMPEG%\ffmpeg.exe" ^
-hide_banner ^
-y ^
-i "!ARCHIVO!" ^
-vn ^
-map 0:a:0 ^
-ac 1 ^
-ar !AR! ^
-codec:a libmp3lame ^
-b:a !BIT!k ^
"!TEMP!"

if errorlevel 1 (
    echo.
    echo ERROR: FFmpeg fallo con !BIT! kbps.
    echo ERROR FFMPEG CON BITRATE !BIT!>>"%LOG%"
    echo.
    set "OK=0"
    exit /b 0
)

if not exist "!TEMP!" (
    echo.
    echo ERROR: No se creo archivo temporal.
    echo ERROR: NO SE CREO TEMP>>"%LOG%"
    echo.
    set "OK=0"
    exit /b 0
)

for %%S in ("!TEMP!") do set "SIZE=%%~zS"
set /a SIZE_MB=!SIZE!/1048576

echo Tamano generado: !SIZE_MB! MB
echo SIZE_BYTES_BITRATE_!BIT!: !SIZE!>>"%LOG%"

if !SIZE! LEQ %LIMITE_BYTES% (
    move /y "!TEMP!" "!SALIDA!" >nul
    echo.
    echo Correcto. Archivo menor a 64 MB.
    echo BITRATE_FINAL: !BIT! kbps>>"%LOG%"
    echo.
    set "OK=1"
    exit /b 0
) else (
    echo.
    echo Todavia pesa mas de 64 MB. Bajando calidad...
    echo.
    del /q "!TEMP!" >nul 2>nul
    set "OK=0"
    exit /b 0
)


rem ============================================================
rem FINAL GENERAL
rem ============================================================

:fin_conversion

echo.
echo ============================================================
echo PROCESO TERMINADO
echo ============================================================
echo.
echo Carpeta de salida:
echo "%DESTINO%"
echo.
echo Fecha final: %date%
echo Hora final:  %time%
echo ============================================================

echo FIN: %date% %time%>>"%LOG%"
echo ============================================================>>"%LOG%"

echo.
pause

endlocal