Korrigieren Sie das Seitenverhältnis, ohne die Videodatei neu zu codieren

18

Ich habe einen Videostream mit folgenden Eigenschaften:

Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1908 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

Wenn ich es in VLC ausführe, muss ich "A" drücken, um das Seitenverhältnis auf "4: 3" zu ändern, damit das Video mit dem richtigen Seitenverhältnis angezeigt wird.

Betrachtet man die Videofakten, ist der Fehler, dass a) das tatsächliche Video in den Pixeldaten falsch gestreckt wurde oder b) einfach ein Metadatenwert falsch eingestellt wurde?

Wenn erstere, weiß ich, dass ich das Video neu codieren und die Breite und Höhe ändern kann. Aber wenn letzteres der Fall ist, welchen Befehl ffmpeg muss ich ausführen, um die Metadaten zu reparieren, ohne das Video selbst neu zu codieren?

Forthrin
quelle

Antworten:

35

Es gibt einen Unterschied zwischen dem Sample Aspect Ratio (SAR) und dem Display Aspect Ratio (DAR). Wenn Sie das Video so ändern möchten, dass es 4: 3 angezeigt wird, müssen Sie entweder die tatsächlichen Pixel im Bild ändern (indem Sie die Pixel skalieren und die SAR ändern) oder indem Sie ein Metadatenflag setzen, das auf Containerebene extern anzeigt Mediaplayer, um das Bild auf den gewünschten DAR zu strecken.

Sie können die Pixel nicht skalieren und die SAR ändern, ohne einen Videofilter anzuwenden. Wenn Sie diese Methode wählen, müssen Sie die Datei transkodieren, da Sie den Videostream nicht kopieren können, während Sie einen Videofilter anwenden.

Versuchen Sie Folgendes, um das Bild zu skalieren und die SAR (während der Transcodierung) zu ändern:

ffmpeg -i <INPUT_FILE> -vf scale=720:540 -c:v <Video_Codec> <OUTPUT_FILE>

Wenn Sie jedoch nur das Metadaten-Flag ändern und den DAR anpassen möchten, können Sie das Video streamen. Versuchen Sie dazu:

ffmpeg -i <INPUT_FILE> -aspect 720:540 -c copy [OUTPUT_FILE]
occvtech
quelle
Ausgezeichnet! Das Ändern des Aspekts hat sofort funktioniert!
Forthrin
1
Sie können nicht gleichzeitig verwenden -c copyund skalieren. Sie können jedoch -aspectdas Seitenverhältnis auf Containerebene (jedoch nicht auf Stream-Ebene) ändern.
Llogan
@LordNeckbeard, using -aspectfunktioniert für die Wiedergabe in ffplay, aber nicht in WMP oder MPC-HC. Es fügt einen zusätzlichen SAR / DAR Artikel die Stream #…Infozeile in FFmpeg/probe/playaber scheint nicht Lösung für die allgemeine Wiedergabe zu sein. Das Strecken des Videos mit dem Fenster scheint die einfachste Lösung für die MPC-HC-Wiedergabe zu sein.
Lumi
funktionierte nicht für mich für MPEG2 ohne Neukodierung
Mikhail V
Ich weiß nicht, warum es bei mir nicht funktioniert hat. Es wird nur das gleiche Video ausgegeben!
Tina J
4

Delgados Antwort ist richtig, dass MP4Box dies kann, aber die -parOption funktioniert nicht ganz wie beschrieben. Mit einem -outParameter (um Ihre Originaldatei nicht zu stören):

mp4box source.mp4 -out target.mp4 -par stream-number=width:height

Wenn Sie verwenden -par stream-number=width:height, definieren Sie das Pixel-Seitenverhältnis, dh das Ergebnis der Division des Geräteseitenverhältnisses durch das Speicherseitenverhältnis. (Entsprechend beschreiben Sie das Seitenverhältnis eines Quellpixels.) Angenommen, Sie haben eine DVD-Quelle mit der Größe 720 × 480 und das korrekte Seitenverhältnis der Anzeige beträgt 4: 3. Für diesen Fall benötigen Sie:

mp4box source.mp4 -out target.mp4 -par 1=8:9

weil (4/3) / (720/480) = 8/9.

Wenn die Quelle echte SD-NTSC-Pixel darstellt (in diesem Fall sollen nur die zentralen 704 × 480 Pixel einem 4 × 3-Bildschirm mit 8 Pixeln Overscan auf beiden Seiten zugeordnet werden), lautet der richtige Befehl:

mp4box source.mp4 -out target.mp4 -par 1=10:11

weil (4/3) / (704/480) = 10/11 - genau das Referenzpixel-Seitenverhältnis für NTSC-Video mit Standardauflösung.

Für den in der Frage angegebenen Fall ergibt sich, wenn es wirklich 4: 3 ist, ein sehr merkwürdiges Pixel-Seitenverhältnis: (4/3) / (720/416) = 104/135. Es ist 720 breit, was auf eine DVD-Quelle hindeutet. Es ist ein 25-fps-Video, das PAL vorschlägt, aber der PAR arbeitet mit weniger als 1, was auf NTSC hindeutet. Es könnte 4: 5 sein, nehme ich an (sehr nahe an 104: 135), aber ich weiß nichts, was dieses Pixel-Seitenverhältnis erzeugt; Vielleicht versuchen Sie das zuerst und dann 3: 4, wenn es horizontal immer noch etwas zu gestreckt aussieht. Wenn Sie sicher sind, dass es genau 4: 3 ist, verwenden Sie einfach 104: 135.

Coises
quelle
3

ffmpeg kann die Parameter eines Videostreams nicht ohne Neucodierung ändern, MP4Box (Teil von gpac ) und mkvmerge können dies. Bei einem Videostream und einem realen / korrekten Seitenverhältnis von 4: 3 möchten Sie möglicherweise Folgendes versuchen:

MP4Box -par 1=3:4 VideoFile.mp4

    "-par" : PixelAspectRatio (adjusts DAR + SAR with respect to the video resolution)
    "1"=   : stream number
    "3:4"  : aspect ratio (lower number 1st!)
    Changes are directly applied to "VideoFile.mp4", no copy

So überprüfen Sie vorher und nachher: ffmpeg -i VideoFile.mp4

Delgado
quelle
0

Ändern des SAR ohne reencoding auch Arbeiten mit ffmpegauf .mp4die Verwendung h264_metadataals Gyan wies darauf hin , hier :

ffmpeg -i in.mp4 -c copy -bsf:v "h264_metadata=sample_aspect_ratio=4/3" out.mp4
drake7
quelle
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
MMM