Wie kann man zufällige Bilder selektieren aus einem Video?

  • Hallo mal wieder ^^

    Ich überlege schon eine Weile wie man zufällige Bilder aus einem Video selektieren kann um sie später als Bilder zu speichern. Eine Funktion für einen bestimmten Frameabstand habe ich bereits. Diese sieht so aus:

    Diese Funktion gibt mir das Hauptvideo wieder und erzeugt nebenbei 30 Bilder in festen Frameabständen die vorher selektiert wurden.

    Meine Frage ist jetzt ob das auch zufällig gemacht werden kann. Also 30 Bilder zufällig aus dem Video die dann gespeichert werden können selektieren.

    Ich hätte zwars eine Lösung dafür Rechnerisch, aber dafür bräuchte ich die aktuelle Position die ich dann abfragen müsste. Also sowas wie current_frame. Nur ist mir das mit diesem ScriptClip noch ziemlich schleierhaft. Deswegen dachte ich das das Problem vllt noch einfacher zu lösen ist ^^

    Ich hoffe ihr könnt mir dabei helfen ^^ Wäre echt nice :)

  • ScriptClip(Trim(clip, 0, length=30), "Trim(clip, Rand(clip.framecount-1), -1)")

    Keine Ahnung wie gut Rand() ist und ob das überhaupt das ist, was Du willst. Du hast zwar geschrieben "zufällig", aber womöglich meinst Du doch etwas anderes bzw. hast Zusatzbedingungen?

  • Nee. vllt hab ich es doof erklärt ^^

    Also das Video hat eine Länge von x Frames die mir ja unbekannt sind. Deshalb ja auch Framecount.

    Teile ich Framecount mit der Anzahl an Bildern die ich haben will (in meinen Beispielskript 30), dann habe ich die Framelänge y die mir dann sagt: nach y Frames wird ein Bild gespeichert (selektiert) In SelectEvery bei mir zu sehen gibt frame die step_size an. Sprich das Skript erzeugt mir bei SelectEvery einen Clip mit exakt 30 Bildern. Egal wie lang das Video ist. Leider sind die Frames fest vordifiniert. Bedeutet: Wenn ich das gleiche Video noch mal lade und abspielen lasse, erzeugt mir das Skript genau die gleichen Bilder. Und das wollte ich zufällig gestalten. Also das es bei dem gleichen Video mir andere Frames speichert, anstatt immer die gleichen.

    Mein Beispiel ist jetzt sozusagen in mit festen Abständen versehen. Ich hatte daran gedacht ob man das eventuell Zufällig gestalten kann. Dieses ScriptClip mal bitte außen vor lassen. Das hatte ich nur erwähnt wegen diesem current_frame das man da ansprechen kann. Das bräuchte ich höstens als Variable für eine Funktion.

  • Deine Erklärung hat sich nicht geändert, mein Skript wählt 30 zufällige Frames aus. Die Frage ist nur:
    1.) wie zufällig ist rand()?
    2.) willst Du wirklich 30 zufällige Frames, oder gibt es noch mehr Bedingungen, die Du nicht erwähnst?

  • Eigentlich nicht. Nur 30 zufällige Frames aus dem Gesamtclip von x beliebigen Frames erzeugen und diese halt mit ImageWrite abspeichern. Mehr nicht.

    Übrigens gibt mir dein Skript mit ScriptClip nur im Bereich zwischen Frame 0 und 30 etwas zurück. Alle Frames darüber werden außen vor gelassen. Aber gerade diese will ich ja auch nutzen dafür. ^^

    Hat aber funktioniert als ich es umgeändert hatte, deshalb... danke ich dir mal ^^

    Allerdings taucht nun ein neues Problem auf. Und zwars wenn ich das in der Funktion unterbringen möchte gibt er mir eine Fehlermeldung indem er schreibt was ich mit clip0 meine.

    Hier mal die aktuelle Funktion:

    Und mit Clip0 kann er bei ScriptClip nix anfangen. Muss man da irgendwie anders vorgehen?

  • Also die Funktion soll mir die zufälligen Bilder nur speichern, aber das Video dabei nicht verändern. Also MeGUI soll jetzt das Video encodieren so wie es ist, nebenbei aber 30 zufällige Bilder generieren dabei. Dafür soll die Funktion sorgen. Damit es keine 30 Frames werden, da diese ja nur für die zufälligen Bilder gedacht ist, muss ich ja das Original Video zurückgeben. Und ImageWriter muss auch als Clip zurückgeliefert werden. Das hat ja in meinen anderen Skriptbeispiel hervorragend funktioniert.

    Das Skript wird bis Frame 30 normal verarbeitet, generiert mir aber nebenbei Bilder von Frame 144, 288, 432 usw. Und dieses Bilder generieren wollte ich nur zufällig gestalten als das sie einen festen Abstand haben. Das Video an sich soll aber nicht verändert werden ^^ Darum ist die Eingabe gleich der Ausgabe ^^ Mit dem Unterschied das mir dabei Bilder generiert werden ^^

    OK, jetzt klappt alles wie ich das wollte ^^

    Hab einfach eine globale Variable für den Clip genommen. Anscheinend kann ScriptClip nur Global operieren ^^

    Einmal editiert, zuletzt von SagaraS (9. September 2013 um 23:37)

  • Ja, scriptclip() läßt sich wegen der Scopes nicht so einfach in eine Funktion einbauen.

    Ansonsten finde ich Deine Abwandlung höchst merkwürdig, weil Du aus meinem simplen Einzeiler, der bis 30 Frames ging, einen Dreizeiler über alle Frames gemacht hat, der am Ende nur auf 30 Frames zurechtgestutzt wird.

    Generell ist die Performance aber ziemlich schlecht. Wenn Du die Bildergenerierung und die Umwandlung für MeGUI in getrennte Skripte/Aufrufe bringst, wird alles vermutlich um einiges schneller.

  • Ansonsten finde ich Deine Abwandlung höchst merkwürdig, weil Du aus meinem simplen Einzeiler, der bis 30 Frames ging, einen Dreizeiler über alle Frames gemacht hat, der am Ende nur auf 30 Frames zurechtgestutzt wird.


    Ja. Hab ich auch schon festgestellt. *mich selbst facepalm* xD

    Generell ist die Performance aber ziemlich schlecht. Wenn Du die Bildergenerierung und die Umwandlung für MeGUI in getrennte Skripte/Aufrufe bringst, wird alles vermutlich um einiges schneller.


    Die Performance an sich ist nicht schlecht, denn auch wenn da zwei mal Overlay steht, wird nur ein Bild encodiert. Nämlich nur das was da ist. An sich möchte ich ja nur ein Skript haben, anstatt zwei.

    Performanter wäre es so eigentlich:

    Jetzt werden nur die ersten 30 Frames mit dem ganzen Kram belästigt, die restlichen Frames bleiben unberührt von der ganzen Geschichte ^^ Das sollte die Performance nach den 30 Frames nicht mehr behelligen ^^

  • Vermutlich ist es schon deshalb nicht gerade vorteilhaft, weil bei Zufallsfunktionen die Position wirklich mehrfach vor und zurück springen wird. Es mag Videoformate geben, bei denen "nur vorwärts" zuverlässiger arbeitet. Das würde aber u.U. eine Sortierung erfordern. Dann wäre vielleicht eine vereinfachte Vorwärts-Berechnung (in etwa: 30 Mal jedes "n/32 + rand()/32 {oder weniger}"; vermeidet auch etwas vom Abspann) leichter umzusetzen.

  • Solange man nur einzelne Frames raussucht, dürfte das keinen Unterschied machen - zumindest bei Source-Filtern, die nicht rein linear arbeiten (ffms2, l-smash, DGDecNV, DSS je nach Splitter...). In beiden Fällen springt man einfach irgendwo in eine GOP rein. Problematisch wird es erst, wenn man mehrere Frames in Reihe aber rückwärts abrufen will, weil dann wirklich jeder Zugriff wie ein kompletter Seek sein kann, wenn kein guter Cache implementiert ist - da ist die Vorwärtsvariante einfach wesentlich performanter. Im Bereich von 30 Frames ist das aber alles eh vernachlässigbar.

    SagaraS

    Ja, das sieht schon schneller aus.

    Die AviSynth-Sprache ist einfach sehr unschön, selbst wenn man mit etwas Trickserei doch das ein oder andere hinbekommen kann. Mit Python (VapourSynth) geht das bestimmt wesentlich sauberer und dann würden auch die Dinge gehen, die LigH vorschlägt (hatte auch erst vermutet, daß Du eigentlich so etwas wie von LigH vorgeschlagen machen wolltest, also nicht rein zufällig, sondern zumindest steigend.) Dort fehlt im Moment allerdings noch ein natives ImageWriter-Plugin, welches eigentlich schon für <r19 angedacht war.

  • Also die Funktion passt schon und reicht vollkommen aus. Es wird eh nur bei Lossless Formaten ihre Anwendung finden wie Lagarith, Fraps und desgleichen. Es soll halt für die Videobearbeitung an sich nix ändern. Die AVS Datei soll einfach normal weiter behandelbar sein mit anderen Filtern. Es soll nur dazu dienen nebenbei noch Thumpnails zu generieren die total Wahllos sind. Für spätere Verwendungszwecke halt. Nicht nur das man nur eine AVS Datei dann hat für alles, sondern man kann halt auch die AVS nur abspielen lassen um noch mal ein Satz von 30 Bildern zu generieren.

    Ich wollte das halt schon als Funktion haben, weil ich das auch Leuten erklären möchte die das eh schon alles durcheinander machen. Da wären 2 Skripte für die schon zu viel xD

    So kann man die Funktion als Import Funktion gestalten und bräuchte nur einen Befehl um eine bestimmte Anzahl von Bildern generieren zu lassen. Das war ja der Grundgedanke ^^

    Weil es Leute gab die haben Sonstwas gemacht um Thumpnails zufällig generieren zu lassen. Der eine hat Java genutzt und AVISynth, der andere ein Extraprogramm für sowas. Ich fand das halt doppelt gemoppelt. Weil es geht ja auch in AVISynth direkt dann damit jetzt ^^ Dann muss man das nicht so kompliziert machen und auf andere Sachen zurückgreifen, wenn man die Videos eh durch MeGUI jagt ^^ Dann ist alles ein Abwasch ^^

Jetzt mitmachen!

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