mencoder h264 smart copy

  • Anmerkung beziehe mich im folgenden auf die x264 Parameter der CL version, wie die in mencoder umgesetzt werden muss man nachschauen. ;)

    Format profile : High@L4.0
    ->
    --profile high (gibt noch main und basic)
    --level 4.0 (gibt da noch einige andere,...)
    (kann man quasi 1:1 übernehmen)
    Format settings, CABAC : Yes
    -> falls hier No steht braucht man '--no-cabac'

    Interlacement : Interlaced
    ->
    --interlaced
    --aud

    generell würde ich auch immer noch:
    --weightp 0

    nehmen, alles andere sollte bei einem GOP keine Probleme machen.

    Cu Selur

    Ps.: scenecut=0 warum dies?

  • Hi Selur,
    danke für deine Antwort. scenecut=0 brauche ich wie gesagt dafür, dass mencoder nicht durch seine eigene Szenenerkennung Keyframes setzt. Als Bsp.: Ich will bei Frame 64 der GOP ein Keyframe setzen. Als ich den Parameter mit scenecut nicht hatte, hat er mir einfach bei Frame 50, aber keines mehr bei Frame 64 gesetzt. Insofern setzt er also wirklich dann bei 64, 128 ... ein Keyframe.

    Zum Verständnis: Wofür steht denn L4.0, Cabac und weightp?

  • L4.0 = sagt das der Stream dem AVC Level 4.0 kompatibel ist, was wiederum einige andere Sachen impliziert, siehe: http://de.wikipedia.org/wiki/H.264#Level
    CABAC = besagt das als Entropy Coder CABAC und nicht CAVLC verwendet wird. (ersteres ist effizienter braucht aber mehr Power)
    WeightP aktiviert die Nutzung von weighted P Frames, womit aber manche Decoder nicht klar kommen. :)

    Zum KeyFrame, anstatt: keyint=(FrameSchnittpunkt-Keyframe1):scenecut=0
    solltest Du mal eher gucken wie man ein qpfile in Mencoder angeben kann. (Mit einem qpfile kann man keyframes an einer bestimmten Position erzwingen) ;)
    Ist ja egal wo sonst noch Keyframes existieren, hauptsache ist das bei Frame 64 ein ist. ;)
    (Persönlich nutze ich mencoder immer nur als Decoder und pipe seine Ausgabe als Yv12 zu x264, was es einem erlaubt die x264 Syntax zu nehmen. (Auch lässt sich x264 einfacher kompilieren als mencoder)


    Cu Selur

  • Hm, das mit der qpfile ist nicht blöd... Hatte grad nämlich auch eine Datei vorliegen, bei der der Schnittpunkt ein Frame nach dem Keyframe lag. Am Anfang der Datei war also jedes Frame ein Keyframe. Wurde aber andstandslos dann abgespielt.

    Hab mal gegooglet, ich glaube das mit dem qpfile kann nur ffmpeg, oder?

  • Ne, ffmpeg geht nicht direkt, da müsste man pipen:

    Code
    ffmpeg -r INPUTFRAMERATE -i "Inputfile" -v 0 -vsync 0 -an  -r INPUTFRAMERATE  -pix_fmt yuv420p -f rawvideo - | x264 --crf 18 --fps 25 --output "AUSGABE" - AUFLÖSUNG-DES-FILES


    also z.B.:

    Code
    ffmpeg -r 25 -i "test.avi" -v 0 -vsync 0 -an  -r 25 -pix_fmt yuv420p -f rawvideo - | x264 --crf 18 --fps 25 --output "D:\EncodingTemp\test_00_17_36_710.264" - 640x352

    Cu Selur

  • Und wo ist da jetzt die qpfile?
    ffmpeg will ich eig. eh nicht benutzen, denn im Gegensatz zu mencoder müsste ich zum Schneiden der Datei erst den Index reparieren und das nimmt mir dann nochmal ca. eine Minute. Soll ja ähnlich schnell sein wie VDub.

    Kennst du bzw. kennt niemand da eine andere Möglichkeit?

  • Zitat

    Und wo ist da jetzt die qpfile?

    Um ein qpFile bei x264 z nutzen muss noch der Parameter --qpFile "PFAD ZUM QPFILE" dabei. ;)

    Zitat

    denn im Gegensatz zu mencoder müsste ich zum Schneiden der Datei erst den Index reparieren und das nimmt mir dann nochmal ca. eine Minute.

    Das liegt daran, dass Du .avi Dateien verwendest, wenn Du nur VideoOnly Dateien hast wären RAW .264 Streams sinniger und wenn Du Audio&Video in einem verarbeitest, kann .avi allein schon Probleme machen weil es z.B. mit aac einiges an Problemen hat. (.mp4/.mkv wäre als Container vermutlich sinniger)

    Du kannst anstatt von ffmpeg auch von mencoder aus zu x264 pipen, musst da nur
    "-vf scale,format=i420 -ovc raw -noskip -forcedsubsonly -mc 0 -nosound -of rawvideo -o - "
    verwenden,...
    Was mir aber gerade einfällt vermutlich ist der 'Umweg' über einen separaten x264 Encoder für Dich aber eher hinderlich, da Du dann den Audiostream separiert betrachten müsstest.
    Hab gerade mal in den Mencoder-Sourcecode geguckt und aktuell scheint dieser (wie ffmpeg) den qpfile Parameter nicht zu unterstützen. :(
    ->
    Davon ausgegangen Du willst Audio&Video gleichzeitig schneiden, scheint es so, dass Du bei Deiner etwas (vor allem bei großen GOPs) suboptimalen 'keyint=(FrameSchnittpunkt-Keyframe1):scenecut=0'-Methode bleiben müsstest wenn Du dem Projekt durch das separate Audioencoding nicht einiges mehr an Komplexität geben willst oder einen eigenen Mencoder build machen willst bei dem Du den qpfile-Support noch integrieren müsstest. (Falls es Dir nur um den reinen Videostreamschnitt geht, Audio also außen vor bleibt, würde ich pipen.)

    Cu Selur

  • Ah... okay, das bringt Licht ins Dunkle, ist aber natürlich leider etwas ärgerlich. Habs mal kurz mit Zones versucht, aber für Zonen kann man auch keinen anderen keyint angeben.
    Hast du noch andere Ideen?

  • In x264 werden Keyframes über ein qpfile erzwungen und nicht anders, anders geht es in x264 selber nicht, aber was man machen könnte wäre noch nen Schritt dazwischen packen und die GOP erstmal verlustfrei nach Huffyuv komprimieren (-ovc lavc -lavcopts vcodec=ffvhuff). Die GOP schneiden (sollte frame-genau gehen) und das resultierende .avi File reencoden.

  • Ich muss sagen: Genial!
    Nach einem ersten kurzen Test funktioniert das wirklich! Der schneidet den Huffyuv wirklich framegenau!!! Danke, so muss ich gar kein Keyframe mehr setzen! Das rettet mir den Tag :)

  • Ja, ist eigentlich nicht so schwer, als dass nicht schon jemand so ein Tool hätte schreiben können. Wenn Du damit fertig bist würde ich mich übrigens für den Sourcecode interessieren. :)
    (Als Gui Framework würde ich vielleicht die QT Schnittstelle Jambi verwenden; hab mir der C++ Schnittstelle eigentlich ganz gute Erfahrungen gemacht)

  • Joa, ich mach das Ding aber mit Java... wenn dir das auch weiterhilft, gerne :)
    (Java wäre vllt. eher die bessere Wahl, damit hat man wirklich was Plattformübergreifendes)

  • Naja... also einen Nachteil konnte ich an der Methode entdecken. Mit der gleichen getesteten Datei:

    Zeit mit Huffyuv: 2m20s
    Zeit ohne: 1m42s
    Zeit mit VirtualDub: 2m (wobei da unter Mac noch 15 Sekunden dazu kommen, bis das mit Wine geöffnet wird)

    Die GOPs werden da uncodiert gerne mal 80 Mb groß und das dauert dann wohl etwas länger, die wieder in H264 zu bekommen. Von H264 zu H264 kann der das scheinbar schneller. Sind also schon mal 40 Sekunden länger zum Schneiden einer Datei, mit größeren Dateien hab ich jetzt noch keinen Vergleich gemacht.

  • Wegen der Zeit: Nutzt Du in mencoder und Virtual Dub auch die gleichen x264 Revisionen? Gerade in letzter Zeit hat sich da einiges bzgl. der Defaultwerte geändert.
    -> so ist z.B. weightedP aktuell per default aktiviert,...

    Zitat

    Java wäre vllt. eher die bessere Wahl, damit hat man wirklich was Plattformübergreifendes)


    QT Framework gibt's für C++ und Java und läuft beides unter Linux, Mac und Windows ohne groß plattformspezifischen Code zu haben. ;)

    Zitat

    Joa, ich mach das Ding aber mit Java... wenn dir das auch weiterhilft, gerne


    C++ und Java sind mir die angenehmsten Sprachen, reines C, Paskal, Phyton und PHP gehen zwar aber da brauch ich immer etwas länger bis ich wieder in der Syntax denke. :)

  • Wegen der Zeit: Nutzt Du in mencoder und Virtual Dub auch die gleichen x264 Revisionen? Gerade in letzter Zeit hat sich da einiges bzgl. der Defaultwerte geändert.

    Ich nutze leider grad ein ganz altes Build von mencoder und mplayer, weil ich es leider noch nicht geschafft habe, das mal selbst zu compilen. Leider habe ich noch nirgendwo ein aktuell compiltes build für Mac OS gefunden.

    Sobald ich mit dem Code fertig bin, schick ich ihn dir mal.

Jetzt mitmachen!

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