DirectShow intern



Der DVBViewer GE bietet einige Möglichkeiten, die für die Bild- und Tonwiedergabe benutzten DirectShow-Filter auszuwählen. Doch manchmal reicht das nicht aus. Wenn es darum geht, unerwünschte Komponenten aus dem Verkehr zu ziehen, aus dem Internet heruntergeladene Filter im System anzumelden oder sie auf bestimmte Weise zu konfigurieren, muss man auf Systemebene tätig werden. Dazu braucht man das richtige Werkzeug. Und Kenntnisse über die internen Zusammenhänge. Dieses Kapitel vermittelt die Grundlagen.

DirectShow | Filter-Typen | Videodecoder-Konfiguration | RadLight Filter Manager | GraphEdit/GraphStudio



So funktionert DirectShow

DirectShow-Filter sind Software-Module. Die dazugehörigen Dateien tragen die Endung .ax, manchmal auch .dll. Wenn diese Dateien im System angemeldet (registriert) sind, können sie von allen Programmen benutzt werden. Sie haben meist einen oder mehrere Eingänge („Input Pins“). Dort werden Daten hinein geschoben. Nach der internen Verarbeitung kommen sie auf der anderen Seite an den Output-Pins wieder heraus und gelangen zum Input-Pin des nächsten Filters. Und so weiter, bis die Daten schließlich gut zubereitet der Grafikkarte, der Soundkarte oder auch einer Datei zugeführt werden.

Jeder Filter akzeptiert an seinen Input-Pins bestimmte Datentypen, für die er zuständig ist. Also zum Beispiel komprimiertes MPEG-Video. Über den Output-Pin gibt er bekannt, was er anzubieten hat, zum Beispiel entkomprimierte Video-Rohdaten. DirectShow sieht vor, dass die Filter untereinander ein Übergabeformat aushandeln. Ein Filter-Programmierer muss die dafür notwendigen Mechanismen bereitstellen. Wenn es zwischen zwei Filtern keine Einigung gibt, verbinden sie sich nicht – Output- und Input-Pin lassen sich nicht zusammenstöpseln.

Im Grunde macht es DirectShow den Media-Playern sehr einfach. Sie brauchen nur die Datenquelle, also zum Beispiel eine Datei vorgeben, und dann den DirectShow-GraphBuilder anweisen, die für die Verarbeitung und Wiedergabe erforderlichen Filter automatisch zu suchen und zu verbinden. Das Gebilde, das dabei entsteht, heißt „Filtergraph“.

Wie geht der DirectShow-GraphBuilder dabei vor? Er kennt den Ausgangs-Datentyp, und was am Ende dabei herauskommen soll. Und hat einen Haufen Informationen in der Windows-Registry. Da stehen alle Filter drin, mitsamt den Datentypen der Input- und Output-Pins. Also probiert er quasi als Rooter solange herum, bis er es geschafft hat, über mehrere Stationen den Anfang mit dem Ende zu verbinden. Bei einer MPG-Datei sieht das Ergebnis etwa so aus:

Was aber macht der GraphBuilder, wenn er mehrere Filter mit gleicher Eignung findet? Dann schaut er sich den Merit („Verdienst“) an. Jedem Filter ist ein solcher Zahlenwert zugeordnet. Und der mit dem höchsten Merit-Wert wird genommen. Dabei gibt es nur ein Problem: Den Standard-Merit-Wert legt der Filter-Programmierer fest. Wenn er von seinem Produkt überzeugt ist, natürlich einen hohen. Obwohl Microsoft dafür bestimmte Regeln vorgibt, kommt es auf dem Gebiet zu einigen Übertreibungen, wie man sich denken kann. Glücklicherweise kann man den Merit-Wert mit dem RadLight Filter Manager ändern.

Außerdem sind Programme nicht vollständig auf den GraphBuilder angewiesen. Sie können auch selbst ein FilterGraph-Objekt erzeugen, bestimmte Filter vorab einfügen, und dem GraphBuilder die restliche Arbeit überlassen. Er ist dann verpflichtet, die schon vorhandenen Komponenten zu bevorzugen, unabhängig vom Merit. Genau so macht es der DVBViewer. Die in den Optionen eingestellten Decoder werden also eingebaut, sofern sie sich verbinden (falls nicht, sucht der GraphBuilder automatisch eine Alternative). Wenn Sie dagegen in der Auswahlliste <System Default> einstellen, darf der GraphBuilder machen was er will. Und damit kommen meistens die Decoder mit dem höchsten Merit zum Zuge.

Inhalt | an den Anfang | vorheriges Kapitel | nächstes Kapitel



Filter-Typen

Was gibt es nun für Filter? Eine ganze Menge verschiedene. Wir beschränken uns auf die Typen, die für den DVBViewer von Bedeutung sind:

Mitunter sind Sourcefilter und Demultiplexer in einer Komponente zusammengefasst. So auch beim DVBViewer Filter („DVB Source“). Wenn Sie ihn für Dateiwiedergabe einsetzen, brauchen Sie keinen zusätzlichen Demultiplexer-Filter. Er ist bereits im DVBViewer Filter enthalten und optimal auf die Anforderungen des DVBViewers zugeschnitten. Nur bei unerwarteten Problemen – insbesondere bei Dateien, die nicht mit dem DVBViewer erzeugt wurden – empfiehlt sich ein Versuch mit anderen Komponenten.

Die Bedeutung des Demultiplexers wird oft unterschätzt. Wenn die Wiedergabe einer Video- oder Audiodatei nicht funktioniert, mangelt es vielleicht gar nicht an geeigneten Decodern, sondern an einem Splitter-Filter, der dieses Dateiformat versteht. So zum Beispiel, wenn sich TS-Dateien zwar im DVBViewer, aber nicht im Windows Mediaplayer abspielen lassen. Er sucht vergeblich nach einem geeigneten Demultiplexer im System, denn der DVBViewer Filter ist aufgrund seiner Spezialisierung auf Belange des DVBViewers nicht allgemein verwendbar. In Frage kämen in diesem Fall der Elecard Demultiplexer, sofern vorhanden, oder der freie Haali Media Splitter (ebenfalls ein kombinierter Sourcefilter/Demultiplexer) – beide können neben TS noch weitere Formate handhaben.

Wenn möglich, übertragen deshalb manche Decoder der Grafikkarten-Hardware besonders rechenaufwändige Teile der Dekodierung, um die Prozessorlast zu senken. Dabei hängt viel von der reibungslosen Zusammenarbeit zwischen Decoder und Grafikkarten-Treiber ab, die nicht immer so gut funktioniert, wie man es sich wünscht. Das gilt insbesondere für das bei HDTV bevorzugte H.264-Videoformat, das die Hardware-Beschleunigung besonders nötig braucht – hier sind jedoch noch nicht alle Kinderkrankheiten überwunden. Deshalb lässt sich auf den Eigenschaftsseiten der Decoder meist konfigurieren, ob Hardware-Hilfe in Anspruch genommen werden soll oder nicht.

Das waren bereits die wichtigsten Filter. Es gibt noch weitere, die der DVBViewer optional verwendet. Dazu gehören insbesondere Postprozessor-Filter. Sie werden zwischen Decoder und Renderer geklemmt und haben die Aufgabe, die dekodierten Daten auf spezielle Weise zu nutzen oder nachzubearbeiten, bevor sie zur Wiedergabe gelangen. Ein Audio-Postprozessor, der im Filtergraph unter dem Namen „Audio Callback“ auftaucht, ist im DVBViewer fest eingebaut. Da er in keiner separaten Datei wohnt und nicht registriert wird, ist er nicht allgemein nutzbar. Er kann bei Bedarf den rechten Stereo-Kanal auf den linken kopieren (oder umgekehrt) und damit einen von beiden ausblenden. Diese Funktion finden Sie im DVBViewer-Menü als „Einstellungen/ Audio-Kanal“. Der DVBViewer Pro realisiert auf diesem Weg noch einen Equalizer und verwandelt Töne in Visualisierungen.

Der DirectShow GraphBuilder bindet normalerweise weitere im System vorhandene Video- und Audio-Postprozessoren automatisch ein. Aber die Wirkung solcher Komponenten kann ebenso gut von Vorteil wie unerwünscht sein. Probleme sind deshalb vorprogrammiert, wenn man blindlings Codec-Packs aus dem Internet installiert, ohne genau zu wissen, was sie mit sich bringen. Video-Postprozessoren verhindern zum Beispiel prinzipbedingt hardware-beschleunigtes Dekodieren. Deshalb lässt der DVBViewer im Gegensatz zu anderen Mediaplayern die unkontrollierte Einbindung nicht zu. Wer trotzdem gezielt bestimmte Postprozessor-Filter nutzen möchte, kann dies mit dem Postprocessor Plugin tun.

Wie erzeugt der DVBViewer nun den Filtergraph für die Wiedergabe? Vereinfacht beschrieben führt er folgende Schritte aus:

Inhalt | an den Anfang | vorheriges Kapitel | nächstes Kapitel



Videodecoder-Konfiguration

Bei Videodecodern sind insbesondere zwei Konfigurationsmöglichkeiten von Interesse:

Unbedingte Voraussetzung ist allerdings, dass die Grafikkarte entsprechende Möglichkeiten bietet. Das ist nicht bei allen der Fall. Im Zweifel lassen Sie es einfach auf einen Versuch ankommen.

Fernsehbilder werden in Form von verzahnten Halbbildern übertragen („interlaced“). Zuerst die Zeilen mit ungeradzahliger Nummer. Nachfolgenden die geradzahligen Zeilen, usw. Dieser Trick ermöglicht auf einem Fernseher, der für diese Übertragungsart konstruiert ist, eine einigermaßen flimmerfreie Wiedergabe, trotz der relativ geringen Anzahl von nur 25 vollständigen Bildern pro Sekunde. Ein Computermonitor kann jedoch nur Vollbilder darstellen. Es werden also zwei Halbbilder, die eigentlich kurz nacheinander kommen sollten, zu einem Vollbild zusammengesetzt, und erscheinen dann gleichzeitig, was sich bei Bewegungen auswirkt.

Es ist Aufgabe des Videodecoders, durch ein geeignetes Deinterlacing-Verfahren diese Effekte zu beseitigen oder zumindest zu mildern. Dafür gibt es verschiedene Methoden, und deshalb auch meist mehrere Einstellmöglichkeiten. Die wichtigsten sind:

Außerdem gibt es Kombinationen dieser beiden Verfahren. Am besten, man probiert sie aus, um sich einen Eindruck von den Auswirkungen zu verschaffen.

Rufen Sie im DVBViewer über „Einstellungen/ Filter“ die Eigenschaftsseite des Videodecoders auf und überprüfen Sie, ob es Einstellmöglichkeiten für die Hardware-Beschleunigung und das Deinterlacing gibt. Es gibt auch Videodecoder, die für die Einstellungen einen Eintrag in der Systemsteuerung anlegen (Sonic). Falls dies nicht zum Ziel führt, probieren Sie einen anderen Videodecoder.

Inhalt | an den Anfang | vorheriges Kapitel | nächstes Kapitel



RadLight Filter Manager

Wer bei DirectShow-Angelegenheiten ein Wörtchen mitreden will, braucht den RadLight Filter Manager, der auch bei Reparaturmaßnahmen unverzichtbar ist (Download).

Der RadLight Filter Manager ist ein sehr wirkungsvolles Werkzeug. Bei unsachgemäßer Handhabung kann man damit die Multimedia-Fähigkeiten eines PC nachhaltig beeinträchtigen. Von planlosem Experimentieren ist deshalb dringend abzuraten!

Wenn Sie die vorherigen und diesen Abschnitte sorgfältig gelesen haben, und darauf achten, dass die Log-Funktion des Filtermanagers immer eingeschaltet ist, sollten Sie jedoch auf der sicheren Seite sein. Auf der Log-Registerkarte werden alle Vorgänge protokolliert, so dass Sie sie notfalls wieder rückgängig machen können.

Der Filter Manager zeigt nach dem Start alle vorhandenen Filter in einer Baumansicht. Für den DVBViewer sind besonders die in der Abteilung „DirectShow“ vorhandenen Einträge von Interesse. Schauen Sie sich dort einmal um. Sie werden staunen, wie viele Filter in Ihrem System vorhanden sind.

Was kann man nun mit dem Filter Manager konkret machen? Hier ein Überblick:

Meistens werden Filter durch die Software, die sie mitbringt, oder durch einen Installer automatisch im System registriert. Manchmal erhalten Sie jedoch nur die reinen ax-Dateien. Registrieren Sie sie wie beschrieben, damit sie im DVBViewer verwendet werden können.

Auf diese Weise können Sie Störenfriede (zum Beispiel aus einem Codec-Pack) aus dem Verkehr ziehen. Die dazugehörige Datei wird nicht gelöscht, so dass sich der Vorgang mit „Register“ rückgängig machen lässt. Dazu müssen Sie allerdings wissen, wie die Datei heißt und wo sie sich befindet. Dies erfahren Sie auf der Log-Registerkarte.

Das Registrieren und Deregistrieren von DirectShow-Komponenten sowie das Ändern von Merit-Werten (siehe unten) erfordert unter Windows 2000/XP/Vista Administratorrechte! Insbesondere unter Vista kann es erforderlich sein, den Filtermanager explizit mit Administrator-Rechten zu starten (Rechtsklick...), selbst wenn man sich in einem Administrator-Konto befindet.

Manchmal ist das Neu-Registrieren eines Filters eine geeignete Reparaturmaßnahme, wenn man den Verdacht hat, dass die Einträge in der Windows-Registry beschädigt sind. Besonders wichtige Dateien, die auf jeden Fall sauber im System registriert sein müssen, befinden sich im Ordner Windows\System32. Das sind qdvd.dll (Overlay Mixer), mpg2splt.ax (Microsoft Demultiplexer) und vor allem quartz.dll - eine zentrale DirectShow-Datei, die gleich mehrere unverzichtbare Filter wie Video-Renderer enthält.

Die Änderung des Merit-Wertes ist von Nutzen, wenn man es zum Beispiel mit Decodern zu tun hat, die sich notorisch vordrängeln. Man bestraft sie mit MERIT_UNLIKELY (Benutzung unwahrscheinlich), und dann ist Ruhe.

Ein neuer Merit-Wert wird erst wirksam, wenn Sie sich aus dem aktuellen Benutzerkonto ab- und wieder anmelden, oder den PC neu starten. Wenn Sie es rückgängig machen wollen, verrät die Log-Registerkarte den vorherigen Wert.

Weitere Befehle bietet das Kontext-Menü, das nach einem Rechtsklick in den Filtermanager erscheint.

Inhalt | an den Anfang | vorheriges Kapitel | nächstes Kapitel



GraphEdit/GraphStudio

Nun ein besonders interessantes Spielzeug: Gleichzeitig eine Art Mediaplayer und ein grafisches User-Interface für den DirectShow-GraphBuilder. Damit können Sie hinsichtlich DirectShow (fast) alles machen, was Programmierer mit ihrem Code veranstalten.

GraphEdit stammt von Microsoft. Das Programm – ein Bestandteil des DirectX-SDK - ist ursprünglich für Programmierer vorgesehen, die vor dem Code-Eintippen auf bequeme Weise ausprobieren wollen, wie die eingeplanten Filter zusammenarbeiten. Glücklicherweise kann man sich den Download des ganzen SDK-Pakets sparen, da GraphEdit auch einzeln im Web aufzutreiben ist. Einen Download-Link finden Sie im DVBViewer-Forum in der Linkliste. Inzwischen existiert mit GraphStudio eine empfehlenswerte freie Alternative, die ähnlich wie GraphEdit funktioniert, aber besser handhabbar ist und zusätzliche Funktionen aufweist.

GraphEdit stellt also den Filtergraphen anschaulich dar. Jetzt wissen Sie auch, woher die Filtergraph-Diagramme in dieser Anleitung stammen. Und es ist, wie Sie gleich sehen werden, sehr einfach, so ein Bild zu erzeugen. Probieren Sie die folgenden Funktionen:

Damit wissen Sie, was der GraphBuilder standardmäßig für MPG-Videos verwendet. Stoppen Sie nun das Video und wählen Sie File/ New. Dann geht es weiter:

Auf diese Weise können Sie natürlich auch andere Filter vorgeben – einen Audiodecoder, einen Video-Renderer, was immer sie wollen. Wenn irgendwie möglich, wird der GraphBuilder ihre Auswahl einbauen. Und es kommt noch besser. Was der GraphBuilder kann, können Sie auch. Sorgen Sie zunächst dafür, dass ein vollständiger Filtergraph vorhanden ist.

Sie können den DVBViewer Filter („DVB Source“) zwar in den Graphen einfügen und mit anderen Filtern verbinden, aber in GraphEdit nicht in Betrieb nehmen. Er braucht eine spezielle Ansteuerung, die in GraphEdit nicht zur Verfügung steht.

Auch einzelnes Löschen ist möglich, und zwar durch Anklicken eines Filters oder einer Verbindung und anschließendes „Edit/ Delete“. Auf diese Weise können Sie den Filtergraphen per Hand .beliebig ändern Falls Sie versuchen, zwei Pins zu verbinden, die nicht miteinander können, probiert der GraphBuilder zunächst, Zwischenfilter einzusetzen. Wenn auch das nicht funktioniert, gibt es eine Fehlermeldung.

Und das ist noch längst nicht alles. GraphEdit und GraphStudio erlauben es auch, dem DVBViewer über die Schulter zu schauen.

Der Einblick durch „Connect to remote Graph“ kann für eine Diagnose bei Wiedergabe-Problemen wichtig sein. So lassen sich beispielsweise unerwünschte Eindringlinge im DVBViewer-Graphen ermitteln. Wenn Sie im DVBViewer-Forum um Rat fragen, ist ein angehängter Schnappschuss des DVBViewer-Graphen für Supporter aufschlussreich. Mit „Graph/ Make Graph Snapshot“ macht GraphStudio dies besonders einfach. Der Befehl befördert das komplette Bild in die Windows-Ablage, auch wenn es im Fenster nicht vollständig zu sehen ist. Zusätzlich zeigt das Programm mit „View/ Text Information“ alle Details des Filtergraphen als Text an, wenn Sie in dem Fenster „Graph Report (Level 5)“ wählen und auf „Refresh“ klicken. Bei Problemen kopieren Sie diesen für Entwickler sehr informativen Text, posten ihn im DVBViewer Forum oder hängen ihn als Textdatei an.

Sie können nach „Connect To Remote Graph“ den Filtergraphen des DVBViewers in GraphEdit bearbeiten (z.B. um bestimmte Filter auszutauschen oder zu entfernen). Dazu müssen Sie den Graphen jedoch erst anhalten, indem Sie in der Kontrollleiste des DVBViewers auf den Stop-Button klicken, ansonsten drohen Abstürze. Nach vollendeter Operation am lebenden Objekt setzen Sie die Wiedergabe fort, indem Sie in der Kontrollleiste des DVBViewers (!) auf den Play-Button klicken.

Inhalt | an den Anfang | vorheriges Kapitel | nächstes Kapitel