Wie konvertiere ich anamorphes HDV-Video mit ffmpeg in normales h.264-Video? Wie kann man quadratische Pixel in der Ausgabe sicherstellen?

Ich habe den folgenden Code, um HDV-Videos in ein webfähiges mp4 zu konvertieren:

ffmpeg -i hdv-input.m2t -crf 28 -c:a aac -b:a 80k -ac 1 -strict -2 -movflags +faststart h-264-out.mp4

Das Problem ist, dass es in diesem Befehl keine Möglichkeit gibt, das Pixel-Seitenverhältnis anzugeben. Falls Sie es nicht wissen: HDV-Videodateien haben eine Auflösung von 1440 x 1080, aber die Pixel sind nicht quadratisch. Bei der Dekodierung für die Anzeige werden die Pixel auf volle 1920 x 1080 gestreckt. Dies wird als anamorphes Video bezeichnet und sollte unbedingt vermieden werden, wenn für Endbenutzer produziert wird.

Ich weiß ehrlich gesagt nicht, ob die MP4s, die ich mit dem obigen Befehl mache, mit quadratischen Pixeln produziert werden, aber ich möchte sicherstellen, dass sie es sind. Was sind die richtigen Parameter, die ich zu diesem Befehl hinzufügen muss, um quadratische Pixel in meiner Ausgabe-mp4 sicherzustellen? Muss ich auch die Auflösung einstellen und wie mache ich das? Es scheint, als müsste es auch einen -c:vBefehl geben, aber ich weiß es nicht wirklich.

Antworten (1)

Sie können eine Kombination aus Scale- und Setar-Filtern verwenden.

ffmpeg -i hdv-input.m2t -vf "scale=iw*sar:ih,setsar=1" -crf 28 -c:a aac -b:a 80k -ac 1 -movflags +faststart h-264-out.mp4

Die Scaler-Breite, die auf gesetzt werden soll current width x sample/pixel aspect. Wenn es bereits 1 ist, beträgt es new width = old width. Ich habe danach einen setsar hinzugefügt, um sicherzustellen, dass die Ausgabe-SAR 1.

Für das MP4-Format ist der Standard-Video-Codec H.264. Wenn Sie dies möchten, müssen Sie nicht explizit festlegen c:v.

(Für Bitraten < 128k libfdk_aacbesser als der native AAC-Encoder.)

-strict -2wird für die Verwendung des nativen AAC-Encoders nicht benötigt, wenn Ihr ffmpeg von nach Dezember 2015 stammt.

Dieser Befehl gibt also quadratische Pixel aus, aber mit der gleichen Auflösungsgröße wie die Eingabe?
Mit der gleichen Bildschirmauflösung wie die Eingabe.
Ich denke, Sie brauchen "... setsar=1:1,setdar=16:9 ..." - Siehe: video.stackexchange.com/questions/9947/… .
Alles, was setdar tut, ist, die SAR so zu ändern, dass das resultierende Video bei der Anzeige width = DAR x height. Für den Anwendungsfall des OP wäre setdar überflüssig. Bei anderen Videos würde es eine Anzeige im Format 16:9 erzwingen,
Muss ich etwas tun (Download usw.), um es zu verwenden libfdk_aac? Ich habe -c:a aaczu gewechselt -c:a libfdk_aacund erhalte den Fehler "unbekannter Encoder 'libfdk_aac'".
Aufgrund von Lizenzinkompatibilität können Binärdateien nicht mit dieser enthaltenen Bibliothek vertrieben werden. Sie müssen ffmpeg selbst mit dieser Bibliothek kompilieren. Ich verwende dieses Skript , um ffmpeg automatisch zu kompilieren. Der erste Lauf dauert auf einem i7 4-5 Stunden. Weitere Läufe, 2 Stunden oder so.
@Gyan Was ist, wenn Sie beim Ausführen dieses Befehls den Fehler "Breite nicht durch 2 teilbar" erhalten?