Frames aus Videos extrahieren - im eigenen Thread?

  • Mich quält schon seit langen das öffnen und extrahieren von Bitmaps aus Videodateien.
    Beste Resultate erziele ich bisher mit direktem Zugriff auf die AviSynth.dll
    Funktioniert im Hauptthread der Anwendung oder über Synchronize in einem gesonderten Thread meist reibungslos.

    Probleme:
    1.) Korrupte Videodateien > Komplette Programminstanz friert ein.
    2.) Nicht lesbare Videodateien die nicht unbedingt korrupt sein müssen >
    Es wird bis zum Ende der Videodatei ohne Erfolg gelesen, was dauern kann.
    3.) Da das ganze im Hauptthread läuft, ist das Programm solange lahm gelegt.

    Hauptproblem:
    Mir ist es bisher noch nicht gelungen, das ganze in einem gesonderten Thread auszuführen. Womit es eben möglich wäre, diesen Thread nötigenfalls abzuschießen. Nicht gut, aber besser als das komplette Programm zu killen.
    Vor allem Videos die DirectShow verlangen (WMV, FLV, manche AVI je nach benötigtem Codec) wollen in einem gesonderten Thread einfach keine Frames hergeben.
    Mit InitializeCriticalSection hatte ich da bisher auch noch kein Glück.

    Nun meine Frage:
    Hat jemand Vorschläge, oder kennt gar eine Methode in einem gesonderten Thread Videos zu laden oder Frames zu extrahieren? (Delphi Code bevorzugt)
    Meine einzige noch nicht vollzogene Alternative, wäre eine extra Exe die bei Erfolg Frames ans Hauptprogramm sendet und nötigenfalls terminiert werden könnte. Aber…?

    In Hoffnung auf positive Antwort(en)
    Gruß gispos

  • Nicht sicher ob es Hilft, aber per commandline mit ffmpeg sollte es so gehen:

    Zitat

    ffmpeg -i "Pfad zum Input" -an -ss 01:01:24 -an -r 1 -vframes 1 -y %d.jpg

    Erklärung der Optionen:
    -i "Pfad zum Input" -> festlege der Eingabedatei
    -an -> Ton deaktivieren
    -ss hr:min:sec ->Festlegen an welcher Position (Zeitmarke das Frame liegt)
    -vframes 1 -> legt fest das nur ein Frame genommen werden soll
    -y "Dateiname der Ausgabedatei" -> legt die Ausgabedatei fest

    Musste eventuell mal in der ffmpeg Dokumentation gucken, hatte ich mir mal vor ner ganzen Weile in eine Textdatei geschrieben und eventuell hat sich die Dokumentation seit dem geändert.

    Cu Selur

  • Hi,

    das Hauptproblem ist, wie Du ja schon erkannt hast, dass DirectShow sehr geizig mit der Weitergabe von Informationen ist. Ich habe mit einem Kumpel aus UK ein Plugin für DVDLab entwickelt, mit dem sich u.a. auch DVDLab's Kompilationen wiedergeben lassen. Aus Vereinfachungsgründen haben wir dabei auch viel Gebrauch von den DirectShow-Funktionen gemacht und genau das gleiche festgestellt. Man bekommt die benötigten Informationen entweder gar nicht oder zu spät.

    Unser Plugin kann auch Screenshots aus einem Video erstellen, aber da es ja nur für DVDLab gedacht ist, kann es nur mit MPEG-Video umgehen. Wie dem auch sei, wir haben uns letztendlich dafür entschieden, dass das Programm MPGs zuerst demuxt. Tja, und dann kam die erste korrupte Datei und schon war's Essig mit dem Demuxen. Wir haben uns dann damals entschieden, entsprechende Routinen einzubauen, die korrupte Stellen überspringen, den Rest aber normal weiterverwenden. Das wird vielleicht auch noch einmal mit einer Reparaturfunktion versehen, aber momentan sitzen wir an einem anderen Projekt.

    Worauf ich raus will: Du wirst nicht umhin kommen, Procedures einzubauen, die bei einem korrupten Stream/Video den nächsten korrekten Header/Block oder was auch immer lokalisieren. Wenn Du die ganze Sache in einem eigenen Thread laufen lassen willst, Du Dich aber mit Thread-Programmierung noch nicht so auskennst, empfehle ich zum Einstieg mal diesen Link.

    Zu Deinen Problemen:
    1) Da fehlt wahrscheinlich nur ein TRY ... EXCEPT ... FINALLY Konstrukt, es sei denn, der Hänger wird durch DirectShow verursacht. Einfacher wäre es, die Datei durch eigene Routinen auslesen zu lassen und nur für die Darstellung DirectShow zu verwenden. Damit hättest Du die volle Kontrolle über Dateifehler. Bei einer Vielzahl von Formaten bedeutet das aber auch reichlich Dateiformatstudium... In unserem Tool hat der Demuxer eigene Functions für VideoCD, SVCD, MPG und VOB, um das Ganze überschaubar zu halten. Die VOB-Demux-Function hat dabei schon ca. 1200 Zeilen, und bei den anderen sieht es nicht viel besser aus.

    Für Fehlerbehandlungssachen empfiehlt sich übrigens die madCollection. Damit lassen sich auch Programmhänger abfangen.

    2) Eigentlich wie bei 1. Du musst aber eben selbst die Header/Blocks oder was auch immer auslesen.

    3) Tja, da hilft entweder die madCollection, eine ordentliche Exception-Behandlung oder eine Thread-Programmierung.


    Okay, ehe ich Dich hier völlig zutexte, lass' ich's jetzt mal so. Hoffe, es bringt Dich weiter.

    Grüße

    darkframe

  • Selur danke für diese Information. :ja:
    Nach erster Skepsis, da ich ja die Bitmaps, oder auch Zeiger auf einen Speicherbereich des Frame, Programmintern benötige, und ich somit mit einem Commandline Tool nichts anfangen könnte, erwies sich ein genaueres betrachten von ffMPEG geradezu als Goldgrube.
    OpenSource, DLL, Dokumentationen, Pascal Header, also fast alles was das Herz begehrt. Das Beste daran, ffMPEG decodiert alles selbst, es wird keine Windows DirectShow Krüge benötigt. Das schlechte daran, miese Dokumentationen.
    Es wird also ein langer und steiniger Weg bis zum Erfolg werden.

    darkframe:
    Also mal danke für deine Umfangreiche Antwort.
    An nicht behandelten Exceptionen liegt dass bei DirectShow nie, ganz im Gegenteil DirectShow ist so unverschämt trotzt Exception Behandlungen, mit eigenen Exceptions und Dialogen nur so um sich zu werfen. Aber das schlimmste daran sind falsche Rückgaben.

    Frage an DirectShow: Hast du die Datei öffnen und den Renderer und Codec innitialisieren können?
    DirectShow Antwort: Ja, alles klaro.
    Ich: Na dann play mal
    DirectShow: rater rater rater… KANN RENDERER NICHT INITIALISIEREN!!

    Weiterer Nachteil, DirectShow scheint nicht ThreadSave zu sein.
    Wenn DirectShow hängt, friert die komplette Anwendung ein.

    Na ja, und für alle möglichen Formate eigene Decoder zu schreiben, wäre zumindest für mich eine Lebensaufgabe ohne Aussicht auf Erfolg.
    Nach erste Beurteilung und Tests in einem extra Thread, ist da ffMPEG genau das richtige für mich.

    Dank & Grüße
    gispos

  • An nicht behandelten Exceptionen liegt dass bei DirectShow nie, ganz im Gegenteil DirectShow ist so unverschämt trotzt Exception Behandlungen, mit eigenen Exceptions und Dialogen nur so um sich zu werfen. Aber das schlimmste daran sind falsche Rückgaben.


    Hi,

    genau das meinte ich eigentlich ;)

    Hast Du Dir mal das DSPack angesehen? Das hilft eine ganze Menge im Umgang mit DirectShow.

    Selur's Idee, das Ganze über eine CommandLine zu lösen, hat auch was für sich :)

    Grüße

    darkframe

  • Sorry bin etwas im Verzug, hatte vor lauter ffMpeg Studium alles andere vergessen.
    ffMpeg… zäh, zäh, langsame aber bisher gute Erfolge vorzuweißen. Bei korrupten Videos keinen Programmabsturtz mehr gehabt. I am Happy. :D
    Das Timestamp auslesen hab ich allerdings noch nicht so richtig im Griff, ffMpeg gibt nicht bei allen Dateien einen Timestamp zurück, dann kann nur auf die Dateigröße zurückgegriffen werden. Das erschwert das setzten eines Trackbar.Maximum. Muss mich da erst noch weiter einarbeiten. Und Ton… da wird’s kompliziert.

    Eine Bitte, bitte mal testen: "Talon Evo" mein ewiges Projekt, an dem ich schon seit 3 Jahren oder glaub sogar noch länger herumschraube.
    Wer gerne mit Videos u. Bildern herumspielt, wird hier wie ich finde gut bedient, will sagen das Programm lädt zum spielen ein. Viele, viele nützliche und weniger nützliche Funktionen.

    Mal als kurze Info:
    F1 oder „linke Maus down u. rechts klicken“, öffnet bei einer Videodatei ein Menü.
    Einen Rahmen mit „linker u. rechter Maus down“ ziehen zeigt die Auswahl im Preview.
    Für MPEG (DVB) Dateien gibt’s auch die eine oder andere Leckerei.
    Von CD’s/DVD’s mit Bildern oder Videos, können Datenbanken erstellt werden.
    Multiples Bild in Bild einfügen von Bildern im Bildbetrachter möglich.
    Schnelles und einfaches Aspect Ratio für aus Videos extrahierte Bilder.
    Zu jedem Datenbankeintrag kann ein AddOn hinzugefügt werden. (z.B. Bild)

    Und unter Extras gibt’s interessante Tools:
    Ein sehr guter Doppelte Dateien Finder.
    Ein WinRar Batch Gui, kompatibel zum USDownloader. (für Load demnächst)
    und anderes.

    Einzige Nutzungsbedingung… wenn vorhanden, wenigstens einen BUG MELDEN bitte!
    Hab’s diesmal nur in ein geschütztes Archiv gepackt, solange nicht unter Optionen das Programm mit Dateitypen verknüpft wird, hinterlässt es nach löschen des Ordners, keine einzige Leiche.
    Virus not found: gehe mit meinem Arbeits-PC nie ins Netz, nur über eine Virtuelle Maschine. Alle paar Monate wird ein komplettes Festplatten Backup wieder zurückgespielt.
    Archiv wurde mit einem Viren-Scanner ohne Befunde erfolgreich gescannt.

    ScreenShot als Anhang.
    Download 10 MB: http://rapidshare.com/files/88958266/TalonEvo_1.4.rar
    Passwort fürs Archiv: talon

    Gruß gispos

Jetzt mitmachen!

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