ffmpeg - libx264

  • Hallo,

    Ich habe hier eine AVI-Datei mit den Format Video:1920x1080p,16:9,59.950fps (60000/1001) 4:2:2,JPEG Audio: 48.0 kHz,24bit,2 channel,PCM(Little). Das zeigt mir jedenfalls Mediainfo an.

    Ich möchte daraus ein MKV machen. Vorlage soll sein:
    x264 -crf 18 --preset slow --tune film --bluray-compat --vbv-maxrate 40000 --vbv-bufsize 30000 --level 4.1 --keyint 24 --open-gop --slices 4 --colorprim "bt709" --transfer "bt709" --colormatrix "bt709" --sar 1:1 --pass 1 -o out.264 input.file

    Das ganze soll mit ffmpeg unter "Linux-Mint 18.1 Mate 64bit" ausgeführt werden, mit gleichtzeitiger Audioverarbeitung PCM -> AC3 als Resultat mkv.

    Die Anleitungen die mit google zu finden sind erschlagen mich, wiedersprechen sich und sind total unterschiedlich. Liegt wohl daran das ffmpeg unterschiedlich kompiliert werden kann. Hab ich so mit meinem rudimentären Englisch verstanden. Ich blick da nicht mehr durch bei ffmpeg mit seinen gefühlten 1000 Optionen.

    1. Wo bekommt man ein aktuelles ffmpeg her OHNE selbst kompilieren zu müssen. Mir graut es vor den Abhängigkeiten und deren Abhänigkeiten die für's Kompilieren notwendig sind. In der Paketverwaltung ist wie so häufig nur eine alte Version verfügbar die keine "shuffleframes" unterstützt.

    2. Wie muß die ffmpeg Befehlszeile aussehen ?

    Ich hab mir hier ein Beispiel zusammengefrickelt:
    ffmpeg -i input.avi -vf shuffleframes="0 -1 -1 1 -1" -c:v libx264 -level 41 -preset slow -crf 18 -g 24 -threads 8 -x264opts bluray-compat=1:vbv-bufsize=30000:vbv-maxrate=40000 -c:a ac3_fixed -ar 48000 -ab 256k -y output.mkv

    In manchen Beispielen wird "libx264" in der Befehlszeile weggelassen, wird "-x264opts" verwendet oder auch nicht, wird "x264-params" verwendet oder auch nicht. Ich blick auch hier nicht mehr durch.
    Mir ist auch nicht klar ob das 24bit PCM erst nach 16bit gewandelt werden muß um nach AC3 encodet zu werden.

    Wäre sehr dankbar dafür wenn mich jemand aufzuklären würde.

    Gruß ggrub

  • zu 1.: https://launchpad.net/~jonathonf/+archive/ubuntu/ffmpeg-3 hat immer ne relativ aktuelle Version (meist neuer als 1 Monat). Wirklich up-to-date kriegt man nur wenn man selber compiliert.
    zu 2: 'x264opts' ist alt und wurde durch 'x264-params' ersetzt. => Man sollte heutzutage 'x264-params' verwenden.
    Der PCM Ton sollte von ffmpeg automatisch nach 16bit beim Umwandeln nach ac3 konvertiert werden.

    Zitat

    In der Paketverwaltung ist wie so häufig nur eine alte Version verfügbar die keine "shuffleframes" unterstützt.


    Dabei ist 'shuffleframes' seit 3.0 (2016-02-14) fest in ffmpeg drinnen,...

    Cu Selur

  • Schau's dir an:

    Code
    $ ffmpeg -version
    ffmpeg version 2.8.11-0ubuntu0.16.04.1 Copyright (c) 2000-2017 the FFmpeg developers
    built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609

    Original aus der Paketverwaltung (Repository). Selbstverständlich nach einem "apt update/upgrade".

    Ok, aber woher weiß man denn was hinter "libx264" und was hinter "x264-params" eingetragen werden muß ?

  • Es gibt ein paar x264-Parameter, die als ffmpeg-Parameter "durchgereicht" werden, das kann man sich eventuell aus der ausführlichen Hilfe-Ausgabe zusammenreimen. Beispielsweise unterstützt ffmpeg Angaben zur (mittleren Ziel-) Bitrate oder übergeordneter Preset-Namen als Steuermöglichkeit für eine Vielzahl von Encodern.

    Code
    ffmpeg -version 2> ffmpeg.txt
    ffmpeg -h full >> ffmpeg.txt

    Im Abschnitt "AVCodecContext AVOptions:" stehen alle Parameter, die für beliebige Codecs mehr oder weniger unterstützt werden.

    Im Anschnitt "libx264 AVOptions:" stehen alle libx264-Optionen, die ffmpeg als eigene Parameter veröffentlicht, die also nicht in "-x264opts ..." angehängt werden müssen.

    Für Windows ist eine eigene Compilierung übrigens gar nicht so schwer, dafür wird die media-autobuild_suite regelmäßig gepflegt; unter Linux weiß ich leider nicht, wie gut da die Pflege ähnlicher Projekte ist, aber in der Dokumentation der MABS werden Quellen erwähnt, von denen man sich hat inspirieren lassen... Vielleicht reichen ja relativ geringe Änderungen an der MABS, dass sie nicht für eine MSYS-Umgebung, sondern für ein echtes Linux compiliert und installiert.

  • Zitat

    Im Anschnitt "libx264 AVOptions:" stehen alle libx264-Optionen, die ffmpeg als eigene Parameter veröffentlicht, die also nicht in "-x264opts ..." angehängt werden müssen.

    Und genau das hab ich nicht kapiert. Jetzt isses mir klar, danke.

    Es steht geschrieben:

    Zitat

    9.148 shuffleframes

    Reorder and/or duplicate and/or drop video frames.
    It accepts the following parameters:
    mappingSet the destination indexes of input frames. This is space or ’|’ separated list of indexes that maps input frames to output frames. Number of indexes also sets maximal value that each index may have. ’-1’ index have special meaning and that is to drop frame.
    The first frame has the index 0. The default is to keep the input unchanged.
    9.148.1 Examples


    • Swap second and third frame of every three frames of the input: ffmpeg -i INPUT -vf "shuffleframes=0 2 1" OUTPUT
    • Swap 10th and 1st frame of every ten frames of the input: ffmpeg -i INPUT -vf "shuffleframes=9 1 2 3 4 5 6 7 8 0" OUTPUT

    Jetzt hab ich ein progressives 59.950fps mjpeg-avi dessen Urspung 23.976fps ist. Da wurden einfach abwechselnd die Frames verdoppelt und verdreifacht. Nun will ich mit ffmpeg daraus wieder 23.976fps machen. Sollte ja mit "shuffleframes gehen. "Selurs" Hybrid bekommt das hin. Da wird mit ffmpeg eingelesen und nach x264 ge(pipe)t. Das sollte doch dann eigentlich auch nur mit ffmpeg hinzubiegen sein, oder ?

    Warum funktioniert das nicht mit:

    Code
    ffmpeg -i input.avi -vf "shuffleframes=-1 1 -1 3 -1" -c:v libx264 -preset slow -tune film -profile:v high -level 41 -crf 18 -pix_fmt yuv420p -c:a ac3 -ar 48000 -ab 256k -y ~/output.mkv


    Der erste Frame hat Index 0, und wenn ich nun Frame 2 + 4 nehme, und das alle 5 Frames passiert, sollten doch 23.976 erreicht werden. Da passiert aber nix. Eine Fehlermeldung erscheint auch nicht. Das resultirende mkv-Video hat nach wie vor 59.950fps. Warum ?

  • Da müssen vermutlich neue Timestamps generiert werden, also irgendwie mit setpts oder so. Weiß jetzt aber auch nicht wirklich wie, mache so etwas über AviSynth o.ä.

    Mit shuffleframes wäre ich vorsichtig. Wenn das Muster nicht 100% durch die ganze Datei paßt, wird es ruckeln.

    Einmal editiert, zuletzt von sneaker2 (20. August 2017 um 18:10)

  • 1. sollte es nicht statt:

    Code
    shuffleframes=-1 1 -1 3 -1


    eher:

    Code
    shuffleframes=-1 0 -1 1 -1


    sein?
    2. '-r 23.976' muss vermutlich auch noch in den Aufruf (irgendwo hinter der Quelle, nicht vor der Quelle).
    3. sneaker2 hat recht wenn das Pattern nicht durch den ganzen Clip geht wäre man mit Avisynth/Vapoursynth und sRestore&Co besser beraten.

    Cu Selur

  • Mein Englisch ist zwar nur rudimentär, aber "shuffleframes=-1 1 -1 3 -1" ist richtig, habe es gestern ausführlich getestet. Das Video wurde sauber wiedergegeben. ffmpeg hat aber noch ein paar andere Eigenarten auf die ich aber jetzt hier nicht eingehen will.
    Avisynth unter Linux geht nicht, auf WINE-Gefrickel verzichte ich lieber. Und Vapoursynth tu ich mir NICHT an. Das Thema hatten wir ja schon. Da bleibt dann kaum noch was übrig um von 59.950 auf 23.976 zu kommen.
    Und ja, es ist mir bei einem Video passiert das mitten im Film die Ruckelei anfing weil da eine Störung vorhanden war. "shuffleframes" ist halt nicht optimal für mein Vorhaben, aber halt die einzige Variante.

    Ich wollte ja dazu das ffmpeg Equivalent schaffen:

    Code
    x264 -crf 18 --preset slow --tune film --bluray-compat --vbv-maxrate  40000 --vbv-bufsize 30000 --level 4.1 --keyint 24 --open-gop --slices 4  --colorprim "bt709" --transfer "bt709" --colormatrix "bt709" --sar 1:1  --pass 1 -o out.264 input.file

    ... und das sieht jetzt unter ffmpeg so aus:

    Code
    ffmpeg -y -threads 8 -ss 00:00:00.016 -i "input.avi" -to 00:52:59.826 -vf shuffleframes="-1 1 -1 3 -1" -c:v libx264 -preset medium -tune film -profile:v baseline -level 4.1 -crf 18 -pix_fmt yuvj420p -g 24 -bluray-compat 1 -flags cgop -sar 1:1 -r 24000/1001 -slices 4 -nal-hrd vbr -x264-params vbv-maxrate=40000:vbv-bufsize=30000 -color_primaries 1 -color_trc 1 -colorspace 1 -c:a ac3 -ar 48000 -ab 256k /output.mkv

    Und wie man sieht ist auch zusätzlich framegenauer Schnitt möglich, da ja das AVI quasi nur I-Frames hat. Es hat bisher einwandfrei funktioniert, Video/Audio sind/waren syncron. Hab mir gestern 2 Videos angeschaut.

    Noch mal die Frage an Selur, ob man nicht doch diese CUT Möglichkeit für AVI's ohne Vorschau in Hybrid einbauen könnte. Wenn ich mir als Unwissender vorstelle in der ffmpeg Kommandozeile einfach "-ss xx:xx:xx.xxx" und "-to xx:xx:xx.xxx" über eine Maske (vielleicht da wo die Eingabe der "shuttleframes" ist) einzubauen, das sollte doch machbar sein. Stelle mich zum Testen gerne zur Verfügung ;)

  • Bei Intra-Only-AVIs geht das; bei Videos mit effizienten Codecs kann aber der Schnittpunkt an der nächstmöglichen Stelle liegen, die evtl. mehrere Sekunden weit weg liegt. Und dann fangen die Nutzer ohne jegliches Halbwissen wieder mit Jammern an, dass das Programm totaaaal buggggyyyy ist. :rolleyes:

  • "shuffleframes" ist halt nicht optimal für mein Vorhaben, aber halt die einzige Variante.

    Code
    ffmpeg -y -threads 8 -ss 00:00:00.016 -i "input.avi" -to 00:52:59.826 -vf shuffleframes="-1 1 -1 3 -1" -c:v libx264 -preset medium -tune film -profile:v baseline -level 4.1 -crf 18 -pix_fmt yuvj420p -g 24 -bluray-compat 1 -flags cgop -sar 1:1 -r 24000/1001 -slices 4 -nal-hrd vbr -x264-params vbv-maxrate=40000:vbv-bufsize=30000 -color_primaries 1 -color_trc 1 -colorspace 1 -c:a ac3 -ar 48000 -ab 256k /output.mkv


    Schau dir mal die ffmpeg Filter dejudder,fieldmatch,decimate, pullup usw ... an.

    -profile:v baseline -pix_fmt yuvj420p

    die würde ich nur setzen, wenn du weisst, das du tust.

  • Bei Intra-Only-AVIs geht das


    Selbsverständlich ist das so. Und wenn bei der Eingabe die Feldbeschreibung lautet: NUR FÜR INTRA-AVIs, dann muß das reichen. Ein wenig Hirnmasse muß man schon erwarten können.

    Schau dir mal die ffmpeg Filter dejudder,fieldmatch,decimate, pullup usw ... an.

    -profile:v baseline -pix_fmt yuvj420p

    die würde ich nur setzen, wenn du weisst, das du tust.

    "dejudder,fieldmatch,decimate, pullup" ... werde ich machen.

    "wenn du weisst, das du tust" ... kannst du das kurz erläutern ?

    EDIT: Ist wohl ein Fehler. Müßte eher -pix_fmt yuv420p sein. Muß man das Eingangsformat auch angeben ? Das AVI hat YUV 422 (laut Media info)

    Einmal editiert, zuletzt von GGRUB (21. August 2017 um 16:36)


  • "wenn du weisst, das du tust" ... kannst du das kurz erläutern ?


    Das ich diese beiden Parameter nicht bei einer bluray Codierung erwarten würde.
    z.B. Baseline Profile war eher für inzwischen ältere Handys gedacht.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!