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.