
Ich versuche, CCTV-Aufnahmen zu verwalten, und ich versuche, sie mit ffmpeg stapelweise zu komprimieren
Bisher ist mir dieser Befehl gelungen
ffmpeg -i "0515 210004.mp4" -b 200000 output.avi
Aber ich muss sie alle auf einmal machen,Aberdas aktuelle Datum ausschließen
Wenn heute also der 16.05 ist, habe ich in meinem Ordner
"0515 210004.mp4"
"0515 220004.mp4"
"0515 230004.mp4"
"0516 000004.mp4"
"0516 010004.mp4"
Und so weiter
Ich muss nur diejenigen konvertieren, die 0515 enthalten, und diese Zahl sollte jeden Tag erhöht werden, sodass ich am 17.05. alle Dateien konvertieren muss, die 0516 enthalten.
Es gibt auch manchmal Dateien, die_1darin, wie „0515 180004_1.mp4“
(Die 004 am Ende iststetsDort)
Und ich muss es auch mit dem exakt gleichen Namen ausgeben.
Ich sehe so etwas
for %%A IN (*.mp4) DO ffmpeg -i "contains "%date% - 1day"" -b 200000 "oldfilename.avi"
Ich verstehe, dass das nicht funktioniert, aber nennen wir es meinen Pseudocode
Haben Sie eine Idee, wie ich meine Aufgabe bewältigen kann?
Oh, und ich verwende Windows 7 x64
Auch wenn Sie irgendwelche Vorschläge auf ffmpeg Teil davon haben, werde ich sehr glücklich sein, meinen Code anzupassen
Antwort1
Ich schätze Ihre Frage, weil Sie sagten„Haben Sie eine Idee, wie ich meine Aufgabe erfüllen kann?“und du hast nicht nach dem Schreiben eines Codes gefragt. Ich schätze, du willst es lernen. Also diese Antwort.
- Konzentrieren Sie sich auf dasSchlüssel, etwas, das einzigartig ist und Ihnen erlaubt, nur die Elemente auszuwählen, über die Sie arbeiten müssen. In diesem Fall haben Sie gerade gesagt,ersten vier Zeichen im Namender Dateien im aktuellen Verzeichnis. Gut.
Noch besser, weil sie die gleiche Länge haben, egal ob es der 1. Januar oder der 31. Dezember ist (auch wenn Sie nicht gezwungen sind, es zu verwenden).
Jetzt können Sie Ihr Batch-Skript Schritt für Schritt schreiben:
Bauen Sie die Saiten für gestern und morgen [d1,d2,d3...] .
$date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd')
Beachten Sie, dass Sie hier oben Änderungen am Format und Variablennamen vornehmen müssen. Sie benötigen diese auch morgen.
Wählt alle Dateien aus, die mit der Zeichenfolge von gestern übereinstimmen. (Für und Variable „Gestern“)
- Für jede [2] von ihnen ersetzen (lassen Sie das Skript dies tun) den Teilstring von gestern durch den Teilstring von morgen, in einer Variablen mit einem neuen Namen [1]
.mp4
. Auch bei.avi
... das Wechseln nicht vergessen. - Geben Sie die von Ihnen erstellte Zeichenfolge aus.
- Wenn Sie sich über Ihr Programm sicher sind, ändern Sie die Ausgabezeile mit der von ffmpeg.
Jetzt müssen Sie nur noch nach den einzelnen Schritten suchen und die entsprechenden Befehle zusammenstellen ...
PS> Ein zweites Mal können Sie Ihr Skript erweitern, indem Sie prüfen, ob die Ausgabedatei vorhanden ist (Sie werden sie nicht überschreiben, wenn sie vorhanden ist), ob die Nummer der verarbeiteten Dateien vorhanden ist oder nicht, oder ob Ihr Skript erfolgreich beendet wurde … Ein zweites Mal.
Antwort2
Das ist das Ergebnis
Wenn jemand Vorschläge zur Codeoptimierung hat, werde ich diese sehr gerne berücksichtigen
Ruft das gestrige Datum im TT.MM ab -> wählt alle Dateien aus, die mit diesem Datum beginnen -> komprimiert sie mit ffmpeg -> verschiebt sie je nach Monat in einen anderen Ordner -> löscht Quelldateien
$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}