script batch bat batch-file ffmpeg

batch file - batch - Divide en partes iguales y convierte muchos videos mp4 usando ffmpeg



batch script ffmpeg windows (1)

Tengo una tonelada de videos que necesito convertir de mp4 a wmv usando ffmpeg y dividir cada archivo en segmentos de 10 minutos, pero soy un newb de scripting total de cmd (de hecho, soy un newb de scripting :)

Después de pasar seis horas tratando de encontrar una respuesta, pensé que podría traérselo a ustedes.

El código que tengo está funcionando un poco, pero necesito poder leer los datos provenientes de la línea de comando y enviarlos nuevamente al script para su evaluación. No estoy seguro de qué código ffmpeg escupirá cuando termine de procesar un archivo de video (cuando la marca de tiempo llegue a su fin), pero este ciclo FOR sigue intentando crear nuevos segmentos de archivo aunque el video termine. Esto es lo que vi cuando intentó crear un nuevo archivo, así que creo que podría funcionar para buscar esto:

frame = 0 fps = 0.0 q = 0.0 Lsize = 1kB time = 00: 00: 00.00 bitrate = N / A

Este es el código que he propuesto hasta ahora (No te rías :)

@echo off setlocal ENABLEEXTENSIONS setlocal ENABLEDELAYEDEXPANSION for %%a in ("*.mp4") do ( set hour=00 for /L %%i IN (1,1,10) do ( :Beginning set /a start=%%i-1 set end=%%i if !start! lss 10 set start=!start!0 if !end! lss 10 set end=!end!0 ffmpeg -ss !hour!:!start!:00 -i "%%a" -b:v 1500k -vcodec msmpeg4 -acodec wmav2 -t !hour!:!end!:00 "Converted/%%~na-!hour!-!start!-!end!.wmv" if end==60 CALL :Increment ) ) :Increment set /a !hour!+1 set %%i=1 GOTO :Beginning pause

Basado en la lectura de este hilo , pensamos que algo así podría ir en el código, pero no estamos seguros de qué hacer con él:

set "dosstring=%*" echo.!dosstring!|findstr /C:"frame= 0 fps=0.0 q=0.0 Lsize= 1kB time=00:00:00.00 bitrate=N/A" >nul 2>&1

Muchas gracias por su ayuda!


Un método más eficiente es invocar ffmpeg una sola vez por archivo y usar su función de segmentación .

Los segmentos se numerarán secuencialmente, por lo que si necesita incluir marcas de tiempo en el nombre, también generaremos una lista de las marcas de tiempo del segmento en formato CSV:

tmp000.wmv,0.000000,60.281000 tmp001.wmv,60.281000,120.041000

Luego analízalo y cambia el nombre de los segmentos.

@echo off for %%a in (*.mp4) do ( ffmpeg -i "%%a" ^ -f segment -segment_time 10:00 -segment_list tmp.csv -reset_timestamps 1 ^ -b:v 1500k -vcodec msmpeg4 -acodec wmav2 converted/tmp%%03d.wmv setlocal enableDelayedExpansion for /f "delims=, tokens=1-3" %%b in (tmp.csv) do ( set sec=%%c & set sec=!sec:.*=! set /a hour="sec / 3600" set /a mins1="sec / 60 %% 60" & set mins1=0!mins1! set sec=%%d & set sec=!sec:.*=! set /a mins2="sec / 60 %% 60" & set mins2=0!mins2! ren "converted/%%b" "%%~na-!hour!-!mins1:~-2!-!mins2:~-2!.*" ) endlocal del tmp.csv ) pause

¡Este ejemplo no cambiará el nombre de los archivos ! en el nombre ya que no quería complicar demasiado el código para evitar este caso.