Comprime por lotes archivos .avi con ffmpeg que contienen la fecha anterior en su nombre

Comprime por lotes archivos .avi con ffmpeg que contienen la fecha anterior en su nombre

Estoy tratando de administrar imágenes de CCTV y estoy intentando comprimirlas por lotes con ffmpeg.

Hasta ahora logré crear este comando.

ffmpeg -i "0515 210004.mp4" -b 200000  output.avi

Pero necesito hacerlos todos a la vez,peroexcluir la fecha actual

Entonces, si hoy es el 16.05, en mi carpeta tengo

"0515 210004.mp4"
"0515 220004.mp4"
"0515 230004.mp4"
"0516 000004.mp4"
"0516 010004.mp4"

Etcétera

Solo necesito convertir aquellos que contienen 0515, y todos los días ese número debería incrementarse, por lo que el 17.05 lo necesitaré para convertir todos los archivos que contengan 0516.

A veces también hay archivos que tendrán_1en ellos, como "0515 180004_1.mp4"

(El 004 al final essiempreallá)

Y también necesito que lo genere exactamente con el mismo nombre.

veo algo como esto

for %%A IN (*.mp4) DO ffmpeg -i "contains "%date% - 1day"" -b 200000 "oldfilename.avi"

Entiendo que esto no funcionará, pero llamémoslo mi pseudocódigo.

¿Tiene alguna idea de cómo puedo realizar mi tarea?

Ah, y estoy usando Windows 7 x64.

Además, si tiene alguna sugerencia sobre ffmpeg, estaré encantado de ajustar mi código.

Respuesta1

Agradezco tu pregunta porque dijiste"¿Tiene alguna idea de cómo puedo realizar mi tarea?"y no pediste escribir un código. Supongo que quieres aprender. Entonces esta respuesta.

  • Centrarse en cuál es elLlave, algo que es único y te permite seleccionar sólo los elementos sobre los que tienes que operar. En este caso acabas de decirprimeros cuatro caracteres del nombrede los archivos en el directorio actual. Bien.
    Bueno aún más porque tienen el mismo largo si es el 1º de Jen. o 31 de diciembre (aunque no estés obligado a utilizarlo).

Ahora puedes escribir tu script por lotes paso a paso:

  1. Construye las cuerdas para ayer y mañana [d1,d2,d3...] .

    $date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd')
    

    Tenga en cuenta que debe modificar aquí arriba el formato y el nombre de la variable; también lo necesitará mañana.

  2. Seleccione todos los archivos que coincidan con la cadena de ayer. (Para y ayer variable)

  3. Para cada [2] de ellos sustituyen (deja que el script lo haga) la subcadena de ayer con la subcadena de mañana, en una variable con un nuevo nombre [1] . No olvides cambiar incluso .mp4con .avi
  4. Genere la cadena que construyó.
  5. Después de que esté seguro de su programa, modifique la línea de salida con la de ffmpeg.

Ahora sólo tienes que buscar cada paso y adaptar los comandos correspondientes...

PD> En una segunda vez puedes mejorar tu script verificando la existencia del archivo de salida (no sobrescribirás si existe), con el número de archivos procesados, con la buena o mala salida de tu script... En por segunda vez.

Respuesta2

terminé con esto

Si alguien tiene sugerencias de optimización de código, estará encantado de incorporarlas.

Obtiene la fecha de ayer en MMdd -> selecciona todos los archivos que comienzan con eso -> los comprime usando ffmpeg -> se mueve a otra carpeta según el mes -> elimina los archivos fuente

$a = (get-date).AddDays(-1).ToString("MMMM")
$d = (get-date).AddDays(-1).ToString("MMdd")
$inProcessPath = "sourcepath"
$oldVideos = Get-ChildItem -Include @("$d *") -Path $inProcessPath -Recurse;

Set-Location -Path 'D:\ffmpeg\bin';

foreach ($oldVideo in $oldVideos) {
    $newVideo = [io.path]::ChangeExtension($oldVideo.FullName, '.avi')


    $ArgumentList = '-i "{0}" -b 200000 "{1}"' -f $oldVideo, $newVideo;


    Start-Process -FilePath "D:\ffmpeg\bin\ffmpeg.exe" -ArgumentList $ArgumentList -Wait -NoNewWindow;
}

Robocopy D:\Main\AdWords\ffmpeg\bin\ntv "D:\path\$a" "$d *.avi" /mov
get-childitem "sourcepath" -include "$d *.mp4" -recurse | foreach ($_) {remove-item $_.fullname}

información relacionada