Reduzieren der Videogröße bei gleichem Format und Reduzieren der Bildgröße

74

Diese Frage könnte sehr grundlegend sein

Gibt es eine Möglichkeit, die Bildgröße / -rate des verlustkomprimierten Formats (WMV, MPEG) zu reduzieren, um ein kleineres Video mit geringerer Größe und demselben Format zu erhalten?

Gibt es dafür Open Source oder proprietäre APIs?

Vignesh
quelle

Antworten:

91

ffmpeg bietet diese Funktionalität. Alles, was Sie tun müssen, ist etwas wie laufen

ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>

Bei neueren Versionen von ffmpeg müssen Sie ändern -bzu -b:v:

ffmpeg -i <inputfilename> -s 640x480 -b:v 512k -vcodec mpeg1video -acodec copy <outputfilename>

Konvertieren der Eingangsvideodatei in ein Video mit einer Größe von 640 x 480 und einer Bitrate von 512 Kilobit / Sek. mithilfe des MPEG 1-Videocodecs und Kopieren des ursprünglichen Audiostreams. Natürlich können Sie alle benötigten Werte eingeben und mit der Größe und Bitrate herumspielen, um den gewünschten Kompromiss zwischen Qualität und Größe zu erzielen. Es gibt auch eine Menge anderer Optionen, die in der Dokumentation beschrieben sind

Führen Sie ffmpeg -formatsoder ffmpeg -codecsfür eine Liste aller verfügbaren Formate und Codecs. Wenn Sie für die endgültige Ausgabe keinen bestimmten Codec als Ziel festlegen müssen, können Sie mit einem Codec nach dem neuesten Stand der Technik wie H.264 bessere Komprimierungsverhältnisse bei minimalem Qualitätsverlust erzielen.

Jason B.
quelle
8
-b muss -b: v für vid Bitrate sein
Herr AH
4
@ MrAH, danke für das Update. Es scheint, dass sich die Benutzeroberfläche geändert hat, seit ich dies gepostet habe. Früher war es -bfür die Video-Bitrate und -abfür die Audio-Bitrate, aber es hat sich geändert zu -b:[stream specifier].
Jason B
3
Der Befehl ist etwas unvollständig. Es fehlt, dass Sie auch den Namen Ihrer Ausgabedatei ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>
eingeben müssen
@ JasonB Hey Kumpel, das ist großartig. Wissen Sie, wie das mit NodeJS geht?
Chanaka De Silva
@ JasonB Ich habe ein Video von 9 MB, wenn ich Ihren Code verwende, dessen Größe auf 16
MB
37

Wenn Sie die gleiche Bildschirmgröße beibehalten möchten, können Sie den crf-Faktor verwenden: https://trac.ffmpeg.org/wiki/Encode/H.264

Hier ist der Befehl, der für mich funktioniert: (Auf einem Mac müssen Sie hinzufügen -strict -2, um einen Audio-Codec verwenden zu können.

ffmpeg -i input.mp4 -c:v libx264 -crf 24 -b:v 1M -c:a aac output.mp4
rebe100x
quelle
Guter Vorschlag, außer dass Sie nicht den eingebauten AAC-Encoder von FFmpeg verwenden: Es klingt nach Mist. Wenn Sie AAC möchten, verwenden Sie zumindest libfdk-aac oder bevorzugen Sie heutzutage Opus-Audio (völlig kostenlos / Open Source / nicht patentiert und wettbewerbsfähig mit den besten AAC-Encodern. Weitaus besser als die schlechtesten AAC-Encoder wie FFmpegs -c:a aac). Verwenden Sie -c:a libopus -b:a 64koder so etwas. (Beachten Sie jedoch, dass MP4-Container kein Opus-Audio enthalten können.)
Peter Cordes
-b:v 1Müberschreibt -crf. Verwenden Sie nicht beide. Verwenden Sie einfach CRF.
Peter Cordes
30

Anstatt feste Bitraten zu wählen, können Sie mit dem H.264-Codec auch eine andere Voreinstellung auswählen, wie unter https://trac.ffmpeg.org/wiki/x264EncodingGuide beschrieben . Ich fand auch Video Encoder Vergleich in KeyJs Blog ( archivierte Version ) eine interessante Lektüre, es vergleicht H.264 mit Theora und anderen.

Es folgt ein Vergleich verschiedener Optionen, die ich ausprobiert habe. Das aufgenommene Video hatte ursprünglich eine Größe von 673 Millionen und wurde mit RecordMyScreen auf einem iPad aufgenommen . Es hat eine Dauer von ungefähr 20 Minuten mit einer Auflösung von 1024 x 768 (wobei die Hälfte des Videos leer ist, also habe ich es auf 768 x 768 zugeschnitten). Um die Größe zu reduzieren, habe ich die Auflösung auf 480x480 gesenkt. Es gibt kein Audio.

Die Ergebnisse unter Verwendung derselben 1024 x 768 als Basis (und Anwenden von Zuschneiden, Skalieren und einem Filter ):

  • Ohne spezielle Optionen: 95M (Codierungszeit: 1m19s).
  • Mit nur -b 512khinzugefügt, fiel die Größe auf 77M (Codierungszeit: 1m17s).
  • Mit nur -preset veryslow(und nein -b) wurde es 70M (Codierungszeit: 6m14s)
  • Mit beiden -b 512kund -preset veryslowwird die Größe 77M (100K kleiner als nur -b 512k).
  • Mit -preset veryslow -crf 28bekomme ich eine 39M-Datei, die 5m47s gedauert hat (ohne visuellen Qualitätsunterschied für mich).

N = 1, nehmen Sie die Ergebnisse mit einem Körnchen Salz und führen Sie Ihre eigenen Tests durch.

Lekensteyn
quelle
Ohne Ratenoptionen ist der x264-Standardwert -crf 23. Aber ja, für das einmalige Codieren von Streams sollten Sie so etwas wie verwenden -preset veryslow. Kein Wunder, dass dies bei einer Bildschirmaufnahme sehr gut funktioniert . Normalerweise müssen Sie nicht verkleinern, es sei denn, Sie streben sehr niedrige Bitraten an. Wenn die Details auf mehr Pixel verteilt bleiben, können Codecs die Details besser erhalten. Artefakte um scharfe Kanten haben in der Regel eine feste Anzahl von Pixeln, sodass eine höhere Auflösung die Artefakte kleiner macht. (Obwohl weniger Bits pro Pixel mehr Quantisierung bedeuten, verschwimmt ein Teil davon anstelle von Artefakten.)
Peter Cordes
4

Es gibt eine Anwendung für Mac und Windows. Rufen Sie Handbrake an. Ich weiß, dass dies kein Befehlszeilenmaterial ist, sondern eine schnell zu öffnende Datei. Wählen Sie das Ausgabedateiformat und die grobe Ausgabegröße aus, während Sie die meisten guten Dinge über das Video behalten, dann ist dies gut , es ist nur eine grafische Ansicht von ffmpeg von seiner besten Seite ... Es unterstützt die Befehlszeileneingabe für diese eingefleischten Texter. https://handbrake.fr/downloads.php

Jimbo Bryant
quelle
4

Ich wollte dies zu kürzlich tun, deshalb habe ich ein Tool namens Shrinkwrap erstellt , das FFmpeg zum Transcodieren von Videos verwendet und dabei so viele der ursprünglichen Metadaten wie möglich beibehält (einschließlich Zeitstempel für Dateimodifikationen).

Sie können es als Docker-Container ausführen:

docker run -v /path/to/your/videos:/vids bennetimo/shrinkwrap \
--input-extension mp4 --ffmpeg-opts crf=22,preset=fast /vids

Wo:

  • In / path / to / your / videos / befinden sich die Videos, die Sie konvertieren möchten
  • --input-extension ist die Art von Videos, die Sie verarbeiten möchten, hier .mp4
  • --ffmpeg-opts ist eine beliebige FFmpeg-Option, mit der Sie den Transcode anpassen möchten

Anschließend werden alle Videodateien, die der Erweiterung entsprechen, rekursiv gefunden und in gleichnamige Dateien mit einem -tcSuffix umgewandelt.

Weitere Konfigurationsoptionen, Voreinstellungen für GoPro usw. finden Sie in der Readme-Datei .

Hoffe das hilft jemandem!

Bennetimo
quelle
3
ffmpeg -i <input.mp4> -b:v 2048k -s 1000x600 -fs 2048k -vcodec mpeg4 -acodec copy <output.mp4>
  • -i Eingabedatei

  • -b: v Videobitrat des Ausgabevideos in Kilobyte (Sie müssen es versuchen)

  • -s Abmessungen des Ausgabevideos

  • -fs FILESIZE des ausgegebenen Videos in Kilobyte

  • -vcodec videocodec ( ffmpeg -codecszum Auflisten aller verfügbaren Codecs)

  • -acodec Audio Codec für Ausgabe Video (nur den Audiostream kopieren, nicht temperieren)
Rumroedeln
quelle
1
-fsbewirkt, dass FFmpeg die Codierung beendet, nachdem diese Dateigröße erreicht wurde. Es ist keine Zieldateigröße für die Ratenberechnung. Wenn Sie -b:vrichtig verstanden haben, hat Ihre Datei ohnehin die richtige Größe, und wenn Sie sie falsch verstanden haben, ist sie kleiner oder abgeschnitten.
Peter Cordes