Der beste Weg, um mehr als 3000 h.264 Videos stapelweise zu drehen?

8

Ich habe ungefähr 3000 kurze Videoclips mit einer Dauer von jeweils ungefähr 3 Sekunden. Ich muss jeden von ihnen um 90 Grad drehen. Was ist der beste Weg, dies zu tun? Ich habe ein Adobe Creative Cloud-Abonnement sowie Zugriff auf Windows- und Mac-Computer. Auf der Suche nach der einfachsten Lösung zur Automatisierung / Stapelverarbeitung der Rotation so vieler Videos.

Wenn Sie sich gefragt haben - die Videos sind Teil eines E-Learning-Kurses über Schnittholz. Der Lernende sieht sich jedes zufällig ausgewählte Video an, bei dem es sich nur um einen kurzen Clip eines rotierenden Holzstücks handelt. Die Videos wurden so aufgenommen, dass das Holz (2x4s usw.) horizontal war. Aber jetzt möchte der Kunde, dass das Holz in den Clips vertikal ist.

user172586
quelle
Nur Rotation? Von zB 1280x720 bis 720x1280 richtig?
p2or
Nur um 90 Grad im Uhrzeigersinn drehen (oder gegen den Uhrzeigersinn - spielt für dieses Projekt keine Rolle).
user172586
Enthält der Container Ihrer Videodateien Metadaten zur Ausrichtung?
Audionuma

Antworten:

9

Verwenden Sie ffmpegund den "Transponierungs" -Filter als "schlecht" vorgeschlagen . Wenn Ihre Dateien beispielsweise mp4 sind und sich im aktuellen Verzeichnis befinden:

mkdir -p rotated
for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" rotated/"$f"; done
  • Der Transponierungswert kann "1" oder "Uhr" für die Drehung im Uhrzeigersinn, "2" oder "Uhr" für die Drehung gegen den Uhrzeigersinn sein. Es gibt andere Werte, die ebenfalls einen Flip anwenden.

  • Das Audio wird per Stream kopiert , um unnötige Neucodierungen zu vermeiden.

  • In diesem Beispiel werden die Metadaten für die Rotation des Videostreams gelöscht. Andernfalls ffmpegwird es von der Eingabe in die Ausgabe kopiert, was zu einer falschen Rotation für Spieler führt, die auf diese Metadaten achten (einige tun dies und andere nicht).

Ein weiteres Beispiel, ausführlicher und flexibler, bei dem die gedrehte Datei mit einem neuen Namen im selben Verzeichnis bleibt:

ext=mp4
for f in /some/dir/*.$ext; do
    new=${f/%.$ext/-rotated.$ext};
    ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" "$new"
done
mivk
quelle
Ja! Ich sollte mehr über Bash Scripting erfahren :)
p2or
1

Sie haben angegeben, dass Sie an einer großen Anzahl von Videos arbeiten möchten. Wenn Sie einen Multicore-Computer haben und eine normale forSchleife verwenden, die von Ihrer Shell bereitgestellt wird, läuft einer Ihrer Kerne heiß, während andere absolut nichts tun . Das ist nicht ideal.

Was Sie für einen solchen Job tun sollten, ist die Verwendung paralleleines Tools, mit dem Sie mehrere Jobs gleichzeitig starten können und das alles kann, was eine for-Schleife kann, aber besser.

Ich werde nicht über alle Funktionen dieses Tools schreiben, sondern mich auf Ihre spezifische Aufgabe konzentrieren.

Eine Möglichkeit, all diese Jobs zu starten, wäre:

parallel avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Hier wird {}jeder Dateiname und {.}der Dateiname ohne Erweiterung ersetzt.

Ich werde vorschlagen, dass Sie so viele Jobs beginnen, wie Sie Kerne haben, nehmen Sie einen weg. Der Grund dafür ist, dass Ihr Betriebssystem weiterhin verwendbar bleibt. Dies erspart Ihnen auch den Fall, dass Sie eine Festplattenverschlüsselung verwenden (bei der Rechenleistung zum Lesen / Schreiben von Daten verwendet wird). Fügen Sie dazu einfach --jobs -1Ihre Befehlszeile hinzu, und Sie begrenzen die Anzahl der Jobs.

parallel --jobs -1 avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Bitte beachten Sie, dass erst nach Abschluss jeder Codierung eine Ausgabe erfolgt. Sie werden also nicht sehen, wie viel von jedem Ihrer Videos gemacht wird.

v010dya
quelle
1

Basierend auf dieser Antwort können Sie ffmpeg mit den folgenden Befehlen verwenden, um ein Video zu drehen:

ffmpeg -i input -vf transpose=2 output

Um einen Ordner mit Filmen stapelweise zu verarbeiten, können Sie eine Programmiersprache Ihrer Wahl verwenden und die Dateien durchlaufen. Ich habe hier Linux mit Python 2.7+ verwendet. Sie müssen nur den folder_moviesPfad bearbeiten path_to_ffmpegund Ihren Film einstellen extension:

import os # import os module
import subprocess # import subprocess module

# set the path to your video folder
folder_movies = '/home/user/Desktop/test/'

# set ffmpeg path
path_to_ffmpeg = "/opt/ffmpeg/ffmpeg"

# set file extension
ext = ".mp4"

# collect all videos in folder_movies
movie_files = [f for f in os.listdir(folder_movies) if f.endswith(ext)] 

# iterate through the files
for i in movie_files:

    # setup correct filepath for mov's
    file_path = os.path.join(folder_movies,i)

    # generate new file path
    new_path = os.path.splitext(file_path)[0] + '_rotated_90' + ext

    # call ffmpeg with the correct arguments
    # command: ffmpeg -i input -vf transpose=2 output
    subprocess.call([path_to_ffmpeg, "-i",  file_path, "-vf", "transpose=2", "-c:a", "copy", new_path])

Danach sollte Ihr Filmordner folgendermaßen aussehen:

Geben Sie hier die Bildbeschreibung ein

Der Vorteil der Verwendung von Python besteht darin, dass der Code plattformübergreifend ausgeführt wird . Das einzige, was Sie berücksichtigen müssen, sind die Pfade zum Verzeichnis und zur ausführbaren Datei ffmpeg. Um dies auf einem Windows-Computer auszuführen , müssen Sie nur die Pfade zu folgenden Elementen ersetzen:

# folder_movies = '/home/user/Desktop/test/' # linux or osx
folder_movies = r'c:\some\directory\test'    # windows, the r is important
folder_movies = 'c:/some/directory\test'     # windows (alternative)

# path_to_ffmpeg = '/opt/ffmpeg/ffmpeg'            # linux or osx
path_to_ffmpeg = r'c:\Program Files\ffmpeg\ffmpeg' # windows, the r is important
path_to_ffmpeg = 'c:/Program Files/ffmpeg\ffmpeg'  # windows (alternative)

Hinweis: Ich bin kein ffmpeg-Experte. Vielleicht gibt es eine Möglichkeit, direkt damit zu stapeln.

p2or
quelle
1
Sie brauchen dafür nicht wirklich ein ganzes Skript. mkdir -p rotated; for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 rotated/"$f"; doneDies kann direkt über die Mac- oder Linux-Befehlszeile erfolgen, z. B .: (Vorausgesetzt, Ihre Videodateien sind in diesem Beispiel .mp4).
Mivk
@mivk schön, warum nicht in eine Antwort umwandeln?
p2or
@mivk Da Sie eine for-Schleife verwenden, ist sie fast gleich. Für diejenigen, die kein Linux oder OSX verwenden, ist es sinnvoll, Python oder eine andere Skriptsprache zu verwenden.
p2or
@poor: Nun, für diejenigen Benutzer, die weder unter Linux noch unter Mac arbeiten, ist die Übersetzung in PowerShell "als Übung für den Leser" ... :-)
mivk
@mivk hehe, ja, aber niemand will es benutzen;)
p2or