Wie drehen Sie ein gesamtes Videoverzeichnis mit ffmpeg?

656
ThirteenthMonth

Ich bin neu bei FFmpeg und versuche das herauszufinden. Ich habe dies für die Stapelverarbeitung und diese Antwort für die Rotation von Videos gefunden, aber ich muss sie zusammenstellen.

Könnte jemand bitte erklären, wie man unter Windows ein Skript für diese Aktion erstellt?

3
Welches Betriebssystem? 8bittree vor 6 Jahren 4
Verwenden Sie den Befehl "for" mit dem Befehl "ffmpeg". Die Syntax des for-Befehls kann jedoch je nach Betriebssystem variieren. Biswapriyo vor 6 Jahren 0
Hallo, danke für die Antworten. Zur Verdeutlichung versuche ich, dies unter Windows zu erreichen. ThirteenthMonth vor 6 Jahren 0

1 Antwort auf die Frage

2
flolilolilo

Im Grunde müssen Sie die Dateien nur nachschlagen (in einer Variablen speichern) und dann die gesuchten Dateien in FFmpeg einspeisen.

Natürlich wäre die Batch-Sprache von Windows dafür ausreichend . Da ich aber keine Erfahrung damit habe, folgt 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 dem von Ihnen bereitgestellten Code aus (ich habe es nicht geprüft, kann aber trotzdem leicht ersetzt werden) und speichert die resultierende Datei im selben Ordner mit dem Namenssuffix "_ROTATE" - "MyMovie2017.mov" werde "MyMovie2017_ROTATE.mov". (Wenn Sie sie in einen ganzen neuen Ordner rendern möchten, ersetzen Sie sie durch den gewünschten $($FilesToRotate[$i].ParentPath)Pfad.)

Hinweise: Dinge in doppelten Klammern (( ))sind optional:

  • -Filterspricht nur eine (eine) bestimmte Art von Dateien an, zB * .mp4 findet 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 -Excludealle Formate verwenden, die Sie nicht konvertieren möchten, oder -Includenur die, die konvertiert werden sollen ( -Includeist ähnlich -Filter) ist langsamer, kann jedoch mehr als ein Format enthalten.)
  • -Recurseprüft auch Unterordner. Sie können auch -Depthmit PowerShell v 5+ verwenden.
  • -Wait öffnet jeweils eine ffmpeg-Instanz - ohne sie werden alle Instanzen parallel geöffnet.
  • -NoNewWindowZeigt die Ausgabe Ihrer ffmpeg-Instanz in der PowerShell-Console an, ohne dass jede Instanz von ffmpeg in einem neuen Konsolenfenster geöffnet wird. Macht nur mit Sinn -Wait.

Sie müssen vor dem Starten des Skripts alle doppelten Klammern (und deren Inhalt, falls Sie dies nicht möchten) löschen.

Auch diese Dinge müssen angepasst werden:

  • C:\PATH_TO_FILES Pfad zu Ihren Dateien natürlich.
  • C:\PATH_TO_FFMPEG\ffmpeg.exe Offensichtlich Pfad zu Ihrer ffmpeg.exe.
  • rotate=<x>- Sie müssen <x>entweder 90durch 180, oder ersetzen 270. (Wie am Quellcode erklärt)

Wenn etwas mehr Erklärung braucht, helfe ich gerne.

Danke für die Hilfe! Ich habe es nach einigem Ausprobieren zum Laufen gebracht, indem ich Ihren "-File" -Text entfernt habe. Es sah also so aus: [array] $ FilesToRotate = Get-ChildItem -Path "C: \ PATH_TO_FILES" ThirteenthMonth vor 6 Jahren 0
Könnten Sie mir sagen, was die "Datei" tun soll? Ich habe es einfach gelöscht, nachdem es einen Fehler gemacht hatte und es funktioniert. ThirteenthMonth vor 6 Jahren 0
`-File` hindert` Get-ChildItem` daran, Ordner in die Variable aufzunehmen. Ohne "-File" (und / oder "-Filter") würde $ FilesToRotate auch Unterordner enthalten. PowerShell versucht also, Ihre Unterordner als Eingabedatei für FFmpeg zu übergeben. Beachten Sie, dass wir über den Ordner selbst sprechen. Wir sprechen hier nicht von rekursiver Suche. [Die Dokumentation zu Get.-ChildItem finden Sie hier.] (Https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1) flolilolilo vor 6 Jahren 0
@ThirteenthMonth Könntest du mir sagen, welchen Fehler wirft? Wenn ich es mit `-File` versuche, funktioniert es einwandfrei. Könnten Sie mir auch die Version von PS nennen, die Sie verwenden? (Geben Sie einfach $ PSVersionTable in die Konsole ein und drücken Sie die Eingabetaste. Dies ist der erste Wert.) Vielen Dank! flolilolilo vor 6 Jahren 0
Eingabe von $ PSVersionTable Ich habe folgendes erhalten: "" PS C: \ Users \> $ PSVersionTable Name Wert ---- ----- CLRVersion 2.0.50727.8669 BuildVersion 6.1.7601.17514 PSVersion 2.0 WSManStackVersion 2.0 PSCompatibleVersions SerializationVersion 1.1.0.1 PSRemotingProtocolVersion 2.1 "" Ja, ich habe -Recurse, -Filter zum Testen ohne entfernt, und sobald -File entfernt wurde, hat es funktioniert. Es ist mein erstes Mal, dass ich die Ursache habe. ThirteenthMonth vor 6 Jahren 0
Ah - In PowerShell <Version 3 war der `-File`-Parameter nicht enthalten. Wenn Sie es wirklich verwenden möchten, würde ich vorschlagen, dass Sie ein Upgrade Ihrer PowerShell-Installation durchführen. Dies wäre jedoch ein wenig übertrieben, wenn Sie nur ein paar Dateien konvertieren möchten. ;-) Jedenfalls habe ich diese Informationen als Kommentar in das Skript eingefügt. flolilolilo vor 6 Jahren 1