03.09.10
42 User online
 So funktionieren DirectShow-Filter

Filter-Fummeleien

Das DirectShow-System von Windows ist für das Abspielen von Video und Audio zuständig. Medienströme gelangen von der Festplatte, aus dem Netzwerk oder von DVD in ein Filtersystem, das die Mediendaten verarbeitet und sie schließlich am Bildschirm anzeigt. Nahezu alle Movie-Player verwenden diesen etwas undurchsichtigen Mechanismus, wobei aber so einiges schief gehen kann.



DirectShow ist für die meisten Anwender ein Sack Flöhe: Filme haben kein Bild oder keinen Ton oder beides, obwohl anscheinend alles richtig installiert ist. Schuld ist fast immer DirectShow (DS), das auf so manchem Windows-Rechner durcheinander geraten ist. Doch Rettung naht: Dieser Artikel erklärt das DS-System und zeigt, wo man den Hebel bei Bild- und Tonproblemen ansetzt. Folgende Fragen werden geklärt:

  • Was sind DirectShow-Filter?
  • Wie werden DirectShow-Filter registriert?
  • Wie bestimmt man, welcher Filter verwendet wird?
  • Wie wird ein spezieller Decoder zum Abspielen gewählt?
  • Was macht GraphEdit?

    DirectShow installieren

    DirectShow gehört zum kostenlosen DirectX und wird mit diesem installiert. Zusätzlich zur aktuellen DirectX Runtime 9b ist die Installation des ebenfalls kostenlosen DirectX-SDK empfehlenswert - es enthält viele Informationen unter anderem zu DS und vor allem eine recht umfangreiche Online-Hilfe, allerdings nur auf englisch.

    So funktioniert DirectShow

    Das DS-System besteht aus Filtern, die miteinander verkettet einen so genannten Filtergraphen ergeben. Filter sind in Kategorien eingeteilt: Es gibt welche um Medienströme zu lesen, welche zum Demuxen (Demultiplexer), zum Dekomprimieren (Decoder) und schließlich zum Anzeigen (Rendern). Am Ende der Kette können Bild oder Ton auch auf die Festplatte geschrieben werden – dafür ist der File Writer zuständig. Somit lässt sich jedes Video auf diese Art demuxen, vorausgesetzt die notwendigen Filter sind installiert. Früher, als es noch wenig Tools gab, war das tatsächlich manchmal der einzige Weg zum Demuxen eines Videos.


    So sieht eine einfache Filterkette aus (Quelle: DirectX SDK).


    Das Bild zeigt einen einfachen Filtergraphen: Links gelangt das Video in den Splitter, der Bild und Ton trennt (demuxt). Das Bild wird an den AVI-Decompressor geschickt – zum Beispiel den ffdshow-Decoder – und wird schließlich vom Video Renderer angezeigt. Der Ton wird ohne weitere Manipulation von Windows wiedergegeben (Default DirectSound Device). Dazwischen können sich jedoch viele weitere Filter befinden.

    AVI-Decompressoren sind zum Beispiel die MPEG4-Decoder DivX, XviD, ffdshow oder 3ivx, diese sind ebenfalls DS-Filter. Etwas später wird gezeigt, wie man mit einem Software-Player wie dem Media Player Classic einen dieser Filter zum Abspielen auswählt.

    Solche Video-Decoder können das Bild zur Laufzeit manipulieren: Sie hellen das Bild zum Beispiel auf, verändern die Farben oder führen ein De-Interlacing durch. Am meisten Möglichkeiten bietet der ffdshow: Er kann das Bild auf vielfältige Weise manipulieren, Untertitel laden usw. Ähnlich ist es beim Ton: Bei AC3-Ton können zum Beispiel die Surround-Effekte oder die Sprachanteile verstärkt oder vermindert werden und so weiter. Alle diese Effekte kann man sofort sehen bzw. hören. DS-Decoder verändern also Bild und Ton nachträglich während des Abspielens ohne das eigentliche Video zu verändern.

    Der Vorteil der Filtertechnik besteht darin, dass man einen Medienstrom durch beliebig viele Filter schicken kann - jeder dieser Filter manipuliert den Strom bis schließlich das Ergebnis ausgegeben wird.

    Ist ein Filter erst einmal in Windows registriert, kann jede Anwendung diesen Filter benutzen und dem Anwender erlauben, die Eigenschaften des Filters zu ändern - vorausgesetzt sie bietet eine Möglichkeit dazu.

    Manche Filter sind Freeware wie der AC3Filter, andere sind kommerziell, wieder andere sind Bestandteil von Windows (also sind direkt nach der Windows-Installation schon vorhanden).

    DS-Filter installieren

    Am einfachsten installiert man DS-Filter, indem man eine DVD-Player-Software installiert. Das Setup registriert die Filter dabei automatisch. Es geht aber auch von Hand mit dem Tool regsvr32, das Bestandteil von Windows ist:

    regsvr32 /s mpgdec.ax // MPEG-Video-Decoder registrieren

    Der Schalter /s für “silent” unterdrückt die Bildschirmausgabe „Der Filter wurde erfolgreich installiert“ (die Filter haben alle die Endung „ax“ oder „dll“). Unter anderem wird dabei der Filter in der Registry eingetragen, wo ihn andere Anwendungen finden können.

    Am einfachsten registriert man Filter mit nur einem Doppelklick. Dazu verknüpft man die Endung „ax“ mit dem Programm regsvr32.exe und zwar so: Rechtsklick auf den Filter und „Öffnen“ wählen. Dann „Programm aus einer Liste auswählen“ markieren, „OK“, „Durchsuchen“ und nach WindowsSystem32 wechseln. Dort die Datei regsvr32.exe suchen, doppelklicken und alles mit „OK“ schließen. Danach wird eine ax-Datei einfach per Doppelklick registriert.

    Das Deregistrieren von DS-Filtern erfolgt ebenfalls mit regsvr32 und dem u-Schalter. Viel mehr kann dieses kleine Tool auch nicht. Hier die möglichen Parameter:


    Die Parameter des regsvr32-Befehls (Aufruf in eines DOS-Box).


    Wenn man häufig die gleichen Filter (de)registriert, schreibt man sich kleine Batchdateien dafür.

    Welches Schweinderl hättens denn gern?

    Im Laufe der Zeit sammeln sich immer mehr DS-Filter im System und man benötigt einen Überblick, welche Filter überhaupt installiert sind. Manche Player wie Zoom Player zeigen die registrierten DS-Filter an oder man nimmt ein Tool wie GraphEdit, das im Folgenden noch eine wichtige Rolle spielen wird. GraphEdit gehört zum DirectX SDK.


    Anzeige der registrierten DS-Filter mit GraphEdit.


    Hier sieht man den Speicherort des Filters auf der Festplatte sowie einen seltsamen Wert: den Merit. Der Merit eines Filters bestimmt, welchen Filter Windows tatsächlich verwendet. Je höher der Merit eines Filters ist, desto wahrscheinlicher wird er verwendet. Sind also verschiedene Filter für den gleichen Zweck registriert – wie zum Beispiel die erwähnten MPEG4-Decoder – entscheidet der Merit darüber, welcher Filter tatsächlich verwendet wird. Merits sind im DirectX-SDK definiert:


    Definition einiger Merits (Quelle: DirectX SDK).


    Zwischen diesen Werten können viele andere liegen: Existieren nur diese Merits und definiert man den Merit eines Filters zu 0x800001, so wird dieser zum bevorzugten Filter. Die Anzeige und das Ändern der Merits ist leider etwas umständlich. Außer mit GraphEdit kann auch der Zoom Player Merits anzeigen und ändern:


    Ändern von Merits beim Zoom Player.


    An dieser Stelle im Zoom Player kann man auch Filter deregistrieren, das sollte man aber eigentlich nicht machen, weil sie dann wirklich nicht mehr zur Verfügung stehen. Um also einen bestimmten MPEG4-Decoder zu verwenden, muss man seinen Merit hoch setzen und sich vergewissern, dass die Merits aller anderen registrierten MPEG4-Decoder kleiner sind.

    Etwas einfacher geht es beim Media Player Classic. Hier fügt man in den „Overrides“ die gewünschten Filter hinzu und definiert deren Merits bzw. blockiert bestimmte Filter, wodurch sie nicht mehr verwendet werden. Für MPEG4-Decoder kann diese Filterliste zum Beispiel so aussehen:


    Ändern von Merits beim Media Player Classic.


    Der 3ivx-Decoder ist hier blockiert, so dass man nur noch die Merits vom Nero- und vom DivX-Decoder richtig setzen muss und schon wird der Film mit genau diesem Decoder abgespielt.

    Graphen bauen

    GraphEdit ist ein Tool für Filter-Programmierer, die damit ihre Filtergraphen erst einmal testen, bevor sie programmieren. Die Verknüpfung der Filter ist nämlich ein Problem, weil diese erst intern darüber verhandeln, ob sie zusammen arbeiten möchten oder nicht. Zunächst lässt man eine Filterkette mit GraphEdit grafisch dargestellen. Dazu lädt man den gewünschten Film über „File/Render Media File“:


    Ein Filtergraph in GraphEdit.


    Dieser Filtergraph zeigt alle DS-Filter, die zum Abspielen dieses Films verwendet werden. Es handelt sich um einen AVI-Container mit drei Streams. Stream 00 ist die Bildspur, die über ffdshow in den Video-Renderer gelangt. Stream 01 und Stream 02 sind Tonspuren. Stream 01 ist eine AC3-Spur, die über den AC3-Filter in den Morgan Stream Switcher geführt wird, der die Aufgabe hat, die Tonspuren umzuschalten. Stream 02 ist eine MP3-Spur – in diesem Fall die Kommentarspur, die platzsparend als 96 kbs MP3 kodiert wurde.

    Mit „Play“ wird dieser Filtergraph nun abgespielt. Leider kann man das Bild nicht bildschirmfüllend darstellen, sonst wäre GraphEdit kein schlechter Movieplayer, aber zum Testen der Filter reicht es.

    DS-Filter verfügen links über Input- und rechts über Output-Pins. Mit der Maus verbindet man die Input- mit den Output-Pins. Kann keine Verbindung hergestellt werden, erscheint eine Fehlermeldung. Es bleibt nichts anders übrig, als zu probieren, welche Filter zusammen passen.

    Der Filtergraph kann als XML-Datei gespeichert werden und es gibt sogar einige Anwendungen, die solche Graphen lesen können. Für den Zoom Player existiert zum Beispiel ein Tutorial, wie man einen eigenen DVD-Player aus Filtern verschiedener Hersteller strickt, der dann vom Zoom Player verwendet wird (nur mit der kostenpflichtigen Pro-Version möglich). Eine andere Anwendung ist ProgDVB für digitale TV-Aufnahmen. Im Buch gibt es dazu ein ausführliches Kapitel.

    Benötigte Software

    DirectX 9b Runtime
    DirectX SDK

    DirectShow-Filter (Auswahl):
    3ivx Filter (30 Tage Testversionen)
    AC3-Filter
    DivX
    ffdshow
    XviD

    DirectShow-Player (Auswahl):
    Media Player Classic
    Zoom Player


    Veröffentlicht: 14.2.2004
    Letzte Änderung: 14.2.2004
  •  
    Grenze
    Für den Inhalt der Kommentare sind die Verfasser verantwortlich.

    Keine anonymen Kommentare möglich, bitte zuerst anmelden

    Re: So funktionieren DirectShow-Filter (Punkte: 0)
    von Anonymous am Monday, 23.August. @ 14:32:04 CEST
    Hallo ProgDVB Benutzer !

    Ich hab ein neues Tool geschrieben, mit dem sich

    Streaming-Video Netzwerke aufbauen lassen.

    Probiert es mal aus. Es ist gerade in der Beta

    Phase. In der Zukunft wird es kompatible Plugins

    für alle möglichen Applikationen geben (Media Player

    und WatchTVpro , DScaler usw ). Diese Applikationen

    können dann miteinander Mpeg Datenströme austauschen.

    http://download.progdvb.com/modules/stream.zip


    apollo0510@hotmail.com