Drehen Sie MP4-Videos ohne Neucodierung

76

Ich suche nach einer Möglichkeit, mit meinem Nexus 4 auf meinem Debian Wheezy-System aufgenommene Videos zu drehen. Die Videos werden im Hochformat aufgenommen und ich möchte sie in den Querformatmodus drehen. Vorzugsweise erfolgt die Drehung über die Befehlszeile.

Ich habe einige frühere Fragen gefunden, die auf eine gute Lösung hinweisen, aber ich scheine es nicht zu schaffen, sie zum Laufen zu bringen.

Zunächst gab es folgende Frage: Rotieren von Videos mit FFmpeg

Aber es zeigt an, dass ffmpeg veraltet ist und dass ich avconv verwenden sollte. Ich fand diese Frage, die den weiteren Weg beschreibt. /ubuntu/269429/how-can-i-rotate-video-by-180-degrees-with-avconv

Dies brachte mich dazu, folgenden Befehl zu verwenden:

avconv -i original.mp4 -vf "transpose=1" -codec:v libx264 -preset slow -crf 25 -codec:a copy flipped.mp4

Dies ist jedoch akribisch langsam (der letzte Test dauerte mehr als 6 Stunden für weniger als 3 Minuten Filmmaterial) und führt nicht zu einem abspielbaren Film. Ich erhalte auch einen Fehler bei der Protokollierung der Ausgabe, in dem Mb Rate> Level Limit angegeben ist.

Gibt es hier ein Problem mit der Neucodierung? Sollte ich die Videos zuerst von meinem Telefon auf eine andere, "funktionsfähigere" Codierung umcodieren, bevor ich die Rotationen anwende? Oder fehlt mir ein weiterer wichtiger Punkt?

stedes
quelle
5
ffmpegvon FFmpeg ist nicht veraltet. Die gefälschte Fälschung ffmpegvon Libav (eine Gabel von FFmpeg) ist veraltet. Sie können nicht ohne Neucodierung drehen, es sei denn: 1) Ihre Eingabe ist MJPEG oder 2) Sie drehen sich bei der Wiedergabe.
Llogan
@ LordNeckbeard Wie kann ich den Unterschied erkennen? Ich habe den Paketmanager verwendet, um ffmpeg zu installieren, also schätze ich, dass ich das richtige aktiviert habe.
stedes
1
Informationen zum Drehen im Allgemeinen finden Sie unter Drehen eines Videos um 180 ° (vertikal / verkehrt herum) mit FFmpeg. , und für MJPEG-Eingaben siehe Verlustfreies Drehen des MJPEG-Videos mit ffmpeg und exiftran .
Llogan

Antworten:

112

Wenn Sie die Metadaten nur so ändern möchten, dass Mediaplayer, die das Flag berücksichtigen, die gedrehte Datei abspielen, versuchen Sie Folgendes:

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4

wie an anderer Stelle auf Stackoverflow gefunden .

ruediger05
quelle
Ich habe es versucht, aber keinen Erfolg. Ich benutze mplayer auf Lubuntu. Wie kann man die Metadaten lesen, um zu überprüfen, ob sie geändert wurden?
Sigur
3
@Sigur versuchen ffprobe -v quiet output.mp4 -show_streams|grep rot. Auf einem Video, in dem die Rotation erfolgreich angewendet wurde, sehe ich diese Ausgabe:TAG:rotate=90 rotation=-90
kwc
2
Gibt es Erklärungen zu den Parametern? Z.B. Ich habe eine Antwort gefunden, bei der das :0Nachher -metadatanicht da ist - was macht das? Wofür ist -c copy? ..
Dennis98
8
Ok, bin gerade wieder auf diese Frage gestoßen, habe aber jetzt viel mehr Erfahrung mit FFmpeg. Das :s:v:0After -metadataist der Stream-Bezeichner, der ffmpeg nur mitteilt, zu welchem ​​Stream die Metadaten hinzugefügt werden sollen. :ssteht nur für die Streams der Eingabedatei, :vwählt Videostreams aus und die Zahl ist der auf Null basierende Stream-Index - dies wählt also nur den ersten Videostream aus. Da Sie normalerweise nicht mehr als einen Videostream haben, :s:vsollte dies zu demselben Ergebnis führen. Die -cOption gibt den Codec an, der zum einfachen copyKopieren der Streams ohne Neucodierung verwendet werden soll.
Dennis98
2
Nicht alle Spieler werden dies unterstützen
Hamid Reza
50

Rotation = 0 hat mein Problem behoben. Ich habe mit der Videoaufnahme im Hochformat begonnen, meinen Fehler erkannt und mein Telefon sofort auf Querformat geschaltet, um die Aufnahme fortzusetzen. Mein iPhone hatte das Video als Porträt für das gesamte Video markiert.

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4

Repariert.

Mangor
quelle
7
Können Sie diesen Parameter bitte näher erläutern?
Zulu
33

FFmpegund ähnliche Programme ändern die Metadaten auch mit der -map_metadataOption. exiftoolkann die Rotationsmatrix und das Rotationsflag lesen und seit Version 10.89 auch wie unten beschrieben schreiben.

Um eine echte verlustfreie Rotation (einschließlich Metadaten) zu erzielen, konnte ich keine Lösung finden. Deshalb griff ich nach einem Hex-Editor (z. B. HxD ) und analysierte die gedrehten Videodateien.

Echte verlustfreie Rotation von MP4:

  • öffne mp4 mit dem Hex-Editor und suche videnach den Metadaten der Videospur
  • Einige Zeilen oben (für meine Dateien meistens 9, manchmal 12) sollten Sie sehen trak...\tkhd
  • dazwischen sollte ein @Schild stehen (HEX 40)
  • In den beiden Zeilen davor wird die Rotationsmatrix gespeichert
  • keine Drehung:

    00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    40
    
  • 180 °:

    FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    40
    
  • 90 ° cw:

    00 00 00 00 00 01 00 00 00 00 00 00 FF FF 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    40 
    
  • 90 ° ccw:

    00 00 00 00 FF FF 00 00 00 00 00 00 00 01 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    40
    

Ändern Sie die Datei nach Bedarf, und sie sollte in Spielern gedreht werden, die das Rotationsflag unterstützen (die meisten aktuellen Spieler tun dies).

Wenn Ihr Video Stereo-Audio enthält, wird dies offensichtlich nicht umgeschaltet. Wenn Sie also möchten, dass der Ton mit der Videodrehung (180 °) übereinstimmt, müssen Sie den linken und rechten Kanal umschalten.

aXeL-HH
quelle
5
Ich kann nicht verstehen, dass dies keine positiven Stimmen bekommen hat. Die anderen Antworten zeigen, dass Sie ein Video nur dann verlustfrei drehen können, wenn es MJPEG ist. Dies hat bei mir funktioniert, es war verlustfrei, keine Neucodierung (sofort), und ich habe die Gewissheit, dass nichts anderes in der Datei geändert wird und ich mich nicht darum kümmern muss, zufällige ausführbare Binärdateien aus dem Netz herunterzuladen. Dies war sogar schneller als das Einrichten einer Befehlszeile aus der akzeptierten Antwort. Habe eine positive Bewertung und danke! :)
deLock
1
Danke. Ich denke, es ist das Problem, eine bessere Lösung für eine alte Frage mit mehreren Antworten hier auf SX zu finden. Es gibt tatsächlich mehrere ähnliche Themen, die ich mit diesen Informationen zu beantworten / zu helfen versuchte, die jedoch von anderen ausführlicheren Benutzern blockiert wurden. Eher eine Diskussion für SX-Meta.
aXeL-HH
1
Ich habe es gerade versucht. Wunderschönen. Es dauerte nur wenige Sekunden, funktionierte einwandfrei und ist zu 100% reversibel zur Originaldatei. Vielen Dank!
Spire
1
@ user3469861 Code ist in exiftool v10.89 integriert. Vielleicht möchten Sie nur Folgendes
aXeL-HH
1
Ich habe diese Methode auch in ein eigenständiges Tool eingebrannt .
AndreKR
2

Es gibt mehrere Dinge, die Sie in Ihrer Frage angesprochen haben:

  1. Es besteht fast keine Chance, dass Sie sich ohne Neucodierung drehen können. Auf die Ausnahme von dieser Regel (MJPEG-Codec) wurde bereits hingewiesen, aber es ist unwahrscheinlich, dass Sie sie verwenden, sodass sie über den Rahmen dieser Frage hinausgeht. Ich werde erwähnen, dass der Grund für diese Fähigkeit darin besteht, dass JPEG über Metadaten konvertiert werden kann. Wenn Sie also in der Lage sind, einen Container mit Metadatenrotation zu finden, können Sie rotieren, aber es gibt noch keinen (oder sind weit genug verbreitet).
  2. Wenn Sie Stunden gebraucht haben, um 3 Minuten des Videos zu drehen und neu zu codieren, kann das Problem in einer enormen Auflösung liegen. Und ich meine riesig ! Können Sie bitte die Ausgabe des bereitstellen, avprobe original.mp4damit es festgestellt werden kann.
  3. Die Debatten zwischen Libav und FFmpeg sind sehr kontraproduktiv (das sieht man an der Menge an Fud, die hier bereits veröffentlicht wurde). Grundsätzlich geschah eine Aufteilung des Projekts, wobei einige Entwickler in die eine oder andere Richtung gingen. Die Tatsache, dass das FFmpeg-Projekt es geschafft hat, den Namen beizubehalten, ist nur ein Zufall und es macht keinen Sinn, ein Projekt als Original und ein anderes als Gabelung zu bezeichnen. Die Unterschiede zwischen den Projekten liegen hauptsächlich im Entwicklungsstil und in der Philosophie. Wenn Sie FFmpeg als mehr Open Source und Libav als mehr freie Software charakterisieren würden, würden Sie sich nicht so irren. Rationale Leute hoffen, dass die Entwickler irgendwann zur Besinnung kommen und die Projekte vielleicht nicht zusammenführen, sondern in größerem Umfang zusammenarbeiten. Als Ubuntu ursprünglich herauskam, gab es in jedem Debian GNU / Linux-Chat riesige Nachrichten in der Richtung "
v010dya
quelle
3
JPEG kann auch verlustfrei gedreht werden, ohne die Metadaten zu ändern
Walter Tross
@WalterTross Wie ich den Prozess verstehe, der nur durchgeführt werden kann, wenn die Auflösung durch die Blockgröße teilbar ist, wenn nicht, dann können Sie dies nur durch Ändern von EXIF ​​wirklich verlustfrei tun. Bitte korrigiere mich wenn ich falsch liege.
v010dya
2

Diese Antwort ist lediglich eine Zusammenfassung der Kommentare von LordNeckbeard.

Drehen ohne Codierung

Drehen ohne Neucodierung ist nur möglich, wenn:

  • Ihre Eingabe ist MJPEG
  • Sie drehen sich bei der Wiedergabe

Drehen Sie mit der Codierung mit dem richtigen ffmpeg

Um die dazu erforderlichen Schritte richtig zu verstehen, sollte man zunächst diese Frage lesen oder zumindest überfliegen:

Was sind die Unterschiede und Ähnlichkeiten zwischen ffmpeg, libav und avconv?

Zusammenfassung: avconv ist eine Abzweigung von ffmpeg, der Debian-Betreuer hat avconv gewählt. Sie müssen das richtige ffmpeg aus dem Quellcode kompilieren.

Der nächste Schritt wäre das Kompilieren des richtigen ffmpeg aus der Quelle, wie hier beschrieben:

Kompilierungsanleitung von ffmpeg für Debian

Der letzte Schritt ist die Verwendung der Befehle in anderen Beiträgen:

Wie drehe ich ein Video mit FFmpeg um 180 ° (vertikal / verkehrt herum)? oder Videos mit FFmpeg drehen

Zusammenfassung: ffmpeg -vfilters "rotate = 90" -i input.mp4 output.mp4

stedes
quelle