Wie kann man 4k mit ffmpeg auf 1080p herunterrechnen und dabei die Qualität beibehalten?


20

Ich habe 4K 3840x2160-Filmmaterial im MP4-Format, das ich auf 1080p reduzieren muss. Ich habe versucht zu rennen

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

Das Ergebnis ist jedoch eine sehr schlechte Qualität, da das gesamte Bild aus quadratischen "Kacheln" besteht, als würde ich 4: 1 vergrößern.

Hier ist die Ausgabe dieses Befehls:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

Ich weiß aus Erfahrung, dass ffmpeg ein ausgezeichnetes Werkzeug ist, also muss ich die Optionen / Parameter irgendwie vermasseln ...

Wie kann ich das machen?


Zeigen Sie die vollständige Konsolenausgabe Ihres Befehls an. Sie können nur ein kurzes Segment codieren. Fügen Sie dies hinzu -t 10, um eine Ausgabe von 10 Sekunden zu erzielen. Warum möchten Sie verkleinern? Was ist der Anwendungsfall für Ihre skalierte Ausgabe? Diese Informationen helfen mir, eine genauere Antwort zu geben.
Logan

@ LordNeckbeard Ich habe gerade die Konsolenausgabe hinzugefügt. Ich möchte das Bild verkleinern, damit ich diese Clips einfacher für andere Benutzer freigeben kann, die mit mir zusammenarbeiten.
Lara Michaels

1
Vergessen Sie nicht -c:a copy, da Sie den Audiostream nicht neu codieren möchten oder müssen. Verwenden Sie eine -map 0beliebige Kapitel Metadaten oder andere Sachen zu kopieren. (ffmpeg nimmt standardmäßig nur 1 vid + 1 aud an.)
Peter Cordes

1
Außerdem -sws_flags lanczos+print_infowird ein besseres Skalierungsalgo als das Standardalgo verwendet (bilinear, denke ich). Die Antwort von stlb deckt den Teil des Videokodierungsprozesses ab.
Peter Cordes

2
@PeterCordes Alternativ dazu scale=1920:-2:flags=lanczos. -2In meiner nicht existierenden Antwort wollte ich auch die Maßstabsangabe erwähnen . Für diejenigen, die nicht wissen, dass Sie -2Breite oder Höhe eingeben können, wird automatisch der richtige Wert bereitgestellt, wobei das Seitenverhältnis beibehalten und der Wert durch 2 teilbar gemacht wird (erforderlich für libx264 für yuv420p-Ausgaben).
Logan

Antworten:


17

Die Standardeinstellungen für ffmpeg sind von sehr geringer Qualität, und da Sie keinen Codec oder Qualitätsparameter angeben, werden nur die Standardeinstellungen verwendet (ich weiß nicht, warum die Entwickler das nicht beheben, weil es in den Foren viele Fragen aufwirft) überall).

Bearbeiten : Die Standardeinstellungen sind jetzt ganz normal. Bei einem neueren Build von ffmpeg müssen Sie lediglich Eingabe- und Ausgabedateien angeben, um gute Ergebnisse zu erzielen. Sie können natürlich nach Herzenslust optimieren.

Versuchen Sie -c:v libx264 -crf 20 -preset slow, dem Befehl etwas hinzuzufügen .

  • -c:v libx264 weist es an, den libx264-Encoder zu verwenden,
  • crf 20 verwendet den Constant Rate Factor Quantizer (der paradoxerweise variable Bitrate, aber konstante Qualität bedeutet) mit einem Wert von 20 (ziemlich gute Qualität; weniger ist bessere Qualität / größere Dateien, höher ist crappier / kleiner),
  • Das slowPreset ist eine Abkürzung für eine Reihe von Encoder-Einstellungen, was bedeutet, dass es etwas mehr Aufwand erfordert als das Standard-Preset (Medium).

Sie können diese Einstellungen anpassen. Anweisungen zu den zu ändernden Reglern finden Sie im Handbuch zur h.264-Codierung .

Und wenn Sie das Audio so verwenden, wie es ist, fügen Sie hinzu c:a copy. Dadurch wird eine direkte Kopie des Audiostreams ohne Neucodierung erstellt.


Die Standardeinstellungen hängen vom Encoder ab. libx264 wird normalerweise standardmäßig für die MP4-Ausgabe verwendet und liefert eine gute Ausgabequalität ohne zusätzliche Optionen, aber der in der Frage enthaltene ffmpeg-Build scheint diesen Encoder nicht zu unterstützen und verwendet daher den alten Encoder mpeg4, der MPEG-4 Part 2-Video produziert, und Die Standardeinstellungen waren in seiner Blütezeit vernünftiger (z. B. für 320 x 240 usw.).
Logan

Es ist gut zu hören, dass libx264 jetzt die Standardeinstellung ist.
Stib

Ich würde sagen, CF 20 ist verdammt gut. 18 ist funktional verlustfrei. Ich mache die meisten meiner Videos um 23.
user24601

Die meisten meiner Arbeiten werden auf Wiedergabegeräten angezeigt, die lokal von einer SD-Karte aus arbeiten. Ich muss nicht viel für die Größe optimieren, also lasse ich die Qualität so hoch wie möglich. Ich stimme zu, ich würde es abwählen, wenn ich über das Internet liefern würde.
Stib

Das hat mir nicht geholfen. Ich habe immer noch eine blockartige Verrücktheit, wo immer im Video Bewegung auftritt. crf von 18, voreingestellt auf langsam. 2,7k-> 1080p.
rewolf

0

Verwenden Sie avconv, wenn Sie möchten:

avconv -i 4kfile.mp4 -s hd1080 -c:v libx264 -c:a copy fullhdfile.mp4
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.