Ich bin neu bei FFmpeg und versuche, das herauszufinden. Ich habe das hier gefunden fürStapelverarbeitungund diese Antwort fürRotation des Videosaber ich muss sie zusammenfügen.
Könnte mir bitte jemand erklären, wie man unter Windows ein Skript für diese Aktion erstellt?
Antwort1
Im Grunde müssen Sie nur die Dateien nachschlagen (sie in einer Variablen speichern) und die gesuchten Dateien dann in FFmpeg einspeisen.
Natürlich,Die Batch-Sprache von Windows würde dafür ausreichen. Da ich damit aber überhaupt keine Erfahrung habe, hier ein PowerShell-Skript:
# Searching for files with the Get-ChildItem cmdlet and saving their relevant properties in an array:
# NOTE: -File will only work with PowerShell-versions >= 3.
[array]$FilesToRotate = Get-ChildItem -Path "C:\PATH_TO_FILES" ((-Filter *.mp4)) ((-Recurse)) -File | ForEach-Object {
# NOTE: This part is a bit tricky - I just added it so I'm able to save the parent-path of each file in an object.
# NOTE: One could also omit the whole ForEach-Object and use the Split-Path cmdlet inside the output-file's specification in FFmpeg's code.
[PSCustomObject]@{
InFullName = $_.FullName
# Will put the output-file in the same folder as the input-file and add "_ROTATION" as suffix in its name.
OutFullName = "$(Split-Path -Parent -Path $($_.FullName))\$($_.BaseName)_ROTATE$($_.Extension)"
}
}
# Processing the files with FFmpeg using PowerShell's Start-Process cmdlet:
for($i=0; $i -lt $FilesToRotate.Length; $i++){
Start-Process -FilePath "C:\PATH_TO_FFMPEG\ffmpeg.exe" -Argumentlist " -i `"$($FilesToRotate[$i].InFullName)`" -c copy -metadata:s:v:0 rotate=<x> `"$($FilesToRotate[$i].OutFullName )`" " ((-Wait)) ((-NoNewWindow))
}
Dieses Skript führt FFmpeg mit demden von Ihnen angegebenen Code(Ich habe es nicht überprüft, aber Sie können es trotzdem problemlos ersetzen) und speichern Sie die resultierende Datei im selben Ordner mit dem Namenssuffix „_ROTATE“ – so wird „MyMovie2017.mov“ zu „MyMovie2017_ROTATE.mov“. (Wenn Sie sie in einem ganz neuen Ordner rendern möchten, ersetzen Sie sie $($FilesToRotate[$i].ParentPath)
durch den gewünschten Pfad.)
Hinweise: Angaben in doppelten Klammern (( ))
sind optional:
-Filter
adressiert nur (einen) bestimmten Dateityp, z. B. findet *.mp4 nur MP4-Dateien. Wenn Sie mehr als einen Dateityp haben, aber viele Dateien, die Sie nicht konvertieren müssen (wie Textdateien), können Sie entweder-Exclude
alle Formate auswählen, die Sie nicht konvertieren möchten, oder-Include
nur diejenigen, die konvertiert werden sollen (-Include
ist wie-Filter
- es ist langsamer, kann aber mehr als ein Format umfassen.)-Recurse
durchsucht auch Unterordner. Sie können es auch-Depth
mit PowerShell v 5+ verwenden.-Wait
öffnet immer nur eine ffmpeg-Instanz auf einmal – ohne diese Option werden alle Instanzen parallel geöffnet.-NoNewWindow
zeigt die Ausgabe Ihrer ffmpeg-Instanz in der PowerShell-Konsole an, während ohne diese Option jede Instanz von ffmpeg in einem neuen Konsolenfenster geöffnet wird. Macht nur mit Sinn-Wait
.
Sie müssen alle doppelten Klammern (und deren Inhalt, wenn Sie ihn nicht möchten) löschen, bevor Sie das Skript starten.
Außerdem müssen diese Dinge angepasst werden:
C:\PATH_TO_FILES
Natürlich der Pfad zu Ihren Dateien.C:\PATH_TO_FFMPEG\ffmpeg.exe
Natürlich der Pfad zu Ihrer ffmpeg.exe.rotate=<x>
- Sie müssen das<x>
durch entweder90
,180
, oder ersetzen270
. (Wie in der Codequelle erklärt)
Wenn etwas weiterer Erklärung bedarf, helfe ich gerne.
Antwort2
Einzeilige Lösung
npx rotate-video --source=source_path --destination=destination_path --extension=MP4 --angel=270
Notiz:Sie müssen FFMPEG
zuerst CLI installierenInstallieren