
estou tentando gerenciar imagens de CCTV e tentando compactá-las em lote com ffmpeg
Até agora consegui criar este comando
ffmpeg -i "0515 210004.mp4" -b 200000 output.avi
Mas eu preciso fazer tudo de uma vez,masexcluir a data atual
Então, se hoje é 16h05, 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 aqueles que contêm 0515, e todos os dias esse número deve aumentar, então no dia 17.05 precisarei dele para converter todos os arquivos com 0516.
Às vezes também há arquivos que terão_1neles, como "0515 180004_1.mp4"
(O 004 no final ésemprelá)
E também preciso que ele seja exibido exatamente 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 vai funcionar, mas vamos chamá-lo de meu pseudocódigo
Você tem alguma idéia de como posso realizar minha tarefa?
Ah, e estou usando o Windows 7 x64
Além disso, se você tiver alguma sugestão sobre parte do ffmpeg, ficarei muito feliz em ajustar meu código
Responder1
Agradeço sua pergunta porque você declarou"Você tem alguma idéia de como posso realizar minha tarefa?"e você não pediu a escrita do código. Eu acho que você quer aprender. Então esta resposta.
- Concentre-se em qual é oChave, algo que é único e permite selecionar apenas os itens sobre os quais você deve operar. Neste caso você acabou de dizer oprimeiros quatro caracteres do nomedos arquivos no diretório atual. Bom.
Bom ainda mais porque eles têm o mesmo comprimento se for o 1º da Jen. ou 31 de dezembro (mesmo que você não seja obrigado a usá-lo.
Agora você pode escrever seu script em lote passo a passo:
Construa as cordas para ontem e amanhã [d1,d2,d3...] .
$date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd')
Observe que você deve modificar aqui acima o formato e o nome da variável, você também precisará de amanhã.
Selecione todos os arquivos que correspondem à sequência de ontem. (variável Para e Ontem)
- Para cada [2] deles substituem (deixe o script fazer isso) a substring de ontem pela substring de amanhã, em uma variável com um novo nome [1] . Não se esqueça de mudar mesmo
.mp4
com.avi
... - Produza a string que você construiu.
- Depois de ter certeza do seu programa, modifique a linha de saída com a do ffmpeg.
Agora você só precisa pesquisar cada etapa e adaptar os comandos relativos...
PS> Em um segundo momento você pode aprimorar seu script verificando a existência do arquivo de saída (você não irá sobrescrever se ele existir), com o número do arquivo processado, com a saída boa ou ruim do seu script... Em uma segunda vez.
Responder2
Acabou com isso
Se alguém tiver sugestões de otimização de código, ficará muito feliz em incorporá-las
Obtém a data de ontem no MMdd -> seleciona todos os arquivos que começam com isso -> compacta-os usando ffmpeg -> move para outra pasta correspondente ao mês -> exclui os arquivos de origem
$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}