Brennen einer Videodatei mit einem nicht standardmäßigen Seitenverhältnis auf DVD

7

Ein Standard-Unixy-Befehlszeilenansatz zum Brennen einer Videodatei auf DVD lautet wie folgt (vorausgesetzt)

# 1. First use ffmpeg to convert to an mpg file.

ffmpeg -i input.m4v -target ntsc-dvd output.mpg

# 2. now do the authoring

dvdauthor --title -o dvd -f output.mpg
dvdauthor -o dvd -T

HINWEIS: --titleLegt den Titel der DVD und -Tdas Inhaltsverzeichnis fest. In beiden obigen Befehlen verweist der Schalter -o auf ein Verzeichnis, NICHT auf die eigentliche DVD.

# 3. roll the .mpg file into an ISO file
genisoimage -dvd-video -o dvdimage.iso dvd

Brennen Sie zum Schluss die resultierende ISO-Datei auf eine leere DVD. Ich benutze Brasero, das zuverlässig ist.

Diese Methode funktioniert jedoch nicht gut mit nicht standardmäßigen Seitenverhältnissen. Das DVD-Format ist ziemlich streng in Bezug auf die Angabe, welche Seitenverhältnisse akzeptiert werden. Sie werden wissen, ob Sie dieses Problem haben, wenn dvdauthor etwas Ähnliches sagt wie

WARN: unknown mpeg2 aspect ratio 1

Was ist eine gute Möglichkeit, diese Methode zu ändern, um nicht standardmäßige Seitenverhältnisse zu verarbeiten?

UPDATE: Vielen Dank an Anthony für die sehr gründliche und klare Antwort. Ich hoffe, dass dies für Leute nützlich sein wird, die versuchen, eine Antwort auf dieses ärgerliche Problem zu finden. Ich kenne keine andere klare Erklärung dafür im Netz.

Faheem Mitha
quelle

Antworten:

6

Der grundlegende Ansatz besteht darin, Ihrem Video schwarze Ränder hinzuzufügen, damit es in eines der zulässigen Seitenverhältnisse der DVD passt.

TLDR: Springen Sie zu Fazit.

Einige Definitionen

Zunächst muss ich jedoch einige verschiedene Dinge definieren:

  • Ein Seitenverhältnis ist einfach die Breite von etwas geteilt durch die Höhe, typischerweise ausgedrückt als Bruch. Oft wird der traditionelle Schrägstrich durch einen Doppelpunkt ersetzt: Wir schreiben 4: 3 anstelle von 43 . Manchmal werden diese in Dezimalzahlen ausgedrückt (1,333…). Sie können es auch 8: 6, 12: 9, 16:12 usw. nennen, da diese alle gleich sind. Oder sogar 1,333: 1 (gleich, wenn Sie nur genug 3s schreiben könnten).
  • Ein Display - Seitenverhältnis (DAR) ist das Seitenverhältnis einer tatsächlichen Anzeige (beispielsweise ein TV). Übliche Anzeigen sind nominell 4: 3 oder 16: 9.
  • Ein Speicheraspektverhältnis (SAR) ist das Verhältnis von Breite zu Höhe (in Pixel) des gespeicherten Bildes oder Videos. Zum Beispiel erreicht NTSC DVD Video ein Maximum von 720 x 480 ("Full D1"), was einer SAR von 1,5: 1 entspricht.
  • Ein Pixel- Seitenverhältnis ist das Seitenverhältnis eines einzelnen Pixels in einem gespeicherten Bild. In Videos sind Pixel nicht immer quadratisch. Wenn sie nicht quadratisch sind, sind sie normalerweise schmaler als groß.

Es gibt eine einfache mathematische Beziehung zwischen den drei oben genannten: SAR × PAR = DAR. Beispiel: 720: 480 * 8: 9 = 4: 3. Das wäre ein Video für ein 4: 3-Display, das in voller Auflösung auf eine DVD gelegt wird.

Eine andere Komplexität

Analoges Fernsehen hat keine Pixel. Stattdessen hat es ein sich kontinuierlich änderndes Signal. Ein bestimmter Teil dieses Signals soll auf jede Zeile der Anzeige projiziert werden, dann gibt es eine inaktive Zeit, um beispielsweise das Wechseln zur nächsten Zeile zu ermöglichen. Verschiedene Fernsehgeräte zeigen jedoch geringfügig unterschiedliche Mengen jeder Leitung an, und dies kann über die Lebensdauer des Fernsehgeräts oder sogar während des Aufwärmens des Fernsehgeräts variieren.

DVD sagt, dass die 8 Pixel ganz links und ganz rechts nicht verwendet werden sollen. Von 720 sollen also 704 verwendet werden. Die 8 Pixel auf jeder Seite sollen mit Schwarz gefüllt sein. Der angegebene PAR ist dieser 10:11.

Natürlich finden Leute, die an digitale Geräte gewöhnt sind, dies albern (um Wörter zu verwenden, die für höfliche Unternehmen geeignet sind). Viele kommerzielle DVD-Veröffentlichungen verwenden tatsächlich alle 720 Pixel, einige erwarten einen PAR von 10:11 und andere einen PAR von 8: 9. [Oder ähnlich für einen 16: 9 DAR]. Die meisten Hardware-DVD-Player verwenden 10:11, obwohl dies natürlich auch von den TV-Einstellungen abhängt.

Zusammenfassung

Wenn Sie mit einem Video beginnen, bei dem jedes Pixel angezeigt werden soll, möchten Sie es wahrscheinlich auf 704 x 480 (SAR 22:15) mit den schwarzen 8-Pixel-Balken einpassen. Wenn die abgeschnittenen Seiten in Ordnung sind, können Sie die volle 720x480 verwenden. In beiden Fällen müssen Sie Ihr Video nach Bedarf skalieren, um einen PAR von 10:11 (DAR von 4: 3) oder 40:33 (DAR von 16: 9) zu erhalten, und, wenn der gesamte Frame 720 x 480 kleiner ist, Schwarz hinzufügen Riegel.

Eigentlich mache ich es

Zum Glück ffmpegkann das. Im inoffiziellen ffmpeg- Supportforum bietet ks_kalvan eine ffmpeg-Videofilterkette für die Ausrichtung auf einen 16: 9-DAR:

-filter:v "scale='w=min(720,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((720*40/33/dar)/2+0.5)*2)',pad='w=720:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='r=40/33'"

Wie funktioniert das‽

Hinweis gibt es drei Filter drin: scale, pad, und setsar. Wir werden jede nacheinander vom Ende nehmen, da die am Ende einfachsten sind.

Der letzte Filter ist verwirrend, bis Sie die Dokumentation (`man ffmpeg-filter) überprüfen und diese explizit entfernte Zeile finden:" Der Filter "setsar" legt das Seitenverhältnis (auch bekannt als Pixel) für das Filterausgangsvideo fest. " Das bedeutet also, dass der PAR auf 40:33 gesetzt wird. Dies ist der Wert, den wir oben angegeben haben.

Der padFilter fügt schwarze Ränder hinzu. Die Dokumentation sagt uns, dass ow die Ausgabebreite (dh 720 vom w=720Teil), oh die Ausgabehöhe (dh 480 vom h=480Teil) ist. iw und ih sind die Eingabebreite bzw. -höhe. ow - iw ist also die Anzahl der Pixel, die wir zur Breite hinzufügen (und ähnlich oh - ih für die Höhe); Durch Teilen durch 2 wird die Hälfte davon auf jede Seite des Bildes gelegt. Mit anderen Worten, wir zentrieren das Bild.

Der scaleFilter ändert die Größe des Videos. Die w=Option gibt die neue / Ausgabebreite an und die h=Option gibt die Höhe an. Wieder ist es ein Ausdruck, aber komplizierter. Die Formeln für Breite und Höhe sind gleich, nur dass Höhe und Breite vertauscht sind. Untersuchen wir die width ( w=) -Formel:

  • Funktionen und Operatoren sind in dokumentiert man ffmpeg-util. Für positive Zahlen trunc(x+0.5)ist es ein Trick, auf die nächste Ganzzahl zu kommen, was ffmpeg nicht hat.

  • Aufbauend auf diesem trunc(x+0.5)Trick haben wir trunc(x/2+0.5)*2. x / 2 gibt uns natürlich die Hälfte x; Das Abschneiden rundet es dann auf die nächste Ganzzahl. Wenn wir es verdoppeln, erhalten wir die nächste gerade Zahl.

  • Ich werde «W» verwenden, wo der eigentliche Befehl wie 720 verwendet. Das ist die endgültige Ausgabebreite in Pixel. Ebenso «H» anstelle von 480 (endgültige Ausgabehöhe). Anstelle von 40/33 wird «PAR» als Zielpixel-Seitenverhältnis verwendet. Und PAR⁻¹ ist der Kehrwert von PAR, dh 33/40.

  • darist eine ffmpeg-Variable. Es ist der DAR des Eingangsvideos.

  • Eine wichtige Sache, um dies zu verstehen, ist die Berechnung in der Mitte, wo wir eine Berechnung haben, die «H» × dar ÷ «PAR» ist. Denken Sie daran, dass dar die Anzeige mit dem Originalvideo ist. Wenn wir also die Zielbreite (in Pixel) mit dem Dar multiplizieren, erhalten wir, wie breit es wäre, wenn wir das Video so skalieren würden, dass es auch die Zielhöhe «H» und quadratische Pixel aufweist. Durch Teilen durch den PAR wird dies dann in die Breite der nicht quadratischen Pixel umgewandelt, die wir tatsächlich verwenden.

min(«W»,               # take the minimum [lesser of] target width and...
  trunc(               # the truncation of (round to integer towards 0)
    («H»*«PAR⁻¹»*dar)  # calculate the wanted output width, see note above
    / 2 + 0.5) * 2     # and get the nearest even number to that
))

Beispiel: Angenommen, Sie nehmen ein 1280 x 720 Pixel großes Video mit einem Seitenverhältnis von 16: 9 auf. Ausgehend von der Mitte:

  1. «H» * «PAR⁻¹» * dar = 480 * 33/40 * 16/9 = 704.
  2. 704/2 = 352.
  3. abgeschnitten (352 + 0,5) = 352
  4. 352 * 2 = 704
  5. min (720, 704) = 704

Welches ist die volle nutzbare Breite (dh ohne die unbrauchbaren 8px-Bereiche), wie wir es von einem 16: 9-Video auf einem 16: 9-Display erwarten würden.

Und wenn wir es auf Höhe machen, erhalten wir 490, was dank min () auf 480 gehalten wird. Aber tatsächlich zeigt das, dass wir dort wahrscheinlich 704 (die nutzbare Breite) anstelle von 720 verwenden wollten, was genau kommt 480. Es scheint also, dass es dort einen kleinen Fehler gibt, der eine winzige (und wahrscheinlich nicht wahrnehmbare) Verzerrung verursacht. Das ist unten behoben, glaube ich.

Abschließend

ffmpeg -i YOUR-FILE-HERE \
  -filter:v "scale='w=min(720,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((704*40/33/dar)/2+0.5)*2)',pad='w=720:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='r=40/33'" \
  -target ntsc-dvd YOUR-OUTPUT-HERE.mpg

HINWEIS: Ältere ffmpegs haben keine -filter:v. Sie können es -vfstattdessen versuchen (ungetestet) oder besser noch einen neuen statischen Build von ffmpeg.org herunterladen .

derobert
quelle