ffmpeg - Wie kopiere | extrahiere ich Codierungseinstellungen aus einer vorhandenen Mediendatei?

19

Ich wollte das jetzt mehrmals können, also frage ich.

Wenn ich eine vorhandene Video- oder Audiodatei, ffmpeg, mplayerund andere Spieler - Medien können zumindest erkennen einige seiner „EIGENSCHAFTEN , “ wie Container, Codec und Bitrate verwendet, wahrscheinlich verschiedene Qualität und Codieren spezifische Einstellungen etc.

Wie kann ich diese Einstellungen aus einer vorhandenen Datei extrahieren, um sie (direkt) für die Codierung mit ffmpeg zu verwenden?

Zum Beispiel habe ich ein mkvVideo x264mit einigen Einstellungen und eine andere unkomprimierte aviDatei codiert bekommen . Ich möchte die Kodierungseinstellungen, die in der x264 mkv-Datei verwendet werden, "kopieren", um die AVI-Datei mit denselben Einstellungen zu transkodieren .

Hinweis: Ich suche nach einer Möglichkeit, die keine menschliche Arbeit mit dem "Übersetzen" der Einstellungen von einem Decoder in den Encoder beinhalten sollte. Es ist in Ordnung, wenn ich die Einstellungen zuerst extrahieren und irgendwo speichern muss, aber ich möchte die Leseoptionen einfach in eine Befehlszeile oder eine | voreingestellte Konfigurationsdatei für ffmpeg übertragen können.

n611x007
quelle
Nun, Sie könnten wahrscheinlich die Ausgabe von sortieren ffprobe(insbesondere mit den Optionen -show_streamsund -show_format) und diese Informationen verwenden, um die wichtigen
Dinge zu skripten
1
Die Verwendung der gleichen Einstellungen, z. B. der Bitrate (der Versuch, die exakte Bitrate zu kopieren, scheint bei den Benutzern beliebt zu sein), führt häufig nicht zu einer optimalen Qualität. Natürlich habe ich keine Ahnung, wie Ihre typische Eingabe ist, aber bei x264 -crfwird generell empfohlen, diese Option zu verwenden. Weitere Informationen finden Sie im FFmpeg- und x264-Codierungshandbuch .
Logan
Ich kann nichts über die Kodierungseinstellungen in der Ausgabe von
ffprobe finden
Es zeigt nur die Anzahl der ReFrame, nicht aber die anderen Einstellungen wie Mediainfo tut
thelolcat
Die Eingabesyntax mit ffmpeg unterscheidet sich von den Metadatenfeldern. Sie könnten z. B. channels:6aus einer Videodatei lesen , aber um sie zu codieren, müssten Sie den Schalter verwenden -ch:6. Einige Schalter verwenden einen Buchstaben, andere zwei usw.
Jiggunjer

Antworten:

10

Es gibt keine automatische Möglichkeit, dies zu tun. Sie müssen sich die Parameter der Originaldatei ansehen und sie auf die Ausgabedatei anwenden.

In den meisten Fällen sind dies die folgenden:

  • Containerformat (MP4, MKV,…)
  • Video- und Audio-Codec (H.264, H.265,…)
  • Audio-spezifisch:
    • Anzahl der Audiokanäle
    • Audio-Abtastrate
    • Audio Bitrate
  • Videospezifisch:
    • Profil und Level (um Kompatibilität zu gewährleisten, siehe hier )
    • Maximale Bitratenbeschränkungen (zB für H.264 )
    • Maximale Videoauflösung, Änderung über -filter:v scaleoder-s:v
    • Framerate ändern über -filter:v fps -r
    • Chroma-Unterabtastung, Änderung über -pix_fmt(z. B. -pix_fmt yuv420psollte Ihnen die beste Kompatibilität bieten)
    • GOP-Größe (Abstand zwischen IDR-Frames), eingestellt über -g
    • Andere spezifische Kodierungseinstellungen

Aber selbst wenn Sie das in Ordnung bringen, benötigen einige Geräte möglicherweise spezielle, proprietäre Informationen, die in den Bitstream eingebettet sind.


Was die spezifische Aufgabe der Verwendung betrifft x264, wird dies nicht trivial sein. Mir ist kein einziges Skript bekannt, das diese Aufgaben erledigt, die normalerweise manuell ausgeführt werden. Für die meisten Informationen zu den Kodierungseinstellungen können Sie unter Unix / Linux oder OS X mediainfoeinige Bash-Tricks verwenden.

Beispiel für ein x264-codiertes Video in einer MP4-Datei:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Dies gibt eine Liste von x264-Optionen aus:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

Sie können diese Optionen dann manuell an die x264-Binärdatei übergeben.

Wenn Sie FFmpeg durchlaufen, ist das allerdings etwas komplizierter, da nicht alle x264-Optionen so zugeordnet werden können oder sollten. Beachten Sie, dass eine einfache Voreinstellung, Melodie- und Profilspezifikation oftmals ebenfalls ausreicht (wie in x264 --fullhelpund im x264-Codierungshandbuch zu sehen ). Die Angabe des CRF-Pegels ist ausreichend.

Dabei geht es nicht einmal um Audio, bei dem es zum Glück nicht so viele Optionen gibt.

slhck
quelle
Also ist es mit ffprobe oder ffmpeg nicht möglich?
Thelolcat
Nein, das ist mit ffprobe / ffmpeg nicht direkt möglich. Im Falle von x264-codiertem Video würde ich die mediainfoAusgabe verwenden und diese Optionen mit ffmpeg abbilden -x264-params. (Siehe auch die x264-Codierungsanleitung ). Wenn Sie jedoch eine allgemeine Lösung für alle Arten von Codecs / Codierern oder Containerformaten suchen, müssen Sie ein mäßig komplexes Skript schreiben, das die Konvertierung ausführt.
Slhck