Stapelkomprimierung von AVI-Dateien mit ffmpeg, die ein vorheriges Datum im Namen enthalten

Stapelkomprimierung von AVI-Dateien mit ffmpeg, die ein vorheriges Datum im Namen enthalten

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:

  1. 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.

  2. Wählt alle Dateien aus, die mit der Zeichenfolge von gestern übereinstimmen. (Für und Variable „Gestern“)

  3. 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.
  4. Geben Sie die von Ihnen erstellte Zeichenfolge aus.
  5. 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}

verwandte Informationen