Beiträge von Lupurus

    Hallo,
    ich benutze recht oft Onlinetvrecorder.com. Die HighQuality-Dateien dort sind mit dem h264- und mp3-Codec aufgenommen. Diese Filme möchte ich nun ohne großen Aufwand in mp4-Dateien umwandeln, so dass ich diese per Quicktime bzw. in iTunes abspielen kann. Dies habe ich auch erfolgreich geschafft, indem ich die Datei mit mkvmerge zunächst in eine .mkv-Datei umwandle und diese sodann mit ffmpeg in den mp4-Container stecke. Dabei wandle ich das Audio in aac. Dauert pro Datei gerade mal 2-3 Minuten. Der Zwischenschritt mit mkvmerge ist leider notwendig, da ffmpeg anscheinend einen Bug beim Kopieren hat - ohne diese Zwischenschritt erhalte ich ein "zuckelndes" Video (-> das Bild springt ein paar ms vor, dann wieder zurück usw.)

    Nun komme ich aber zu meinem eigentlichen Problem: Da die Filme aus dem TV aufgenommen sind, enthalten sie natürlich Werbung. Daher nutze ich VirtualDub mit installierten ffdshow-Codecs, um die Werbung mit 'Smart Rendering' herauszuschneiden. Wende ich nun jedoch die oben genannte Methode auf diese geschnittenen Dateien an, kann ich daraus resultierende Datei zwar noch in Quicktime öffnen, doch schon nach kurzer Zeit bleibt das Bild hängen, verfärbt sich seltsam oder wird schwarz. Ein Spulen innerhalb des Filmes ist auch nicht möglich. Bei meiner Suche im Internet habe ich auf dem Wikipedia-Artikel zu h264 gelesen, dass Quicktime anscheinend nicht mit den von ffdshow erstellten h264-Dateien umgehen kann.

    Weiß jmd. vllt., woran das liegt und wie man dieses Problem lösen kann, ohne den Film komplett neu zu kodieren?

    Du kannst doch Avidemux benutzen, bekommt man für MAC und kann meines Wissens auch Smart Rendering.

    Ich kenne Avidemux, will ich aber aus zwei Gründen nicht benutzen: Mencoder lässt sich perfekt in eine eigene GUI einbauen und zudem muss ich nicht extra ein zusätzliches Programm installieren.

    Naja, dachte eig., dass vllt. jemand die Antwort weiß, aber unter den Umständen (und wegen der Tatsache, dass ich mit diesen DivX-Dateien eh kaum zu tun habe), kann ich auch mit cat arbeiten und eben einfach eine halbe Minute länger warten ;)

    Ach, wegen onlinetvrecorder.com :)

    Schon eine andere Mencoder-Version probiert ?
    Vorsichtshalber auch mit MediaInfo kontrollieren.


    Ja, hab es auch schon mit der neuesten Windows-Variante ausprobiert.
    Mit MediaInfo habe ich es auch schon verglichen. Das Einzige was sich unterscheidet ist das Format-Profile, aber das sollte eig. doch keine Probleme machen, oder?

    Selur hat mir kürzlich den Workaround mit "cat" vorgeschlagen. Interessanterweise funktioniert das perfekt, wenn ich im Anschluss den Index wiederherstelle. Blöderweise habe ich damit aber einen zusätzlichen Schritt eingebaut, der mich wieder unnötig Zeit kostet.

    Hallo MegaDeath,

    danke erstmal für deine Antwort.

    Geteilte Filme ( Damit sie auf CD Passen ) kann man eigentlich relativ problemlos mit Mencoder zusammenfügen, ein Problem sind zugegeben MPGs aus TV-Aufzeichnungen anscheinend funktioniert -noskip nicht immer Problemlos.

    Hab's gerade mal ohne -noskip gemacht, funktioniert leider immer noch nicht

    Weshalb willst du DivX Schneiden ?

    Um Werbung aus meinen TV-Aufnahmen (von onlinetvrecorder.com) zu entfernen.
    ...
    Das mit der Qualität ist zunächst nur vorübergehend, will erst mal das Problem beheben, dass er es nicht mehr zusammenfügen kann. Die edl bringt mich da leider auch nicht viel weiter, ich brauch ja die Dateien einzeln, denn ich hole mir erst die GOPs und dann die restlichen Parts (um framegenau sein zu können). Nur das Zusammenfügen am Schluss hat nicht geklappt, daher nun der oben genannte Test.

    Hallo.

    Ich versuche gerade, aus einer DivX-Avi zwei Teile mit dem Mencoder herauszuschneiden und im Anschluss wieder zusammenzusetzen. Leider funktioniert das mit dem Zusammensetzen irgendwie nicht, obwohl es eig. funktionieren müsste.

    Den ersten Teil extrahiere ich mit

    "mencoder input.avi -o part1.avi -ss ... -endpos ... -oac copy -ovc lavc -lavcopts vcodec=mpeg4 -ffourcc DX50"

    den zweiten Teil mit einem reinen "-ovc copy"

    Der Grund für den "Unsinn": Ich bastel mir mit Java ein Programm, dass das Smart-Copy übernimmt (s. hier. Mit H264-Dateien geht das inzwischen, allerdings würde ich auch gerne DivX-Dateien unterstützen.

    Wenn ich die Dateien mit
    "mencoder -o output.avi part1.avi -part2.avi -oac copy -ovc copy"
    zusammenfügen möchte, bekomme ich folgenden Output:

    Weiß irgendjemand, woran das liegen könnte?

    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.

    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.

    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?

    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?

    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?

    Hi Selur,

    vielen Dank für den letzten Post und für deine gesamte Mithilfe. Eine Bitte hätte ich noch, denn das mit den genauen Codec-Einstellungen ist nun noch der letzte Clou. Könntest du mir vllt. noch die Bedeutung und Relevanz der genannten Einstellungen erklären?
    Unabhängig davon, funktioniert mein selbst gebautes Smart Copy nun perfekt! :)

    Wie versprochen hier auch die Anleitung:

    • Auslesen der Keyframes
      Das Auslesen funktioniert mit MPlayer. Die Lösung, die ich gewählt habe, ist rein funktional. So mancher wird sich nun zwar die Hände über den Kopf schlagen, aber für mich funktioniert es gut, schnell und zuverlässig.

      Die Tatsache, dass MPlayer beim Spulen direkt an Keyframes springt, habe ich mir hier zunutze gemacht. Ausgangspunkt ist das Vorhanden eines Schneidepunkts, um den ich meine Keyframes auslesen möchte. Nun öffne ich also den MPlayer mit folgenden Command:

      mplayer -vo null -nosound -slave -ss xxx input.avi

      Erläuterung:

      • -vo null: Videooutput wird auf null gesetzt, d.h. es wird kein Video angezeigt. Wir brauchen auch keines
      • -nosound: Wir brauchen auch keinen Sound
      • -slave: Wir starten im Slave-Modus, damit wir den MPlayer vom Programm steuern können
      • -ss xxx: Statt xxx geben wir nun den Zeitpunkt des ersten Schnittpunktes an (Format: hh:mm:ss.ms)

      MPlayer springt nun automatisch zu dem Keyframe, der direkt auf den Schnittpunkt folgt. Von meinem Programm aus lese ich dann die Ausgabe des MPlayers aus und weiß dann, wo sich der Punkt befindet.

      Nun weise ich den MPlayer mit "seek -1" an, zurück zu spulen. Damit springt er an den Keyframe, der sich vor dem Schnittpunkt befindet. Wieder kann ich die Ausgabe auslesen und auswerten.

      Um die restlichen Schnittpunkte zu finden, wiederhole ich das Verfahren, indem ich dann einfach mit "seek xxx 2" (2 bedeutet, dass er nun an diese Position springen soll) an den nächsten Schnittpunkt springe.


    • Herausschneiden der GOP
      Nun kann ich mich der jeweiligen GOP widmen. Anders als bisher gedacht, brauche ich nur die GOP am Anfang des Schnitts. MEncoder schneidet im Copy-Prozess auch bis an Frames, die nicht Keyframes sind. Ist ja eig. auch logisch, denn da muss nichts neu berechnet werden.

      Das Herausschneiden der GOP ist eig. recht simpel, ich schneide ich nun einfach von Keyframe 1 bis Keyframe 2:

      mencoder input.avi -o GOPX.avi -ss Keyframe1inSec -endpos diff -mc 0 -noskip -oac copy -ovc x264 -x264encopts keyint=(FrameSchnittpunkt-Keyframe1):scenecut=0 -ffourcc H264

      Erläuterung:

      • diff: Das ist die Zeit zwischen KeyFrame2 (in Sek.) und KeyFrame1 (in Sek.). Beachte: Hier muss ein Frame abgezogen werden, denn das letzte Keyframe brauchen wir ja nicht, das kommt dann in der nächsten Sequenz.
      • -mc 0 -noskip: Brauche zumindest ich, weil sonst Artefakte beim Überspringen von Frames entstehen (s.o.)
      • keyint: Nun setzen wir an der benötigten Stelle ein Keyframe. Dass evtl. noch weitere Keyframes gesetzt werden, ist eig. nicht sonderlich tragisch.
      • scenecut=0: Szenenerkennung ausstellen, sonst setzt mencoder selbst die Keyframes
      • -ffourcc H264: Damit dann beim Zusammenfügen die Codecs passen

      Weitere Einstellungen bzgl. des Codecs müssen dann noch ergänzt werden.


    • Herausschneiden aus der ersten GOP
      Was wir nun noch brauchen, ist der Teil von dem gesetzen Keyframe bis zum Ende der ersten GOP. Das geht dann mit:

      mencoder GOPX.avi -o cutXStart.avi -ss KF -ovc copy -oac copy -mc 0 -noskip

      Erläuterung:

      • KF: Wir brauchen dann die relative Position des gesetzten Keyframes. Also Schnittpunkt bis Keyframe1 (und zwar in Sek.)

      Bisher haben wir also zwei Dateien: GOPX.avi und cutXStart.avi.


    • Herausschneiden des Restes
      Nun kommt der restliche Teil. Ganz simpel und ganz schnell:

      mencoder input.avi -o cutXRest.avi -ss KF2 -endpos xxx -ovc copy -oac copy -mc 0 -noskip

      Erläuterung:

      • -ss: Hier schneide ich nun von Keyframe2 (in Sekunden)
      • -endpos: Differenz zwischen Keyframe 2 und Schnittpunkt Ende (in Sek.)

      So. Jetzt haben wir alle benötigten Teile. Jetzt müssen wir nur noch...


    • Zusammenfügen der Dateien
      Das Zusammenfügen geht nun eig. relativ simpel. Wir brauchen nur noch die Dateien, die mit cut... anfangen. Also

      mencoder -o output.avi cut1Start.avi cut1Rest.avi cut2Start.avi cut2Rest.avi ...

      Ggf. kann man noch ein -idx als Parameter hinzufügen, so dass gleich ein Index neu aufgebaut wird. Allerdings funktioniert es bei mir auch ohne.

    So, das dürfte es jetzt eigentlich sein. In der Theorie ist das recht verständlich, doch das umsetzen kostet Zeit und Nerven (insb. das Ausrechnen... da muss man erst mal den Überblick behalten). Wenn gewünscht, kann man sich natürlich noch den Output abfangen und eine ProgressBar damit füttern (Allerdings ist das sehr stressig, weil man ja die Prozesse nur einzeln hat. Aber es ist möglich ;))

    Ich hoffe, ich konnte dir verständlich erklären, wie ich das gemacht habe. Falls du irgendwelche Fehler entdeckst oder dir was unerklärlich ist, kannst du ja nochmal fragen.

    Schöne Grüße,
    Lupurus

    Achso... ja, macht ja nichts, der erste Teil wird ja sowieso dann weggeschnitten. Es geht dann nur noch um die Stelle zwischen 64 und Ende.
    Das Problem ist nachwievor, dass ich das mit dem Codec nicht hinbekomme... hab auch schon -ffourcc versucht, aber ich bekomme immer eine Datei, die ich nicht mit der anderen zusammenfügen kann. Weißt du da weiter? Bin echt grad am verzweifeln :(

    Okay, weiterer Meilenstein erreicht, das erzwingen von Keyframes war etwas fies, aber habs dann doch noch herausgefunden. Das Problem: Ich wollte ein Keyframe bei Frame 64, er hat es mir aber bei 50 gesetzt. Grund: Automatische Szenenerkennung. Die kann man aber glücklicherweise ausstellen, so dass er dann die Keyframes nach dem bestimmten Intervall setzt.
    Jetzt muss ich nur noch herausfinden, wie ich den Teil in exakt demselben Codec herausschneiden kann, dann sollte die nachgebaute Smart-Copy-Funktion fertig sein. Sobald ich soweit bin, werde ich hier mal eine ausführliche Dokumentation darüber geben.

    So... habe etwas herumgespielt und es soweit geschafft, die Keyframes um ein bestimmtes Frame herum herauszulesen. Geht mit dem mplayer.
    Fragt sich jetzt nur noch, wie ich diesen Bereich mit demselben Codec herausschneiden kann und dann einen neuen Keyframe setzen kann. Weißt du da ne Lösung?

    Hi,

    gerade kam mir noch eine Idee, die ich aber noch nicht getestet habe (heute Abend dann mal):
    Ich schneide die erste GOP heraus und zwinge mencoder dazu, an jedem Frame ein Keyframe zu machen. Danach schneide ich an dem gewünschten Frame und voila, habe ich die gewünschten Anfangsframe. Fragt sich nur, ob dann die vielen Keyframes beibehalten werden oder nicht, was aber bei max. ein paar Sekunden (mehr liegen ja i.d.R. nicht zwischen den Keyframes) nicht so viel ausmachen würde.

    Bleibt letztlich nur zu klären, wie ich den Anfangsteil mit exakt demselben Codec herausschneiden kann, denn mencoder bringt beim Zusammenfügen der Dateien einen Fehler, wenn das nicht gleich ist.

    Hm, hat leider auch keine Auswirkungen. Seltsamerweise wird die Datei unter Quicktime richtig abgespielt, nur der VLC hat damit irgendwie Probleme... :(

    Nachtrag:
    Es hat so halbwegs funktioniert... nur wenn man es weiß, sieht man jetzt ein Ruckeln! Danke!