Lote comprima arquivos .avi com ffmpeg que contenham a data anterior em seu nome

1

estou tentando gerenciar imagens de CCTV, e estou tentando compactar em lote com ffmpeg

Até agora consegui criar este comando

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

Mas preciso fazer tudo de uma vez, mas excluir a data atual

Então, se hoje é 16.05, na minha pasta eu tenho

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

E assim por diante

Eu só preciso converter os que contêm 0515, e todos os dias esse número deve ser incrementado, então em 17.05 eu precisarei converter todos os arquivos com 0516 neles.

Por vezes, existem ficheiros que terão _1 , como "0515 180004_1.mp4"

(O 004 no final é sempre lá)

E eu também preciso dele para produzir com o mesmo nome.

Eu vejo algo assim

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

Eu entendo que isso não funcionará, mas vamos chamá-lo de meu pseudo código

Você tem alguma idéia de como eu posso realizar minha tarefa?

Ah e estou usando o Windows 7 x64

Além disso, se você tiver alguma sugestão sobre o ffmpeg, parte disso será muito feliz em ajustar meu código

    
por AudioTroubler 16.05.2016 / 12:40

2 respostas

0

Terminou com isso

Se alguém tiver sugestões de otimização de código, ficará muito satisfeito em incorporá-las

Obtém a data de ontem no MMdd - > seleciona todos os arquivos que começam com isso - > comprime-os usando o ffmpeg - > move-se para outra pasta que está a acumular no mês - > exclui as fontes fules

$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}
    
por 16.05.2016 / 15:22
1

Agradeço sua pergunta porque você afirmou "Você tem alguma ideia de como eu posso realizar minha tarefa?" e você não pediu uma redação de código. Eu acho que você quer aprender. Então esta resposta.

  • Foque no que é a Chave , algo que é único e permite que você selecione apenas os itens sobre os quais você deve operar. Neste caso, você acabou de dizer os primeiros quatro caracteres no nome dos arquivos no diretório atual. Bom.
    Bom ainda mais porque eles têm o mesmo comprimento, se é o primeiro de Jen. ou 31 de dezembro (mesmo se você não for forçado a usá-lo.

Agora você pode escrever seu script em lote passo a passo:

  1. Crie as sequências para ontem e amanhã [ d1 , d2 , d3 ...] .

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

    Note que você tem que modificar aqui acima para o formato e nome da variável, você precisa amanhã também.

  2. Selecione todos os arquivos que correspondem à sequência de caracteres de ontem. (Variável For e Yesterday)

  3. Para cada [ 2 ] deles substituem (deixe o script fazer) a sub-string de ontem com a sub-string de amanhã, em uma variável com um novo nome [1 ] . Não esqueça de mudar mesmo .mp4 com .avi ...
  4. Produza a string que você construiu.
  5. Depois disso, você tem certeza sobre o seu programa, modifique a linha de saída com o ffmpeg.

Agora você só precisa pesquisar cada etapa e adaptar os comandos relativos ...

PS > Em uma segunda vez você pode aprimorar seu script com a verificação da existência do arquivo de saída (você não sobrescreverá se existir), com o número de arquivos processados, com a saída boa ou ruim do seu script ... Em um segundo Tempo.

    
por 16.05.2016 / 13:39