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.