Download Ein generisches Monitoringsystem für akustische
Transcript
Ein generisches Monitoringsystem für akustische Datenströme Diplomarbeit Jan Henrik Wild Rheinische Friedrich-Wilhelms-Universität Bonn Institut für Informatik III 01.03.2005 ii Remember, Information is not knowledge; Knowledge is not wisdom; Wisdom is not truth; Truth is not beauty; Beauty is not love; Love is not music; Music is the best. Frank Zappa iii Danksagung Bei der Entstehung der vorliegenden Diplomarbeit standen mir einige Personen hilfreich zur Seite, denen ich im Folgenden danken möchte: Zunächst möchte ich mich bei der Arbeitsgruppe Multimedia-Signalverarbeitung der Universität Bonn, und dabei insbesondere bei Professor Dr. Clausen für die Vergabe dieses Diplomarbeitsthemas bedanken. Weiterhin danke ich meinem Betreuer Dr. Frank Kurth für die konstruktive Zusammenarbeit und die positive Unterstützung während der gesamten Dauer der Arbeit. Weiterhin waren die Anregungen von Andreas Ribbrock und Rolf Bardeli eine Hilfe bei der Konzeptionierung des Systems. Ich möchte meiner Familie und meinen Freunden danken, die mich in der gesamten Zeit vermutlich mehr ertragen als erlebt haben und mir in den richtigen Momenten durch Unterstützung oder Ablenkung geholfen haben. Vor allem möchte ich mich bei Christopher Gies, Kai Starke, Julia von Selchow, Sebastian Wild und Kai Leder für Verbesserungsvorschläge und Feedback bedanken. Mein besonderer Dank gilt Eleni Orfanidou, die immer für mich da war und mir Stärke gab. iv Inhaltsverzeichnis 1 1 Einleitung und Übersicht 1.1 Gliederung der Diplomarbeit ........................................ 1.2 Hinweise zur Notation .............................................. 3 3 2 Audiomonitoring 4 4 7 10 12 14 24 24 24 25 25 26 26 26 27 28 28 29 34 3 Multimedia-Frameworks 37 ............................................. 2.1 Der Monitoringbegriff 2.2 Inhaltsbasierte Audioidentifikation ................................. ............................................. 2.3 Der Audiofingerabdruck 2.4 Ein generisches Audioidentifikationssystem .......................... ............................................. 2.4.1 Front-End 2.4.2 Fingerabdrucks-Modellierer ................................. 2.4.3 Distanzmetrik ............................................. 2.4.4 Suchmethoden ............................................. 2.4.5 Hypothesen-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4.6 Datenbank-Pflege .. ............................ ........ 2.5 Aktuelle Audioidentifikationssysteme ................................. 2.5.1 AudioID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.2 Shazam Ent. / Wang ....................................... 2.5.3 AudioDNA ............................................. 2.5.4 AudioHashing ............................................. 2.5.5 Audentify! ............................................. 2.6 Audioklassifikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7 Audiomonitoringsysteme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Frameworks ................................................... 3.2 Multimedia-Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Aktuelle Multimedia-Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Quicktime ............................................. 3.3.2 Java Media Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3 Linux ................................................... 3.3.4 Helix / RealMedia ....................................... 3.3.5 Windows Media . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.6 DirectX ................................................... 3.3.7 MPEG-21 ........................................ ..... 4 Entwurf des GenMAD-Systems 4.1 Verwandte Ansätze & Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Wahl des Multimedia-Frameworks .......................... ........................................ ..... 4.2 Das GenMAD-System 4.2.1 Grundlegendes Konzept des GenMAD-Systems .............. .................... 4.2.2 Zentrale Aspekte der GenMAD-Applikation 4.2.3 Filter ........................................ ........ v 38 40 43 43 44 45 46 46 47 49 50 51 52 53 53 56 58 59 5 Implementation 5.1 GenMAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 Zentrale Klassen von GenMAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....................................... 5.1.2 DirectShow-Events 5.1.3 Hinzufügen neuer Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....................................... 5.1.4 Speichern & Laden 5.1.5 Hinzufügen von Mediendateien als Datenquelle . . . . . . . . . . . . . . . . . . . . ....................................... 5.1.6 Filter-Konfiguration 5.1.7 Zeit und Uhren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.8 Datenfluss, Abspielkontrolle & Seeking . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.9 Visualisierung ............................................. ................................................... 5.2 Das Filter-SDK 5.2.1 Medienformat-Abgleich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....................................... 5.2.2 Datenübertragung 5.2.3 Konfiguration ............................................. 5.2.4 Seeking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.5 Laden/Speichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Implementierte GenMAD-Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 MonitoringAudentifyFilter ................................. 5.3.2 MonitoringEventNullRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3 MonitoringEventVisualizer ................................. 5.3.4 MonitoringEventSplitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.5 MonitoringEventMerger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.6 MonitoringEventExcluder ................................. 5.3.7 MonitoringEventIncluder ................................. 5.3.8 MonitoringXMLWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.9 MonitoringXMLReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.10 MonitoringClassifier ....................................... 5.3.11 Weitere filterbasierte Problemlösungen . . . . . . . . . . . . . . . . . . . . . . . . . . 59 61 63 63 64 64 65 65 65 66 67 68 68 69 70 70 70 70 70 71 71 71 72 73 73 73 75 76 6 Anwendungen, Tests und Bewertungen 77 7 Zusammenfassung, Diskussion und Ausblick 88 6.1 Test des Klassifikationsfilters ....................................... 6.1.1 Datenauswahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.2 Audiomerkmale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3 Einfluss der Anzahl von Trainings- und Testdaten .............. 6.1.4 Einfluss verschiedener Abtastraten .......................... 6.1.5 Einfluss der Fensterweite ................................. ....... 6.1.6 Vergleich verschiedener Nachbearbeitungsmechanismen 6.1.7 Einfluss der Parameter des k-NN-Verfahrens .................... .............. 6.1.8 Parallelklassifikation mit verschiedenen Abtastraten 6.1.9 Klassifikationsleistung anhand von Radiomitschnitten . . . . . . . . . . . . . . ................................. 6.2 Performanz des GenMAD-Systems 6.2.1 Performanz der entwickelten Filter .......................... ................................. 6.2.2 Performanz von GenMAD 6.3 Anwendungen ................................................... vi 77 77 78 79 80 80 80 81 81 82 84 84 85 85 91 Anhang Anhang A: Hinweise zur Verwendung des Filter-SDK . . . . . . . . . . . . . . . . . . . . 91 Anhang B: Hinweise zur Verwendung von GenMAD . . . . . . . . . . . . . . . . . . . . 92 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Anhang C: Benutzerhandbuch Anhang D: Technische Dokumentation von GenMAD . . . . . . . . . . . . . . . . . . . . 97 . . . . . . . . . . . . . . . . . . . . 114 Anhang E: Technische Dokumentation des Filter-SDK Anhang F: Bedienung des Klassifikationsfilters . . . . . . . . . . . . . . . . . . . . . . . . . . 124 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Anhang G: Inhalt der beiliegenden CD 126 Literaturverzeichnis vii Kapitel 1 Einleitung und Übersicht Mit steigenden Anwenderzahlen und immer schnelleren Internet-Zugängen, größeren Speicherkapazitäten und höher aufgelösten Daten stiegen Menge und Anteil von MultimediaInhalten in den letzten Jahren rasant an. Ob Internet-PC, Digitalkamera oder DVD-Player – für viele Menschen ist der Umgang mit multimedialen Inhalten alltäglich geworden. Virtuelle Ladentheken im Online-Musikgeschäft setzten im Jahr 2004 ca. 270 Mio. Dollar um und werden dies nach Schätzungen des Marktforschungsunternehmens Jupiter Research bis zum Jahr 2009 auf 1,7 Milliarden Dollar ausweiten. Dabei werden riesige Datenbanken verwaltet: Apples iTunes [5], mit 70% Marktanteil Branchenprimus, bietet Musik aus einem Bestand von über 800.000 Titeln an, Neueinsteiger Microsofts MSN Music [72] will dies mit einer Million Titeln noch übertrumpfen. Gleichzeitig zeichnet sich auch schon die nächste Plattform zur Verbreitung multimedialer Inhalte ab, nämlich in Form von Mobiltelefonen und anderen mobilen Techniken, in die bereits bestehende Technologien integriert werden, z.B. Videokonferenzen oder mobile Musikbiblio-theken. Doch mit der steigenden Datenflut ergeben sich sowohl für Privatpersonen als auch für Firmen neue Herausforderungen im Umgang mit Multimediadaten: Wie sollen die Inhalte katalogisiert, verwaltet und wiederverwendet werden? Wie kann der Überblick über riesige Datenbestände behalten oder wie können neue Geschäftsbereiche darauf aufgebaut werden? Im Umgang mit textorientierten Daten scheint dies einfacher zu sein: Zum einen benötigen diese deutlich weniger Speicherplatz, zum anderen existieren zahlreiche Ansätze aus dem Bereich des Information Retrieval, um durch effiziente Vergleichsverfahren oder Inhaltsanalysen Textsammlungen zu strukturieren und zu verwalten. Suchmaschinen bieten darauf aufbauend mehr oder weniger komfortable Suchmasken, um Inhalte in der Unstrukturiertheit des World Wide Web (WWW) zu finden. Einer der Väter des WWW, Tim Berners-Lee, entwarf daher das Konzept des Semantic Web [119], welches durch Verwenden universeller, XML-basierter Regeln die semantische Repräsentation von in Daten verpacktem Wissen ermöglichen und dadurch die automatisierte Verarbeitung von Daten entscheidend verbessern und vereinfachen soll. In ähnlicher Weise stellt MPEG-7 [70] einen Standard für die Beschreibung von Multimediainhalten durch Deskriptoren dar. Dieser könnte z.B. von Suchmaschinen, ob Desktop- oder webbasiert, angewandt werden, um das Auffinden von Inhalten nach bestimmten Kriterien zu erlauben. Das tatsächliche maschinelle Verstehen von Multimediainhalten, Semantic Computing, erfordert aber noch mehr als Deskriptoren. Erst ein tieferes Verständnis von Inhalten, welches sich nicht beigefügten und eingebetteten Metadaten bedient, sondern den Inhalt selbst verarbeitet, erlaubt z.B. automatisiertes Bewerten und Katalogisieren von Multimediadaten. In diesem Kontext fällt dem Multimedia Information Retrieval eine besondere Rolle zu. Dieses junge Teilgebiet der Informatik befasst sich mit verschiedenen Ansätzen, um multimediale Daten inhaltsbasiert analytisch zu verarbeiten und ist somit ein wichtiger Puzzlestein des Semantic Computing. Ein wichtiger Teilbereich, der in dieser Diplomarbeit behandelt wird, ist das Audio 1 1. Einleitung und Übersicht Information Retrieval, welches der Gewinnung von semantischen Beschreibungen aus beliebigen Audiodaten dient. Hier entwickelte Technologien werden z.B. von Mobilfunkanbietern wie Vodafone oder O2 dazu verwendet, in Query-By-Mobile genannten Verfahren Musik zu identifizieren, bei dem ein Benutzer sein Mobiltelefon z.B. vor ein Radio hält, in dem ein ihm unbekanntes Lied läuft. Da in solchen Verfahren eingehende Audiosignale üblicherweise mit Hilfe einer Menge von Musikstücken verglichen werden, die in einer Datenbank repräsentiert sind, spielt deren Umfang der darin gespeicherten Titel eine entscheidende Rolle. Philips beispielsweise hat sich daher für ihren AudioID-Service die Dienste von Gracenote, vormals CDDB, gesichert, in deren Datenbank Metadaten für vier Millionen Titel abgelegt sind [85]. Andere Firmen wie MusicMatch [75] integrieren eine solche – allgemein Audio Fingerprinting genannte – Identifikationstechnologie in Software zur automatischen Benennung von Musikstücken oder bieten neuartige Dienste an, die ein Musikstück klassifizieren und entsprechende Vorschläge zu ähnlichen Stücken machen. Ein dazu eng verwandtes Gebiet, das sich aus der Notwendigkeit von Kontrollmechanismen ergibt, ist das sogenannte Audiomonitoring. Dieses befasst sich mit der Echtzeitüberwachung von Audioströmen und verwendet Algorithmen aus der Audioidentifikation und -klassifikation. Anwendung ergibt sich hierbei z.B. aus Musik-Tauschbörsen, bei denen Musikstücke illegal ausgetauscht werden. Da deren Benutzer wie im Fall von Napster [77] einfache namensbasierte Filtermechanismen umgehen konnten, hat die Musikindustrie ein starkes Interesse an inhaltsbasierten Kontrollmechanismen [90]. Ebenso könnten Benutzer solche Identifikationsfunktionalitäten nutzen, um Inhalte zu verifizieren [109]. Verwandte Szenarien ergeben sich aus der Protokollierung von Radio- und Fernsehsendungen, um Lizenzgebühren abzurechnen oder das Senden von Werbeblöcken zu überprüfen. Die in diesem Zusammenhang oft genannten Verfahren zur Verwendung von sogenannten Audiowasserzeichen, also mittels Methoden der Psychoakustik eingebetteten Metadaten zur Markierung eines Stückes, die nur minimale Veränderung des Klanges hervorrufen, sind ebenfalls nur in bestimmten Fällen anwendbar und können im Allgemeinen ein inhaltsbasiertes Erkennen nicht ersetzen. Die Szenarien, in denen Audiomonitoring angewandt werden kann, sind jedoch keineswegs auf Musik beschränkt, obwohl es sich z.Zt. wahrscheinlich um das wirtschaftlich umfangreichste Anwendungsszenario handelt. Vielmehr werden potentiell alle Arbeitsfelder umfasst, in denen akustische Daten verarbeitet werden, wie z.B. im Falle von Projekten zum automatisierten Monitoring von Tierstimmen, die momentan von der Arbeitsgruppe MultimediaSignalverarbeitung der Universität Bonn in Kooperation mit verschiedenen Partnern aus der Biologie und dem Bundesamt für Naturschutz in Angriff genommen werden. Obwohl – wie in Kapitel 2 noch genannt – vielfältige Ansätze existieren, um Audiosignale zu identifizieren, zu klassifizieren und zu überwachen, sind diese jedoch in nur sehr eingeschränktem Maße austausch- und vergleichbar. Darüber hinaus fehlt oftmals ebenso eine Möglichkeit zur flexiblen Verwendung verschiedener Datentypen wie eine Schnittstelle zur Einbindung von fremden Algorithmen. Ziel der vorliegenden Diplomarbeit ist daher die Konzeptionierung und Realisierung eines generischen Monitoringsystems für akustische Datenströme. Generisch bezeichnet im vorliegenden Fall die Eigenschaft, beliebige Monitoring-Algorithmen dynamisch über eine definierte Schnittstelle verwenden zu können. Dies schließt auch Möglichkeiten zur Filterung und Visualisierung derjenigen Daten mit ein, die die eingebundenen Algorithmen erzeugen. Auch wenn dies nicht die Definition eines Standards zur Arbeit mit Audiomonitoring-Verfahren darstellt, so soll das System doch auf die Notwendigkeit eines solchen Systems hinweisen und praxisnah Vor- und Nachteile verdeutlichen. Die Erweiterbarkeit des Systems ist daher wesentlicher Bestandteil des zugrunde liegenden Konzeptes. 2 1. Einleitung und Übersicht 1.1 Gliederung der Diplomarbeit Die vorliegende Diplomarbeit ist folgendermaßen aufgebaut: Im nachfolgenden Kapitel 2 werden allgemeine Konzepte und bestehende Ansätze zum Gebiet des Audiomonitorings und dessen Anwendungen vorgestellt. Das Kapitel 3 beschäftigt sich mit technischen MultimediaFrameworks, welche die maßgebliche Grundlage des in dieser Arbeit entwickelten generischen Monitoringsystems darstellen. Das in Kapitel 4 erläuterte neuartige Konzept dieses Monitoringsystems stellt einen wesentlichen Bestandteil der im Rahmen dieser Diplomarbeit geleisteten wissenschaftlichen Arbeit dar. Die Implementierung des Systems wird in Kapitel 5 erläutert und im Kapitel 6 verschiedenen Tests und Anwendungen unterzogen. Das abschließende Kapitel 7 fasst die Ergebnisse dieser Diplomarbeit zusammen und soll mittels einer Diskussion einen Ausblick auf mögliche Erweiterungen und fortführende Maßnahmen bieten. Der Anhang schließlich umfasst sowohl das Benutzerhandbuch als auch die technische Dokumentation des entwickelten generischen Monitoringsystems. Sämtliche im Rahmen dieser Diplomarbeit entwickelten Komponenten liegen als kompilierte Versionen und im Quelltext auf CD bei. 1.2 Hinweise zur Notation Neu eingeführte Begriffe sind ebenso wie mathematische Zeichen und betonte Textelemente durch kursive Schriftweise hervorgehoben, z.B. f(x). Technische Bezeichnungen wie Klassen-, Schnittstellen- oder Funktionsnamen sind wie folgt durch einen besonderen Schrifttyp gekennzeichnet: IMonitoringMaster. In dieser Arbeit verwendete Quellcode-Passagen sind ebenfalls mit dieser Schrift versehen, sind jedoch zusätzlich grau unterlegt, um sie vom restlichen Textfluss abzuheben: for (int i=0; i<n; i++) Wenn es nötig war, sich in einem Satz einer Personifizierung zu bedienen, so wurde stets die maskuline Form gewählt, z.B. der Benutzer. Dies geschah keineswegs, um weibliche Leser zu irritieren, sondern vielmehr, um ein Textbild zu bewahren, dass dem gewohnten Lesefluss möglichst dienlich sein sollte. 3 Kapitel 2 Audiomonitoring In diesem Kapitel werden der Begriff des Audiomonitorings, verwandte Bereiche und darauf basierende Anwendungen erläutert. Dazu wird zunächst im Abschnitt 2.1 der Begriff des (Multimedia-)Monitorings definiert und der Zusammenhang der einzelnen Teilkomponenten im allgemeinen Fall besprochen. In den beiden darauf folgenden Unterkapiteln wird dies konkretisiert, indem eine zentrale Komponente des Audiomonitorings, die inhaltsbasierte Audioidentifikation und der damit verbundene Audiofingerabdruck erläutert werden, bevor im Abschnitt 2.4 ein generisches Audioidentifikationssystem beschrieben wird. Beispiele existierender Systeme und der ihnen jeweils zugrunde liegenden Theorien sind im Kapitel 2.5 aufgeführt. Der Abschnitt 2.6 befasst sich mit dem eng verwandten Thema der Audioklassifikation und zeigt sowohl Technologien als auch Implementationen. Das abschließende Unterkapitel 2.7 komplettiert das in diesem zweiten Kapitel besprochene Thema des Audiomonitorings und gibt eine Übersicht über Audiomonitoringsysteme. 2.1 Der Monitoringbegriff Monitoring stellt neben Such- und Synchronisationsaufgaben eine dritte zentrale Komponente des Multimediaretrievals dar und bezeichnet das systematische Überwachen von Datenströmen auf bestimmte zu definierende Ereignisse hin (engl. „to monitor“ – abhören, überwachen, kontrollieren). Monitoring findet zahlreiche Anwendungen, etwa in automatischer Inhaltsanalyse von Videosignalen, z.B. zum Auffinden von Firmenlogos [19], der Überwachung des Straßenverkehrs anhand des Geräuschpegels [80] oder der automatischen Transkription von Nachrichtenbeiträgen eines Fernseh- oder Radioprogramms. Ein weiteres Anwendungsgebiet ist die akustische Kontrolle von Grenzwertüberschreitungen bei Maschinen, wie etwa Laufgeräuschen eines Motors. Entscheidender Unterschied zwischen Monitoring und Suche ist die Echtzeit-Anforderung, d.h. die zu untersuchenden Datenströme liegen erst zur Bearbeitungszeit vor. Wir betrachten hier diskrete Datenströme – auch abstrakt als Dokumente bezeichnet – der Form x ⊆ Z × X , die von Monitoringsystemen über die Zeit, diskret durch Z, im endlichen Wertebereich X bearbeitet werden [57]. Kleinste Elemente eines solchen Datenstromes notieren wir mit xi . Im folgenden sei t : Z × X lZ die Projektion auf den Zeitpunkt eines solchen Datenelementes. Im weiteren Verlauf der vorliegenden Arbeit relevant ist weiterhin die folgende, aus der Signalverarbeitung bekannte Kausalitätsanforderung [57]: Das Monitoringsystem kann zu einem Zeitpunkt τ ∈ Z nur auf solchen Eingabedatenelementen xi arbeiten, für die gilt: t ( xi ) ≤ τ . 4 2. Audiomonitoring Q F[Q] F d D 1 F[D1] F D N Datenbank D F[DN ] F Merkmalsraum E Abbildung 2.1: Vergleich von Anfrage und Datenbank In der Praxis verfügt das Monitoringsystem nur über Daten aus einem Zeitfenster der Länge T, d.h. die zu bearbeitende Menge A der Eingangsdaten eines Monitoringsystems zu einem Zeitpunkt τ ∈ Z ist definiert durch A = { x i | τ ≥ t ( x i ) ≥ τ − T }. Gesucht wird beim Monitoring diejenige Menge von Dokumenten einer vorliegenden Multimedia-Datenbank, die an einer oder mehreren Stellen mit der Anfrage (engl. Query) – oder je nach Verfahren mit Teilen davon – in definiertem Maße perzeptuell oder nach sonstigen Kriterien übereinstimmt. Für den Vergleich werden sowohl Query wie abgefragte DatenbankInformationen in einen Merkmalsraum E überführt und mittels eines Ähnlichkeitsmaßes (engl. retrieval status value, RSV) untersucht [27]. E muss dabei stark diskriminierend und somit hochgradig problemspezifisch sein. Formal ausgedrückt: Gegeben sei eine Dokumenten-Datenbank D = (D1, .., DN) von Dokumenten Di ⊆ M , wobei M eine Menge ist, z.B. M = Z × X . Zu einer Anfrage Q ⊆ M wird diejenige Treffermenge TDd ,ε gesucht, die sich mittels einer perzeptuellen Vergleichsoperation d : P ( M ' ) × P ( M ' ) lR≥0 unter Verwendung einer Transformation F : M l M ' aus D ergibt: TDd ,ε (Q ) = { i ∈ [1..N ] | d ( F [Q ], F [ Di ]) ≤ ε }. Dabei ist P(M’) die Potenzmenge von M’. Es sei angemerkt, dass je nachdem, ob es sich bei der Vergleichsoperation d um ein Fehler- oder um ein Distanzmaß handelt, statt der notierten Ähnlichkeitsbedingung ≤ auch ein Unähnlichkeitskriterium ≥ verwendet werden kann. Neben der Suche nach einer Treffermenge ergibt sich im Bereich des Monitorings zusätzlich die Anforderung, zu einem festen Q alle Stellen aller Dokumente Di zu finden, die entsprechend oben genanntem Schema mit der Anfrage übereinstimmen, etwa zum Auffinden von Werbejingles in einem Radiostream. Die Grenzen zwischen Suche und Monitoring können aber je nach Einsatzgebiet und Zweck auch weniger klar sein. Je nach Wahl der Vergleichsoperation handelt es sich bei der Suche um eine Identifikation, eine Klassifikation oder um eine Ähnlichkeitsbewertung: Im Fall der Identifikation wird das (u.U. mehrfache) Vorhandensein der Anfrage in der Datenbank überprüft, während die Klassifikation 5 2. Audiomonitoring die Anfrage anhand eines Ähnlichkeitsmaßes in eine bestimmte Klasse einstuft. Dies kann auch ohne Verwendung einer Datenbank geschehen. Möglich ist auch die Verwendung einer Ähnlichkeitsbewertung, wie z.B. eines Rankingverfahrens. In diesem Fall werden den Trefferkandidaten quantitative Bewertungen zugeordnet, die sich aus ihrer Ähnlichkeit mit dem gespeicherten Dokumentenbestand ergeben. Aufgrund der vielfältigen möglichen Darstellungen der Signale gibt es eine Vielzahl von Ähnlichkeitsmaßen, die sich meist der Wahrscheinlichkeitstheorie und der Statistik bedienen, um ein Entscheidungsschema bereitzustellen [27]. Die Güte eines Monitoringsystems ergibt sich aus zweierlei Qualitätskriterien für InformationRetrieval-Verfahren [37]: Zum einen durch die technisch gut messbare Effizienz, d.h. den möglichst sparsamen Umgang mit Ressourcen wie Rechenzeit und Speicherplatz, zum anderen durch die Effektivität, d.h. „die Fähigkeit des Systems, den Nutzenden die benötigte Information bei möglichst geringen Kosten an Zeit und Anstrengung anzubieten“ [37]. Genauer untersucht man die Relevanz zwischen Anfrage und Datenbestand, gegeben durch die Größen Precision (Anteil der relevanten Dokumente unter den gefundenen Dokumenten) und Recall (Anteil der relevanten Dokumente, die gefunden wurden). Natürlich muss für eine solche Analyse der zurückgelieferten Treffer die tatsächlich mögliche Treffermenge bekannt sein. Optimal ist eine Treffermenge, wenn beide Größen einen Wert von 1 haben, wenn nämlich genau alle relevanten Dokumente gefunden wurden. Um das im Allgemeinen bestehende Problem des Abwägens zwischen Precision p und Recall r zu lösen, entwickelte Van Rijsbergen [111] ein Einheitsmaß e mit Gewichtung β , ( β 2 + 1) ⋅ p ⋅ r eβ ( p, r ) := . β 2 ⋅ p⋅r In der Praxis kann die Aussagekraft der Relevanz in Abhängigkeit des tatsächlichen Inhaltes der vorliegenden Datenbank aber begrenzt sein. Weitere Herausforderungen des Monitorings ergeben sich vor allem aus folgenden Bereichen: • Mögliche Unstrukturiertheit der Anfrage: Im Falle von „intuitiven“ Eingabemasken muss die Eingabe des Benutzers für die weitere Verarbeitung formalisiert werden. Dies betrifft z.B. Verfahren, bei denen die Ähnlichkeit des Datenbestandes zu einer gepfiffenen Melodie überprüft werden soll. • Verzerrte oder verrauschte Eingangsdaten: Die zu verwendenden Signaldaten können durch Hintergrund- oder Störgeräusche beeinflusst sein oder durch den Einsatz minderwertiger Hardware wie Mikrofone oder Wandler eine geringe Signalgüte aufweisen. • Sehr große und/oder unstrukturierte oder heterogene Datenbanken: Dazu zählen Datenbanken mit variablen Dokumententypen und dezentrale Datenbanken, deren Synchronisierung die Echtzeit-Anforderung erschwert, ebenso wie riesige Dokumente teils komplexer Datentypen (Kombination verschiedener Typen, Objekt-Referenzen, Einbettung von Objekten), sowie die Aktualität der Daten. • Subjektive Semantik: Das subjektives Ähnlichkeitsempfinden des Benutzers kann im Gegensatz zum definierten Ähnlichkeitsmaß des Monitoringsystems stehen. 6 2. Audiomonitoring f(t) Quantisierungsstufe { t T Abbildung 2.2: Digitalisierung eines kontinuierlichen Signals mittels Abtastung und Quantisierung 2.2 Inhaltsbasierte Audioidentifikation Um das Prinzip des Monitorings auch auf akustische Datenströmen anwenden zu können, bedarf es zunächst einiger grundlegenden Definitionen und Begriffe aus den Bereichen Akustik und Digitale Signalverarbeitung. Akustische Geräusche entstehen durch Dichtemodulation in einem elastischen Medium – im vorliegenden Kontext meist der Luft. Als Folge dieser lokalen Verdichtungen entstehen Schallwellen, kontinuierliche mechanische Schwingungen. Treffen Schallwellen auf eine Membran, so wird diese ebenfalls zum Schwingen angeregt. Koppelt man nun eine solche Membran mit einer Drahtspule, so lässt sich per Induktion über ein magnetisches Feld ein kontinuierlicher elektrischer Strom erzeugen, dessen Spannung proportional zur Amplitude der Auslenkung der Membran und somit zur erzeugenden Schallwelle ist. Auf diesem Prinzip beruht die Funktionsweise des Mikrofons. Analoge Signale lassen sich durch den Lebesgueraum L2(R) modellieren [57]. Dieser wird für eine Funktion f : R | C definiert durch L2(R) := { f : R | C | f messbar und ∫ | f (t ) | 2 dt < ∞ }. R Mittels eines Analog/Digital (A/D)-Wandlers lässt sich dieses analoge Signal in zwei Schritten digitalisieren, wie in Abbildung 2.2 illustriert ist. Dazu wird das Signal x zunächst in vorab festgelegten, diskreten Zeitabständen T abgetastet, indem diskrete Werte aus den Amplituden des Signalstroms extrahiert werden: xT (n) = x(Tn) , n ∈ Z. Die Anzahl 1/T der Abtastwerte (engl. Samples) je Sekunde wird als Abtastfrequenz oder -rate (engl. sampling rate) bezeichnet. Bei einer solchen Wandlung stellt sich natürlich die Frage des Informationsverlustes. Dazu wird der Begriff der Bandbegrenztheit benötigt: Ein Signal f ∈ L2 (R) heißt bandbegrenzt, falls eine 7 2. Audiomonitoring Frequenz f max existiert, so dass das Spektrum fˆ von f für alle Frequenzen außerhalb des Frequenzbandes [− f , f ] verschwindet, d.h. fˆ = 0 für alle Frequenzen | f |> f . max max max Das Abtasttheorem von Shannon [94] besagt, dass ein bandbegrenztes Signal durch eine diskrete Menge von Abtastpunkten fehlerfrei reproduziert werden kann, wenn dieses mit einer Frequenz f A = 1/T abgetastet wird, die größer als doppelt so hoch ist, wie die höchste im abzutastenden Signal auftretende Frequenz f max , also fA > f max . 2 Dabei wird fA/ 2 auch als Nyquist-Frequenz bezeichnet. In dem der Abtastung nachfolgenden Prozess findet eine Quantisierung der Signalwerte auf Integerwerte eines fixen Wertebereiches statt, üblicherweise angegeben in Bits: Die Folge der Signalwerte wird entsprechend einem linearen oder nichtlinearen Schema auf Quantisierungswerte abgebildet. Die Anzahl der Abstufungen definiert somit die Qualität der Repräsentation: Gibt es zu wenige Abstufungen, so werden verschiedene Amplitudenwerte der selben Qualitätsstufe zugeordnet, was zu Quantisierungsrauschen führt. Telefonübertragung z.B. verwendet üblicherweise einen Wertebereich von 8 Bit, CD-Qualität dagegen 16 Bit, womit es 65536 Quantisierungsabstufungen gibt. Man unterscheidet hier zwischen linearer, also gleichverteilter, und nichtlinearer Quantisierung. Die am weitesten verbreitete Codierung digitaler Audiodaten ist PCM (engl. pulse code modulation). Ein bandbegrenztes Audiosignal kann also anhand seiner Abtastwerte verlustfrei rekonstruiert werden, wenn die Abtastrate nur entsprechend hoch genug gewählt wird. Um eine solche Bandbegrenzung zu erreichen, wird das Signal vor der Wandlung üblicherweise durch einen Bandpass-Filter auf den für die geplante Abtastrate passenden Frequenzbereich begrenzt. Oft wird dieser durch den für das menschliche Ohr wahrnehmbaren Frequenzbereich von ca. 16Hz – 20 kHz [55] beeinflusst. Bei einer Audio-CD z.B. werden vor der Abtastung Frequenzen oberhalb von 22,05 kHz herausgefiltert und die Daten anschließend mit 44,1 kHz abgetastet. Wird ein Signal mit einer Abtastrate diskretisiert, die geringer oder höchstens gleich dem Doppelten der höchsten im Signal enthalten Frequenz ist, so spricht man von Undersampling. In diesem Fall ist ein Informationsverlust unvermeidbar. Hinzu kommen neue, störende Klangbestandteile – Aliasing genannt. Oversampling hingegen führt auf der anderen Seite theoretisch nicht zu einem Mehr an Informationen, wird jedoch trotzdem gelegentlich verwendet, um z.B. Qualitätsverluste durch minderwertige Wandlerelemente auszugleichen. Wir betrachten im Folgenden nur digitale Signale. Diese lassen sich allgemein durch den diskreten Lebesgue-Raums l 2 geeignet modellieren [57]: Für I ⊆ Z sei l 2 ( I ) := { x : I a C | ∑ | x(i ) | 2 < ∞ }. i∈I Die Aufgabe der Audioidentifikation ist es, zu einem möglichst kurzen, in der Praxis wenige Sekunden langen Audiofragment (etwa q ∈ l 2 (Z) mit endlichem Träger) festzustellen, ob es Teil eines in einer Datenbank D vermerkten Audiodokumentes ist. Diese Datenbank enthält dabei Repräsentationen von Audiosignalen zusammen mit entsprechenden Metadaten wie Titel oder Copyright-Informationen. Da im nicht-trivialen Fall zu dem zu identifizierenden Audiosignal keinerlei beschreibende Metadaten mitgeliefert werden, besteht die Herausforderung darin, von den implizit enthaltenen Informationen auf die Identität des Audiofragmentes zu schließen. Daher spricht man auch von „inhaltsbasierter Audioidentifikation“ (engl. content-based identification, CBID). Falls die Identifikation erfolgreich ist, können aussagekräftige Metadaten zurückgeliefert werden. 8 2. Audiomonitoring Ein in der Praxis auftretendes Problem sind Filter bzw. Signalverzerrungen vielfältiger Art, denen Anfragesignale unterliegen: • Rauschen: Dieses resultiert z.B. aus analoger Übertragung und Änderungen des Signalzu-Rauschen-Verhältnisses (engl. SNR, signal-to-noise ratio). • Spektrale Veränderungen: Oft werden beispielsweise im Radio- und Fernsehbereich Equalizer-Effekte eingesetzt, die bestimmte Frequenzbereiche anheben oder absenken, um auch trotz des verschiedenen Grundklangs abgespielter CDs einen Sender-eigenen Markenklang beizubehalten oder diesen an gängige Lautsprechersysteme anzupassen. • Änderungen des Dynamikverhaltens: Eine gängige Methode, um z.B. als Radiosender in der Vielfalt moderner Beschallung aufzufallen, ist die Verwendung von KompressorEffekten. Dabei werden in Abhängigkeit von Schwellwerten Teile des Audiosignals kurzzeitig so verstärkt oder abgeschwächt, dass auf Grund des reduzierten Dynamikumfangs eine höhere Lautstärke erreicht werden kann. • Skalierung: Eine weitere Methode, um Aufmerksamkeit zu erreichen, ist das Abspielen von Musikstücken mit leicht erhöhter Geschwindigkeit. Weiterhin kann der Effekt auch der wahrgenommenen Geschlossenheit eines Radioprogramms dienen. Dieses Prinzip ist darüber hinaus auch die Grundlage moderner Club-Tanzmusik, wo es intensiv eingesetzt wird, um den Übergang mehrerer Musikstücke ineinander trotz verschiedener Grundgeschwindigkeiten zu ermöglichen. Die Skalierung, auch Pitching genannt, führt zu Änderungen der Tonhöhe – im Extremfall zum sogenannten Mickey-Mouse-Effekt. • Translationseffekte: Laufzeitechos oder -Verzögerungen (Halleffekte) verändern ein Audiosignal maßgeblich durch Einstreuen akustischer Reflektionen. • Andere Verzerrungen: Diese können z.B. als Folge von De-/Kodierungseinflüssen wie der MP3-Kodierung oder durch Watermarking-Mechanismen entstehen. Weitere Ursachen sind physikalisch begründet, wie das Zusammenspiel von Lautsprecher, Übertragungseigenschaften des akustischen Kanals (der Luft) und Mikrofon (engl. „loudspeaker-microphone transmission“, Ls-Mic). Auch unter solchen Einflüssen muss das Verfahren einen hohen Grad an Stabilität aufweisen, d.h. eine möglichst hohe Deformationstoleranz besitzen. Da die genannten Signalveränderungen bei digitalen Signalen zu Bitänderungen auf Ebene einzelner Samples führen, macht ein samplegenauer Brute-Force-Vergleichsmechanismus von Anfrage- und Datenbankdokument keinen Sinn. Hinzu kommt die Größe von Audiodokumenten, die in erster Linie durch die auf menschliches Hörempfinden hin gewählten hohen Abtastraten entstehen: Bei CD-Qualität beispielsweise beträgt die aus der Multiplikation von Abtastrate, Werte-Auflösung in Bit und Kanalanzahl entstehende Größe ca. 172 kb/s, d.h. ein einziges Musikdokument mit einer Länge von drei Minuten hat eine Audiodatengröße von rund 30MB. Vergleiche in solchen Dimensionen sprengen aktuelle Rechenleistungsgrenzen bei Weitem, vor allem im Hinblick auf die Kapazität von Audio-Datenbanken, die aktuell bis zu 106 Dokumente enthalten. 9 2. Audiomonitoring f(t) t überlappende Fensterung Merkmalsextraktion je Fenster f1 f2 f3 ... Folge von Merkmalsvektoren Abbildung 2.3: Prinzip der Merkmalsextraktion 2.3 Der Audiofingerabdruck Um trotz dieser Herausforderungen eine nahezu echtzeitfähige Erkennung zu erreichen, arbeiten die gängigen Audioidentifikationsverfahren nicht auf den eigentlichen Audiodaten, sondern auf daraus extrahierten Audiomerkmalen (engl. audio features). Für ein Signal x ∈ l 2 (Z) ⊂ Z × R liefert ein Merkmalsextraktor F eine per Transformation erzeugt Merkmalsmenge F [x] ⊂ Z × X , wobei X eine im Allgemeinen endliche Menge von Merkmalsklassen ist. Ein einfaches Beispiel für X := {0,1} stellt folgender Merkmalsextraktors dar: F[x](t) = falls x ein lokales Maximum an Stelle t besitzt { 1,0 sonst Üblicherweise sind vor allem endliche Signale x : [a, b] → R, a ≤ b , a und b ganzzahlig, von Interesse. Die Merkmalssignale folgen dann einer Abbildung I → X , wobei I ⊂ Z eine endliche Teilmenge ist, welche die Positionen der Merkmale angibt [57]. Dazu wird meist eine sogenannte Fensterfunktion verwendet, die dem Merkmalsextraktor einen transformierten Fenster-Ausschnitt des Signals liefert. Der Extraktor berechnet zu diesem Fenster ein repräsentatives Merkmal, oft dargestellt durch einen Vektor fi. Anschließend wird das Fenster schrittweise um eine fixe Einheit verschoben. Auf Fensterfunktionen wird in Abschnitt 2.4.1b genauer eingegangen. Aufgrund der Regelmäßigkeit der verwendeten Fenster spricht man in diesem Fall von äquidistanten Merkmalen. Im nicht-äquidistanten Fall werden Merkmale dagegen ereignisbasiert, also ohne festes Zeitraster erzeugt. Der Prozess der Merkmalsextraktion ist in Abbildung 2.3 skizziert. 10 2. Audiomonitoring Der so erzeugt Audiofingerabdruck [21] (engl. audio fingerprint) ist eine Folge solcher Merkmalsvektoren und stellt somit eine kompakte Repräsentation relevanter Teile des ursprünglichen Audiosignals dar [32]. Der Audiofingerabdruck kann für einen schnellen und ressourcenschonenden Vergleich mit in einer Datenbank gespeicherten Audiofingerabdrücken unter Einbeziehung eines Distanzmaßes verwendet werden. Der Merkmalsextraktor F sollte dabei robust gegenüber Transformationen sein, die das Signal in einem gewissen Rahmen verändern, ohne es vollkommen zu verfremden. Idealerweise sollte F in der Lage sein, zu dem selben Audiosignal auch nach verschiedenen moderaten Signaltransformationen einen möglichst identischen Fingerabdruck zu generieren. Das Audiofingerabdruck-Prinzips besitzt einige Vorteile: • Formatunabhängigkeit: Der Audiofingerabdruck ist rein inhaltsbasiert und daher unabhängig von Dateiformaten. • Keine Daten außer dem Audiosignal zur Erzeugung nötig: Der Audiofingerabdruck wird durch Verwendung impliziter Semantik im Audiosignal generiert. • Kompakte Speicherung: Im Vergleich zum Audiosignal ist der Platzbedarf geringer. • Zentrale Metadaten: Diese können dadurch effektiver gepflegt und nach Identifikation eines Stückes mit diesem verlinkt werden. • Effektiver Vergleich: Da nur relevante Informationen vorhanden sind, kann ein Vergleich mit anderen Audiofingerabdrücken mit geringem Aufwand durchgeführt werden. Demgegenüber sind folgende Nachteile des Fingerabdruck-Prinzips zu nennen: • Begrenzte semantische Ausdruckskraft: Die automatisch extrahierten Merkmalswerte besitzen eine lediglich geringe Semantik. Man spricht auch von der „semantischen Lücke“ (engl. semantic gap) zur menschlichen Inhaltsbeschreibung. • Mögliche Ähnlichkeit: Die Abstraktion kann dazu führen, dass aus verschiedenen Audiosignalen identische Merkmale erzeugt werden. Dies kann zu falschen Identifikationen (engl. False Positives) führen. Ein der Merkmalsextraktion verwandtes Konzept ist die Merkmalsselektion. Diese arbeitet auf dem Raum der Merkmale und reduziert dessen Dimensionalität durch Ausschluss von Merkmalsinformationen, etwa durch Analyse der Merkmale bezüglich der intrinsischen Dimensionalität der Merkmale. Dieser Ausdruck beschreibt die Eigenschaft, dass bestimmte ddimensionale Datenmengen adäquat in einem m-dimensionalen Subraum mit Dimensionalität m<d dargestellt werden können [52], z.B. Datenvektoren im R3, die auf einer Linie liegen und somit im R1 dargestellt werden können. Da jedoch eine exakte Unterteilung eines Prozesses in Extraktion und Selektion oftmals nicht möglich ist, werden nachfolgend beide Begriffe als Extraktion zusammengefasst. 11 2. Audiomonitoring 2.4 Ein generisches Audioidentifikationssystem Ein auf Audiofingerabdrücken arbeitendes Identifikationssystem besitzt im Allgemeinen zwei wesentliche Komponenten: Den Merkmalsextraktor und den Vergleichsmechanismus mit einer Audiodatenbank. Für den Entwurf eines Merkmalsextraktor ergeben sich bestimmte Herausforderungen: • Einfache Berechenbarkeit der Merkmalsfolgen: Um eine effektive Verarbeitung zu ermöglichen, sollte das Erzeugen der Merkmalsfolgen in Echtzeit möglich sein. • Reduktion der möglicherweise hohen Dimensionalität des Vektorraums der erzeugten Merkmalsfolge: Je nach Wahl des Merkmalsextraktors kann die Dimensionalität durch nachfolgende Transformationen weiter reduziert werden, um eine stärkere Kompaktheit des Fingerabdrucks zu erreichen. Hier findet ein Trade-Off zwischen einer Reduktion der Dimensionalität und dem damit verbundenen Informationsverlust statt. • Nötige Varianz eines Fingerabdrucks zu anderen Fingerabdrücken: Perzeptuell ähnliche Audiosignale müssen gut genug unterscheidbar sein, verschiedene Repräsentationen des selben Signals müssen jedoch übereinstimmen. Dies muss insbesondere auch dann möglich sein, wenn mit großen Mengen von Audiofingerabdrücken gearbeitet wird. • Robustheit: Der Merkmalsextraktor muss gegenüber den oben genannten Signalstörungen in möglichst hohem Maße robust sein. Ebenso sollten Signalparameter wie Lautheit oder Abspielgeschwindigkeit keinen Einfluss auf die erzeugte Merkmalsfolge besitzen. • Dichtheit der erzeugten Merkmalsfolge: Regelmäßige, innerhalb eines zu definierenden Toleranzbereiches nah beieinander liegende Merkmalsvektoren sind über die gesamte Signaldauer zu garantieren, um eine möglichst gleich gute Verwendbarkeit des Fingerabdrucks zu jedem Zeitpunkt zu gewährleisten. Auch der Vergleichsmechanismus unterliegt verschiedenen Anforderungen: • Effektive Berechnung der Distanz zweier Merkmale: Das für den Vergleich von Audiofingerabdrücken im Raum der Merkmale eingesetzte Distanzmaß muss ebenso schnell und korrekt arbeiten – d.h. keine Treffer auslassen und eine geringe False Rejection Rate (FRR) besitzen – wie speichereffizient und leicht pflegbar sein [11]. • Effizientes Suchen: Dies kann z.B. durch Verwenden von Indizes erreicht werden, die eine Reduktion der Dimension der Merkmale ermöglichen. Dadurch kann dem „Curse Of Dimensionality“ [16] – dem mit steigender Dimensionalität exponentiell steigenden Rechenaufwand – entgegengewirkt werden. Eine entscheidende Rolle in Anbetracht stetig steigender Datenbestände spielt die Skalierbarkeit des zugrunde liegenden Datenbanksystems. • Kompakte Identifikation: Die Erkennung eines Audiostückes sollte anhand eines nur wenige Sekunden langen Signalstückes möglich sein. 12 2. Audiomonitoring Vergleichsmodul Fingerabdrucks-Extraktion Audiosignal Front-End FingerabdrucksModellierung Suche & Distanzmessung Hypothesentest Audio-Metadaten Datenbank Fingerabdruecke & Metadaten Abbildung 2.4: Struktureller Aufbau eines Audioidentifikationssystem Audioidentifikationssysteme unterscheiden sich im Wesentlichen durch die Art, Verwendung und Speicherung von Merkmalen, die Wahl eines Ähnlichkeitsmaßes und die Handhabung des Vergleiches von Anfrage und Datenbank [13]. Die wissenschaftlichen Hintergründe aktueller Systeme umfassen neben an Mustererkennung und dem klassischen Multimedia-Retrieval angelehnte Verfahren auch Ansätze aus Sprachverarbeitung [22], Kryptographie [45] und Bioinformatik [22]. Nichtsdestotrotz weisen alle bislang vorgestellten Methoden strukturelle Gemeinsamkeiten auf. In Anlehnung an Cano et al. [21] wird ein Audioidentifikationssystem in zwei Module aufgegliedert, wie in Abbildung 2.4 dargestellt ist: 1) ein Modul zur Fingerabdrucksextraktion, Fingerabdrucksmodellierer bestehend aus Front-End und 2) ein Vergleichsmodul mit Submodulen Datenbanksuche, Distanzmessung und Hypothesentest Die einzelnen Module werden nachfolgend erläutert, wobei nach Möglichkeit auf die in gängigen Audioidentifikationssystemen verwendete Realisierung von Teilmodulen eingegangen wird. Audiosignal Vorverarbeitung Fensterfunktion Transformation Front-End Merkmalsextraktion Nachbearbeitung Audiofingerabdruck Abbildung 2.5: Audiofingerabdrucks-Extraktion 13 2. Audiomonitoring 2.4.1 Front-End In diesem seriellen fünfstufigen Teilsystem, illustriert in Abbildung 2.5, wird das zu identifizierende Audiosignal in eine Sequenz von Merkmalen konvertiert, welche dem Modelliermodul als Eingabe dienen. Hauptaufgaben sind neben der Reduzierung der Dimensionalität das Extrahieren perzeptuell relevanter Daten und die Gewährleistung der Robustheit. a) Vorverarbeitung Das eingehende Audiosignal wird für die weitere Bearbeitung in ein vorab gewähltes, einheitliches Format konvertiert. Die dazu durchgeführten Transformationen umfassen unter anderem: • Analog-/Digitalwandlung, kurz A/D-Wandlung • Umrechnung mehrkanaliger Datenströme, z.B. stereo nach mono • Anpassung/Umrechnung der Abtastrate (engl. resampling): Es wird unterschieden zwischen Up- und Downsampling, je nachdem, ob die Abtastrate erhöht oder verringert wird. Beides wird durchgeführt mittels verschiedener Interpolationsalgorithmen wie z.B. linearer und bandbegrenzter Interpolation und Filterung [96]. • Vorverstärkung • Normalisierung, d.h. anteiliges Skalieren des Wertebereichs des Signals auf den möglichen digitalen Wertebereich • Bandpassfilterung: Ausschließen von Frequenzbereichen, z.B. als Vorverarbeitung für eine A/D-Wandlung • Dekodieren/Kodieren, z.B. Umwandeln in das MP3-Format. b) Fensterfunktion Die Verwendung einer Fensterfunktion erlaubt eine blockweise Bearbeitung des Eingangssignals, wobei sich die entstehenden Frames üblicherweise zu einem gewissen Grad überlappen, um Informationsverlust an den Blockenden zu verhindern. Die Fensterfunktion selbst strebt an den Blockenden gegen 0 und ist achsensymmetrisch. Auf diese Weise werden auch Diskontinuitäten vermieden. Grund für den Einsatz einer Fensterfunktion ist die für nachfolgende Raum-Frequenzraum-Transformationen zeitliche Eingrenzung des Signals. Um zu einen Zeitpunkt t aus einem Signal x(r) einen Frame x'(r) zu erhalten, werden das Signal und die Fensterfunktion punktweise miteinander multipliziert: x't (r ) := x(r ) ⋅ w(r − t ) . Es sei angemerkt, dass t je nach Anwendung den Start- (linke Kante des Fensters) oder Mittelpunkt der Fensterposition bezeichnet. Die Länge des Fensters spielt darüber hinaus eine wichtige Rolle: Ein zu kleines Fenster erlaubt keine relevanten Aussagen über tieffre14 2. Audiomonitoring 2.6a: Die generalisierte Kosinusfuntkion (links), Abb. 2.6b: Die Kaiserfunktion mit verschiedenen a-Werten (rechts) quente Signaländerungen, während sich mit steigender Länge des Fensters auch die Länge des damit korrespondierenden Signalausschnitts und damit die Wahrscheinlichkeit erhöht, dass sich im Signalausschnitt wesentliche spektrale Veränderungen befinden. Dies führt dazu , dass die Spektralanalyse keine gute Auflösung für hohe Frequenzen besitzt. Im Folgenden sind gängige Fensterfunktionstypen aufgeführt [81]. Jede Funktion liefert einen Frame W der Länge n. Durch verschiedene Parameterwerte entstehen Variationen der jeweiligen Fensterfunktion, die teilweise sogar eigene Bezeichnungen besitzen. Im Folgenden gilt für die Fensterfunktion w stets w(k) = 0 für k<0 oder k>n. i. Rechteck / Boxcar Diese Funktion liefert ein rechteckiges Fenster zurück und ist nur der Vollständigkeit halber aufgeführt. Das Verwenden der Boxcar-Funktion entspricht dem Arbeiten ohne Fensterfunktion. Es gilt w(k ) = 1 , falls k ∈ {0,..., n − 1}. ii. Generalisierte Kosinus-Fensterfunktion / Hamming / Hann / Blackman Hierbei handelt es sich um eine populäre Familie von Fensterfunktionen, die einer gemeinsamen Form folgen und in Abbildung 2.6a dargestellt und wie folgt für k ∈ {0,..n} definiert sind: k w(k + 1) = a 0 − a1 ⋅ cos ( 2π ) + a2 cos ( 4π k ) − a3 cos ( 6π k ) n −1 n −1 n −1 Die jeweiligen Parameter ai sind dabei der Tabelle 2.6c zu entnehmen. Funktionstyp Hamming Hann Blackman Blackman-Harris a0 0,54 0,5 0,42 0,35875 a1 1- a0 1- a0 -0.5 0,48829 a2 0 0 0,08 0,14128 a3 0 0 0 0,01168 Tabelle 2.6c 15 2. Audiomonitoring iii. Kaiser Die Form dieser Funktion kann durch verschiedene Werte des reellwertigen Parameters a verändert werden: Je größer die Werte von |a|, desto enger wird das Fenster. Ein Wert von 0 korrespondiert mit der Rechtecksfunktion, wohingegen sich das Fenster für steigende |a| immer mehr an eine Gausskurve annähert. Dazwischen werden die Formen verschiedener Fensterfunktionen approximiert, z.B. Blackman durch den Wert a = 8,885. Diese Funktion ist in Abbildung 2.6b dargestellt. 2k 2 I 0 (π ⋅ a 1 − ( ) ) n −1 w(k ) = I 0 (π ⋅ a ) Dabei ist I0 die modifizierte Besselfunktion 0-ter Ordnung. Neben weiteren Fenstertypen wie Chebyshev, Bartlett und der verwandten Dreiecksfunktion gibt es natürlich auf spezielle Zwecke zugeschnittene Fensterfunktionen, wie z.B. die nachfolgend aufgeführten, die in verschiedenen AudioCodecs Anwendung finden [116]: iv. MP3 / MPEG-2 AAC 1 π w(k ) = sin [ (k + ) ] 2n 2 v. Ogg-Vorbis w(k ) = sin [ π 2 sin 2 ( π 1 (k + ) )] 2n 2 c) Transformation In dieser Verarbeitungsstufe wird die Dimensionalität des Signals verringert. Ziel ist die Reduzierung der Redundanz durch vergrößerte Abstrahierung in Form von Kompaktheit, d.h. Reduzierung der Dimension ohne Verlust an intrinsischer Information. Üblicherweise werden hierzu lineare Transformationen verwendet. Gegeben sei eine n × d -dimensionale Matrix X aus n d-dimensionalen Datenvektoren. Die lineare Transformation von X in eine n × m -Zielmatrix Y, wobei hier m<d, ist allgemein definiert als Y = HX , wobei H die d × m -Matrix der linearen Transformation ist. Zwar existieren optimale lineare Transformationen, wie z.B. die Hauptkomponentenanalyse (engl. principal component analysis, PCA), die jedoch oft sehr rechenintensiv sind. Obwohl Fortschritte in Algorithmik und Hardware immer komplexere Berechnungen erlauben, werden meist jedoch weniger komplexe Transformationen, vor allem Spektraltransformationen (Transformationen aus dem Zeit- in den Frequenzraum), verwendet. Mit Hilfe dieser Transformationen wird zum einen Rauschen entfernt und zum anderen eine komprimierte Datenrepräsentation erreicht. Weiterhin beruhen in den meisten Fällen die nachfolgenden Verarbeitungsstufen auf bestimmten Eigenschaften der Transformation. Auch in diesem Fall geht ein Gewinn an Dimensionsreduktion je nach Güte der Transformation einher mit einem Verlust an Information. 16 2. Audiomonitoring Abbildung 2.7: Wellenform und Spektrogramm einer Sirene, visualisiert mit Cooledit Pro. Die gebräuchlichste Spektraltransformation ist die Fourierentwicklung: Periodische Signale x(r) mit einer Periodendauer T0 lassen sich in eine Superposition von Sinus- und Kosinusfunktionen mit Grundfrequenz f0 =1/T0 entwickeln: ∞ x(r ) = a 0 + ∑ a n ⋅ cos(n ⋅ w0 ⋅ r ) + bn ⋅ sin( n ⋅ w0 ⋅ r ) . n =1 2π . In dieser Fourierreihe sind a n , bn als n-te Fourierkoeffizienten das T0 Maß für die Anteile, mit denen die einzelnen Sinus- und Kosinusfunktionen zum Gesamtsignal x(r) beitragen. Zur Berechnung der Fourierentwicklung wird für (diskrete) endliche Signale der Länge m üblicherweise die sogenannte schnelle Foutiertransformation (engl. Fast Fourier Transform, FFT) verwendet, die in Rechenzeit O (m log m) berechnet werden kann. Da das fouriertransformierte Signal keine zeitliche Informationen enthält, wurde die gefensterte (diskrete) schnelle Fouriertransformation (engl. Short Time Fourier Transformation, STFT, manchmal auch Windowed Fourier Transformation, WFT) entwickelt, die für Fensterfunktionen mit Träger berechnet werden kann. Die STFT transformiert ein gefenstertes Signal x(r) der Fensterlänge N in Rechenzeit O ( N log N ) und ermöglicht auf diese Weise die zeitliche Zuordnung spektraler Informationen. Dabei ist w0 = Das Betragsquadrat der STFT wird als diskretes Spektrogramm von x bezeichnet: N −1 Spec x (t , f ) :=| STFTx (t , f ) | 2 =| ∑ x(n − t ) ⋅ w(n) ⋅ e −⋅2π ⋅i ⋅ ft N |2 n =0 Das Spektrogramm beschreibt also die Faltung von x und der Impulsantwort w eines Filters zur angegebenen Frequenz f . Somit stellt es eine Zusammenführung der Frequenzmessungen einer Reihe einzelner Filter dar, deren Frequenzbänder um ein Vielfaches k der Grundfrequenz f o zentriert sind: f k = k ⋅ f 0 , wobei k die Centerfrequenz des k-ten Frequenzbandes ist. Eine beispielhaftes Spektrogramms ist in Abbildung 2.7 dargestellt. 17 2. Audiomonitoring Die positiv definierte Funktion Spect x (t , f ) kann auch probalistisch als unnormalisierte Wahrscheinlichkeitsdichtefunktion (WDF) über die Frequenz f interpretiert werden, nämlich als Wahrscheinlichkeit, dass eine Frequenz in einem Frame vorkommt. Zwar ist die Frequenz keine Zufallsvariable, jedoch erlaubt die Einführung dieser Interpretation in nachfolgenden Verarbeitungsstufen die Anwendung von Konzepten aus der Wahrscheinlichkeitstheorie. Die Hauptkomponentenanalyse (PCA [83], auch als Karhunen-Loeve-Transformation (KL) bekannt) ist wie oben erwähnt relativ aufwendig zu berechnen. Es existieren allerdings praxistaugliche Approximationen und Varianten. PCA ist eine lineare Projektionstechnik und ermöglicht durch eine lineare Transformation M : Rd l Rk die Repräsentation von ddimensionalen Daten durch eine niedriger dimensionierte Datenmenge mit Dimensionalität k, k < d. Erreicht wird dies durch sukzessive Bestimmung von „Koordinatenachsen“ in der Richtung der größten Varianz der Datenmenge. Richtungen verschwindender Varianz werden vernachlässigt, wodurch eine kompaktere Darstellung der Datenvektoren in reduzierter Dimension erreicht wird. Die PCA ist optimal im Sinne des mittleren quadratischen Fehlers: Gegeben eine Menge von Vektoren xi ∈ Rd, i ∈ {1..N } minimiert die PCA M den entstehenden quadratischen Fehler N e = ∑ ( xi − M T Mxi ) T ( xi − M T Mxi ) . i =1 Die PCA weist noch weitere interessante Eigenschaften auf, auf die hier aber nicht weiter eingegangen werden soll. Interessierte Leser seien an Bishop et al. [17] verwiesen. Durch die PCA lässt sich somit die Dimensionalität ohne großen Verlust an signifikanten Daten reduzieren. Das Maß an Reduktion hängt davon ab, wie die in den Originaldaten enthaltenen Informationen verteilt sind. Eine effizientere Variante, die „orientierte Hauptkomponentenanalyse“ (OPCA) wurde in [20] erfolgreich für die Extraktion rauschrobuster Audio-Merkmale angewandt. Die diskrete Kosinus-Transformation (engl. discrete cosine transformation, DCT) stellt eine der diskreten Fouriertransformation ähnliche Transformationsfamilie aus mehreren Varianten dar, arbeitet allerdings im Gegensatz zu dieser mit reellen Daten. Verwandt sind weiterhin die Diskrete Sinus-Transformation und die modulierte DCT, welche auf überlappenden Datenblöcken arbeitet. Die DCT besitzt eine Frequenzkompaktheit genannte Eigenschaft, die sich darin äußert, dass ein Großteil der Signalinformation in wenigen Komponenten der DCT konzentriert wird [116]. Unter bestimmten Bedingungen approximiert die DCT daher die PCA. Inspiriert von der erfolgreichen Anwendung der DCT in der Arbeit mit Sprachdaten fanden Logan et al. [63] heraus, dass sie auch für die Arbeit auf Audiodaten gut geeignet ist. Die DCT kann wie die FFT in Zeit O(n log n) berechnet werden. Darüber hinaus existieren noch weitere lineare Transformation wie die HaarTransformation oder Wavelets, auf die hier aber nicht weiter eingegangen werden soll. In manchen Systemen werden nach der folgenden Merkmals-Extraktion noch weitere lineare Transformationen durchgeführt, um die Dimensionalität weiter zu reduzieren oder um eine Glättung der Vektordaten zu erreichen (z.B. DCT bei der Verwendung von MFCCs, die im nachfolgenden Abschnitt erläutert werden [63]). 18 2. Audiomonitoring d) Merkmalsextraktion In diesem Teilschritt des Front-Ends wird aus dem vorverarbeiteten und transformierten Eingangssignal mittels eines Merkmalsextraktors eine Folge von Merkmalen erzeugt. Die dazu verwendeten Ansätze unterscheidet man in parametrische und nicht-parametrische Methoden: Im parametrischen Fall folgen alle Signale einem mathematischen statistischen Modell und unterscheiden sich lediglich in den Modellparametern. Ein solches Modell könnte beispielsweise aus mehrdimensionalen Gauß-Verteilungen von Merkmalen bestehen und die Parameter aus den jeweiligen Mittelpunkten und Varianzen. Da ein solches Modell in der Praxis jedoch wegen der großen Signalvielfalt kaum findbar und falls doch, die Modellparameter nur sehr aufwendig bestimmbar sind, verwendet man üblicherweise nicht-parametrische Methoden [27]. Die Menge der Audiomerkmale lässt sich weiterhin in semantische und nicht-semantische Merkmale unterteilen. Andere Quellen sprechen auch von wahrnehmbaren respektive physikalischen Merkmalen. Semantische Merkmale bezeichnen auch für Menschen intuitiv erkennbare Bewertungen wie z.B. Genre oder Beats-Per-Minute (BPM). Semantische Merkmale weisen jedoch wesentliche Nachteile auf: • Sie sind oft mehrdeutig, subjektiv und/oder inkonsistent über mehrjährige Betrachtung (z.B. Genre). • Sie sind meist komplexer zu berechnen als nicht-semantische Merkmale. • Sie sind nicht universell anwendbar. Bei bestimmten Musikrichtungen lässt sich beispielsweise die BPM-Zahl nicht bestimmen. Nachfolgend wird daher nur auf nicht-semantische Merkmale eingegangen. Obwohl sich die verschiedenen Fingerabdrucksverfahren in ihrem Hintergrund und der verbundenen Zielsetzung unterscheiden, beruhen viele auf den selben Merkmalsextraktoren, oft basierend auf dem Spektrogramm des Eingangssignals. Dabei ist es durchaus üblich, eine Reihe von Merkmalen zu kombinieren, um die Robustheit gegenüber störenden Einflüssen zu erhöhen. Häufig wird Vorwissen aus der Psychoakustik zu Eigenarten des menschliches Gehörs verwendet, um eine Datenreduktion zu erreichen. Oft wird das in den Frequenzraum transformierte Signal in Bänder aufgeteilt, um z.B. den Eigenheiten des nichtlinearen menschlichen Gehörs Rechnung zu tragen und bestimmte Frequenzanteile stärker im Extraktionsprozess zu gewichten. Neben linearen und logarithmischen Bandanordnungen seien hier vor allem die Bark- und die Mel-Skalierung genannt. Die Bark-Skala besitzt üblicherweise 24 Bänder, entsprechend den ersten 24 kritischen Bändern, in welche die für menschliches Hören zuständige Basilarmembran im Innenohr eingeteilt werden kann [95]. Die Mel-Skala ist linear bis 1 kHz und nachfolgend logarithmisch. Daher stellt ausgehend von 1 kHz, denen ein Wert von 1000 Mel Hz zugeordnet ist, jeder Wert m der Mel-Skala diejenigen Frequenz f dar, die q (m) = m ⋅ Mel mal so hoch wahrgenommen wird [63]. Durch beide Skalen werden Frequenzen in höheren Frequenzbereichen stärker zusammengefasst. Die folgende – keineswegs erschöpfende – Auflistung liefert einen Überblick über wichtige klassische Audiomerkmale [21, 27, 115]. Diese entstammen ursprünglich verschiedenen technischen Anwendungsszenarien, vor allem statistischer und akustischer 19 2. Audiomonitoring Art, wie der Signalverarbeitung von Sprachsignalen bzw. der Diskriminierung von Sprache und Musik. Die Berechnung der einzelnen Merkmale erfolgt im Allgemeinen framebasiert. Spektrale Merkmale: • Lautheit (engl. volume, loudness, short time energy): Beschreibung der Signalamplitude („Energie“) zu einem Zeitpunkt t unter Verwendung einer Fensterfunktion w(r), äquivalent berechenbar sowohl im Spektral- als auch im Zeitbereich: Spect x (t , f )df ∫ | x(r ) w(r − t ) | 2 dr ∫ Vol (t ) := = ∫ w(r )dr ∫ w(r )dr für ∫ w(r )dr ≠ 0 . • Bandenergie: Energiebetrag in einem Frequenzband [f0, f1] zu einem Zeitpunkt t unter Verwendung einer Fensterfunktion w(r): f1 BE[ f 0 , f1 ] (t ) := ∫ Spect x (t , f )df f0 ∫ w(r )dr . Haitsma et al. [45] verwendeten in 33 Frequenzbändern die Vorzeichen der Differenz jeweils zweier benachbarter Bänder, um einen 32 Bit langen Hashwert zu generieren. Verschiedene Signaltypen können aufgrund ihrer spektralen Eigenheiten gezielt charakterisiert werden. Sprachsignale z.B. weisen in mehreren Bereichen des Spektrums deutliche charakteristische Eigenschaften auf. • Bandenergieanteil (engl. band energy ratio): Anteil der Signalenergie eines Frequenzbandes [f0, f1] an der Gesamtenergie in einem Frame t: BE[ f 0 , f1 ] (t ) . BER[ f 0 , f1 ] (t ) := Vol (t ) • Mittelfrequenz (engl. median frequency oder centroid frequency): Amplitudengewichteter Mittelwert des Spektrums in einem Frame t: ∫ f ⋅ Spect x (t, f )df . MedF (t ) := ∫ Spect x (t , f )df Dies kann auch als erstes statistisches Moment der WDF in einem Frame t interpretiert werden – was genau den Mittelwert definiert. 20 2. Audiomonitoring • Bandbreite: Die Varianz (zweites statistisches Moment) des als WDF interpretierten Spektrums eines Frames t ist ein Maß für die im Signal enthaltene Frequenzstreuung. Je größer diese ist, desto höher ist die Bandbreite: [ f − MedF (t )] 2 ⋅ Spect x (t , f )df ∫ . BndW (t ) := ( , ) Spect t f df x ∫ • Cepstrum / Cepstral-Koffizienten: Fouriertransformierte des gefensterten Frequenzspektrums eines Frames t, also gewissermaßen das Spektrum einer Zeitspalte des STFT-Spektrums. Die Bezeichnung Cepstrum selbst ist eine Permutation des Wortes Spectrum. Zur folgenden Berechnung der Cepstral-Koeffizienten Cep(t,r) wird angenommen, dass das Spektrum eines Frames wieder periodisch ist [115]: Cep(t , r ) := 1 2π +π ∫π log | Spect x (t , f ) | ⋅e i⋅2π ⋅ f ⋅r df . − Die Variable r steht dabei für die Frequenz, in der sich Frequenzen im Spektrum periodisch wiederholen. Einheit ist das Wortspiel quefrency, die Frequenz einer Frequenz, also eine Zeiteinheit. Die durch Anwendung kleiner r entstehenden ersten Cepstral-Koeffizienten beschreiben die Ausprägung niederfrequenter Schwingungsanteile im Spektrum, die Koeffizienten höherer r die Ausprägung hochfrequenter Anteile. Auf diese Weise kann die „Glattheit“ des Spektrums gemessen werden. Das Verfahren stammt aus der Sprachverarbeitung, wo es zur Fundamentalfrequenzschätzung eingesetzt wird, um über die ersten CepstrumKoeffizienten Informationen bestimmter Sprachbestandteile (Phonemformanten) zu gewinnen bzw. zu verändern. Die Verwendung des Logarithmus in der Formel hat dort vereinfachende Gründe, darüber hinaus jedoch als positiven Nebeneffekt eine Anpassung an menschliche Hörfähigkeiten: Bei gleicher Amplitude werden niedrigere Frequenzen näherungsweise logarithmisch leiser wahrgenommen als höherfrequente Anteile. Eine Erweiterung des Verfahrens stellt die Mel-Skalierung des Spektrums dar, die vor der Erstellung des Cepstrums durchgeführt wird. Entsprechend heißen die in diesem Zusammenhang verwendeten Koeffizienten MFCCs („Mel-frequency cepstral coefficients“). Diese werden z.B. in [22] unter Einbeziehung der DCT verwendet. • Pitch / Grundfrequenz: Dieses Merkmal bezeichnet die dominierende Frequenz eines Frames. Allerdings ist diese offensichtlich nicht für jeden Frame bzw. jedes Signal definiert. In manchen Signaltypen gibt es Obertöne und Spitzenwerte (engl. peaks), d.h. natürliche Vielfache k ⋅ f 0 einer Grundfrequenz f 0 , die mittels verschiedener Verfahren ermittelt werden können [27]. Falls vorhanden, kann ggf. die Grundfrequenz als Verteilungsmaximum des als WDF betrachteten Spektrogrammes definiert werden. 21 2. Audiomonitoring • Spektrale Glattheit (engl. spectal flatness measure, SFM): Dieses Maß stellt eine Charakterisierung zur Unterscheidung von tonalen und rauschartigen Signalen dar. Tonal bezieht sich hier nicht auf den entsprechenden Begriff aus der Musiktheorie, sondern auf das Vorhandensein dominanter sinusartiger Komponenten im Signalspektrum [50]. SFM findet Verwendung im AudioID-System [2] und ist in Form des Low-Level-Deskriptors AudioSpectrumFlatness in den MPEG-7-Standard [70] eingeflossen. • Spectral Flux (auch Delta Spectrum Magnitude): Dieses Maß charakterisiert framebasierte spektrale Veränderung. Sprachdaten weisen beispielsweise auf Grund der schnellen Abfolge verschiedener Buchstaben sowohl größere als auch variablere Unterschiede auf als Musik. Der Spectral Flux Ft eines gefensterten Signals der Länge N ist definiert als N Ft = ∑ ( Spect (t , f n ) − Spect (t − 1, f n )) 2 . n =1 • Spektrale Roll-Off-Frequenz: Dieser Wert misst die Frequenz Rt, unterhalb der sich im Spektrum 95% der Energie befindet und ist somit ein weiteres Maß für spektrale Form. Sie ist definiert durch Rt N n =1 n =1 ∑ Spect (t , f n ) = 0.95 ⋅∑ Spect(t , f n ) . Musik weist höhere Energieanteile in hohen Frequenzen auf und besitzt daher eine höhere Rolloff-Frequenz als Sprache. • 4-Hz Modulationsenergie: Sprache besitzt eine charakteristische Energiemodulationsspitze im Bereich der 4Hz Silbenrate. Um dies zu quantisieren, wird das Signal zur Analyse unter Verwendung des MFCC-Algorithmus’ in perzeptuelle Frequenzkanäle konvertiert, mittels eines auf 4Hz zentrierten Filters zweiter Ordnung Bandpass-gefiltert und anschließend zur Erhebung der Lautheit verwendet. Der Maßwert ergibt sich aus der Summe aller normalisierten Kanäle [93]. Zeitbasierte Merkmale: • Nulldurchgangsrate (engl. „zero-crossing rate“): Dieses Audiomerkmal berechnet die Rate der Vorzeichenwechsel der diskreten Abtastwerte eines Frames: 1 N +1 ZCR (t ) := ∑ | sign( x't [n + 1]) − sign( x't [n]) | N + 1 n =1 Dabei ist x'[n] der Wert des n-ten Samples. Angenommen wird außerdem, dass x’ annähernd mittelwertfrei ist. Hohe ZCR-Werte deuten auf hohe Frequenzen hin. 22 2. Audiomonitoring • Anteil an Low-Energy-Frames: Dieses Merkmal beruht auf dem RMS-Wert (engl. root mean square) des Signals, einem in der Audiosignalverarbeitung üblichen Maß der Amplitude, berechnet durch die Wurzel des quadrierten Signal-Mittelwertes RMS (t ) := ( 1 N N ∑ x ( n )) n =1 t 2 . Zur Berechnung des Merkmalswertes wird zunächst der Mittelwert aller Frames der letzten Sekunde berechnet. Danach wird für jeden dieser Frames überprüft, ob sein RMS-Wert weniger als 50% des RMS-Durchschnitts beträgt. Zurückgeliefert wird der prozentuale Anteil dieser Low-Energy-Frames an der Gesamtzahl der Frames. Durch sprachbedingte leise Frames besitzen Sprachdaten einen üblicherweise höheren Wert dieses Merkmals. Eine Auflistung weiterer Merkmale findet sich im Anhang der AES’04-Veröffentlichung von Cano et al. [23]. Es sei darauf hingewiesen, dass aufgrund der Ähnlichkeit mancher Audiomerkmale Redundanzen entstehen können. Weiterhin spielen die Form der Fensterfunktion und die Länge der Frames eine wesentliche Rolle bezüglich der Aussagestärke einzelner Audiomerkmale. e) Nachbearbeitung Hierunter fallen verschiedene Anpassungen der Merkmalsfolge [21]: • Ableitung der ermittelten Merkmale [2] bzw. Erzeugung von Bitfolgen aus aufeinanderfolgenden Merkmalsvektoren [57] • Bildung von Varianz oder Mittelwert der Merkmalsfolge [93] • Algorithmen zur Verbesserung der Kompaktheit der Merkmale • Algorithmen zur Verstärkung der Robustheit • Algorithmen zur Normalisierung • Vorbereitung Teilsysteme • systemspezifische Anpassungen auf Hardware-Anforderungen und andere nachfolgende Die hier vorgestellten Mechanismen des Front-Ends ermöglichen dem im Konzept von Cano et al. [21] nachgeschalteten Fingerabdrucks-Modellierer das Arbeiten auf einer kompakt aufbereiteten Repräsentation der Signaldaten, wie im folgenden Abschnitt beschrieben wird. 23 2. Audiomonitoring 2.4.2 Fingerabdrucks-Modellierer Der Modellierer erhält eine Sequenz von framebasierten Audiomerkmalen und strukturiert diese anhand des zugrunde liegenden Merkmals-Modells. Dieses bildet üblicherweise auch die Basis der nachfolgend verwendeten Module zur Distanz-Metrik und den Indexierungs-Algorithmus. Meist äußert sich diese Strukturierung in der Umwandlung in eine auch aus Gründen der Speicherplatzeffizienz kompakte Form, beispielsweise als Vektor der multidimensionalen Merkmals-Vektorsequenzen eines gesamten Songs [74] oder als Binärsequenz der Audiomerkmale [45]. Globale Redundanz wird in [2] durch Zusammenfasen (engl. Clustering) ähnlicher Merkmale ausgenutzt, wodurch eine Approximation der Vektorsequenz ohne zeitliche Information, ein Codebuch, entsteht. Weiterhin werden hier Statistiken über kurze Zeitintervalle hinweg gesammelt, was sich in sowohl höherer Erkennungsrate als auch schnellerem Abgleichen (durch kürzere Sequenzen) widerspiegelt. Eine ausführliche Darstellung dieser Methode wird in Abschnitt 2.5.1 gegeben. Cano et al. [22] nutzen ein durch Spracherkennung inspiriertes redundanzverringerndes Modell, in dem ähnliche Teilstücke des Audiosignals, wie etwa wiederkehrende perkussive Elemente, als Elemente eines endlichen Alphabets eingestuft werden. Die entstehende Sequenz von Indizes erhält die Information des zeitlichen Audioverlaufes und kann mit geeigneten Mitteln effizient weiterverarbeitet werden. Dieser Ansatz wird in Abschnitt 2.5.3 erläutert. 2.4.3 Distanzmetrik Ziel der Verwendung einer Distanzmetrik ist das quantitative Einordnen der Ähnlichkeit des Eingangssignals in Bezug auf die in einer Datenbank enthaltenen Audiodokumente. Voraussetzung ist ein metrischer Raum. Die Wahl des Distanzmaßes hängt auf Grund der Vielzahl von Möglichkeiten eng zusammen mit dem tatsächlich verwendeten Audiofingerabdrucks-Modell. In Abhängigkeit davon wird, wie z.B. in [45] im Fall quantisierter Vektorsequenzen, das Manhattan-Maß oder im binären Fall die Hamming-Distanz angewandt [57]. Weit verbreitet ist auch das Verwenden einer Korrelation zur Messung des Abstandes zweier Signale. Darüber hinaus gibt es eine Reihe von anderen Metriken, die sich jeweils an den speziellen Eigenschaften des gewählten Merkmalsraums orientieren, wie in Abschnitt 2.5 erläutert. In den Fällen, in denen die zu identifizierenden Signale nicht als Fingerabdruck, sondern als Codebuch [2] vorliegen, wird die aktuelle Merkmals-Sequenz sukzessiv transformiert und mit den einzelnen Codebüchern verglichen, wobei die Fehler je Codebuch akkumuliert werden. Diese gesamte Fehlersumme stellt die Distanz zum Eingabesignal dar. 2.4.4 Suchmethoden Die Effizienz des Vergleiches eines unbekannten Audiofragmentes mit einer sehr großen Anzahl an Fingerabdrücken wird maßgeblich durch die verwendete Suchmethode bestimmt. Diese wiederum hängt von der Organisation der Fingerabdrücke durch einen Suchindex ab, welcher eine Reduzierung der Anzahl nötiger Vergleiche ermöglicht. Um den teilweise riesigen Bestand an Daten zu durchforsten, werden approximative Methoden eingesetzt, die stark problemspezifisch sind. Eine gängige Heuristik ist es, durch Nutzen von Äquivalenzklassen viele Trefferkandidaten schnell auszuschließen und nur wenige vollständig zu durchsuchen [25]. Das vorgeschaltete Verwenden eines simpleren Distanzmaßes kann so zur anfänglichen Reduktion möglicher übereinstimmender Datenbank-Dokumente beitragen. 24 2. Audiomonitoring Cano et al. verwenden Stringvergleichs-Methoden aus der Bioinformatik, ähnlich denen zum DNA-Vergleich [22]. In [57] wird ein Index aus Codewörtern verwendet, die aus den Binärsequenzen extrahiert wurden, welche die Merkmalsfolgen repräsentieren. Da zum einen viele Datenbestände prinzipiell dezentral vorliegen und zum anderen die Hardwareleistungen weiter steigen, stellt sich die Frage der Machbarkeit und Effizienz eines verteilten Audioidentifikationssystems. In Abhängigkeit des Fingerabdruckmodells und der gegebenen Hardware-Infrastruktur ist es möglich, parallel in mehreren verteilten Datenbanken zu suchen. Kurth et al. [57] beschreiben dazu ein auf Partitionierung der gesamten Datenbank-Dokumentenmenge beruhendes System, dessen einzelne Partitionen unabhängig voneinander durchsucht werden können. Beruhend auf verschiedenen Faktoren einzelner Dokumente und dem Umfang der zu erwartenden Treffermengen lassen sich der zu erwartende Kommunikationsaufwand und der zur Synchronisierung nötige Zeitaufwand einschätzen. Auch die Balancierung der Index-Dokumente ist bei größtenteils ähnlich großen Dokumenten möglich. Die tatsächliche Effizienz hängt aber in großem Maße vom Unfang des Datenbestandes ab, so dass eine Trennung von Indexierung und Suche sinnvoll sein kann. 2.4.5 Hypothesen-Test Der Verlauf des Vergleichs von Anfrage und Datenbank führt zu einer Menge von Distanzwerten. Um zu entscheiden, ob die Anfrage als ein Dokument der Datenbank identifiziert werden kann, muss der entsprechende berechnete Distanzwert über einem zu definierenden Schwellenwert liegen. Dieser Wert ist stark abhängig vom Fingerabdrucks-Modell, dem Datenbankbestand und dessen Größe und kann bei einer falschen Festsetzung leicht zu „False Positives“ führen, vom System ausgegebenen Treffern, die keine sind. Zur Vermeidung dieser Probleme stehen verfahrensspezifische Fehlertoleranzmechanismen zur Verfügung. 2.4.6 Datenbank-Pflege Der Vorgang des Einfügens neuer Signal-Dokumente in eine Datenbank folgt grundsätzlich dem Schema, das im Rahmen des Fingerabrucks-Modellierungsvorgangs beschrieben wurde. Zu jedem einzufügenden Signal wird in Abhängigkeit des verwendeten Modells ein Audiofingerabdruck erzeugt und in der Datenbank abgelegt. Damit verknüpft werden zugehörige, evtl. aufzubereitende Metadaten (Typ, Speicherformat, Profildaten, ...), die nach einer Identifikation als Ausgabe zur Verfügung stehen. Falls die zu verwendenden Rohdaten, wie etwa im Falle vieler Audiodateiformate, über eingebettete Strukturdaten verfügen, muss vor dem Extraktionsprozess noch eine Trennung von Audio- und Strukturdaten durchgeführt werden. Ähnliches gilt für komplexe Multimedia-Objekte, die vor der Verarbeitung in einfachere Objekte zerlegt werden müssen. Handelt es sich um besonders lange Signale, kann auch eine Vorsegmentierung nötig sein. Je nach Verfahren kann dieser gesamte Vorgang als Teil der Vorverarbeitungsstufe im Front-End implementiert oder separat vorgeschaltet sein. Nach dem Einfügen werden ggf. vorhandene Optimierungsverfahren wie DokumentenIndexierung oder der Distanzmessung zuarbeitende Vorberechnungen, wie z.B. Einteilung in eine Äquivalenzklasse angewandt, so dass die Datenbank nach Abschluss des Einfügeprozesses wieder auf dem aktuellen Stand ist. Je nach Anforderung muss auch das Löschen und Aktualisieren vorhandener Dokumente möglich sein. Das Konvertieren bestehender Datenbanken ist nur in Ausnahmefällen möglich, da das Format von Datenbankdokumenten meist so stark anwendungspezifisch ist, dass ein Umwandeln des Dokumentenbestandes nicht möglich ist. 25 2. Audiomonitoring 2.5 Aktuelle Audioidentifikationssysteme Im Folgenden sollen fünf Systeme zur Audioidentifikation erläutert werden, die sich neben guten Erkennungsraten und hoher Robustheit vor allem auch durch Effizienz auszeichnen. Die durchgängig guten Erkennungsraten der einzelnen Systeme werden dabei bewusst nicht zitiert, da zum einen ein objektiver Vergleich aufgrund der Unterschiedlichkeit der verwendeten Audiodaten schwierig ist und zum anderen der Fokus auf den jeweils zugrunde liegenden Prinzipien der einzelnen Systeme liegt. 2.5.1 AudioID Dieses am Fraunhofer-Institut entwickelte System [2] unterscheidet sich insofern grundlegend von den anderen hier vorgestellten Systemen, als es, einem klassischen MustererkennungsParadigma folgend, klassifikationsbasiert und in zwei Modi arbeitet. Im Trainingsmodus wird eine Menge von Trainingsaudiosignalen sukzessiv in äquidistanten Abständen anhand von n Frequenzbändern im Spektrum von 300-6000Hz in eine Folge von Merkmalsvektoren im Rn ungewandelt, wobei Allamanche et al. [2] mit n = {4, 16} arbeiteten. Verwendet wurden verschiedene Audiomerkmale. Zum einen gängige Merkmale wie Bandenergie, zum anderen das Spectral Flatness Measure (SFM) und der eng verwandte Spectral Crest Factor (SCF) zur Beschreibung spektraler Glattheit. Aus diesem Audiofingerabdruck wird mittels eines einfachen k-means-ClusteringAlgorithmus, der noch in Abschnitt 2.6 erklärt wird, eine kompakte nicht-temporale Repräsentation des Audiostückes in Form einer kleinen Menge von Code-Vektoren im Rn generiert, das sogenannte Codebuch. Die Anzahl dieser Vektoren ist abhängig von einem zu definierenden maximalen RMSE (root mean square error) und kann je nach Datenbeschaffenheit gut abgeschätzt werden. Jedes Codebuch stellt eine Klasse dar und wird entsprechend in einer Klassendatenbank abgelegt. Die im Erkennungsmodus stattfindende Identifikation erhält eine Anfrage in Form einer Folge von Vektoren im Rn. Die Treffererkennung stellt nun ein N-Klassen Klassifikationsproblem dar: Zunächst wird die Anfrage in eine Sequenz entsprechender Merkmale transformiert, die nachfolgend durch alle in der Datenbank vorliegenden Codebücher unter Verwendung der RMSE-Distanz approximiert wird. Dabei wird der Fehler jedes Codebuches akkumuliert. Die Anfrage wird derjenigen Klasse zugeordnet, die den geringsten akkumulierten Fehler besitzt. Zur Steigerung der Performanz werden während der Verarbeitung der Vektorfolgen kurzzeitliche Statistiken berechnet und im folgenden angewandt, was zu einer sowohl höheren Erkennungsrate wie auch zu einer schnelleren Berechnung führt. In Tests mit bis zu 15.000 Testmusikstücken erreichte das System selbst bei verrauschten Signalen über 98% korrekter Treffer. Darüber hinaus ist AudioID ein sehr performantes System, das auch auf gängigen Desktop-PC-Systemen läuft. 2.5.2 Shazam Ent. / Wang Als eines der ersten Verfahren wird der von Shazam Entertainment (Kalifornien) unter Leitung von Avery Wang entwickelte Audioidentifikationsalgorithmus [114] seit 2002 kommerziell eingesetzt. Der unter anderem in Großbritannien und in Deutschland von Vodafone angebotene Service erlaubt eine Identifikation von per Mobiltelefon übertragenen Musikstücken. Der kontinuierlich steigende Datenbestand umfasst nach eigenen Angaben derzeit über 2,2 Millionen Stücke. Zur Identifikation werden die ersten 30 Sekunden des Service-Anrufes mitgeschnitten und auf dem firmeneigenen Cluster aus 80 vernetzten Linux-PCs analysiert [104]. 26 2. Audiomonitoring Der Algorithmus arbeitet ereignisbasiert mit Audio-Merkmalen , die aus Energiemaxima, also Spitzen im Spektrogramm des Signals, gewonnen werden. Diese Merkmale beschreiben Ankerpunkte in einer Zeit-Frequenz-Konstellationskarte, die mittels einer durch Unterschiede in Frequenz und Zeit definierten Nachbarschaftsrelation zueinander in Beziehung gesetzt werden. Jedem Ankerpunkt wird somit eine geeignete Zone im angrenzenden Bereich der Konstellationskarte zugeordnet. Die Merkmale werden nachfolgend klassifiziert und in einer durch die Merkmalsklasse indexierten Hash-Tabelle gespeichert [57]. Die Treffersuche verwendet ein Votingverfahren, das mögliche Verschiebungen zwischen Anfrage und Datenbestand berechnet und sich durch seine Anlehnung an Geometric Hashing [118] sehr gut parallelisieren lässt. Dabei wird ein Ranking vorgenommen, das auf einem aus der Differenz fortlaufender Offsets zwischen Anfrage und Datenbasis berechneten Histogramm beruht. Der Ranking-Wert ergibt sich aus der Höhe der größten Spitze des Histogramms. Wang et al. beschreiben in [114] die Erkennungsleistung des Systems von Audiostücken verschiedener Länge. Dabei fällt auf, dass die prozentualen Erkennungsraten von GSM-kodierten (Global Standard for Mobile Communications, Mobilfunk-Protokoll) Daten denen von unkodierten PCM-Daten mit nur 6dB schlechterem Signal-zu-Rausch-Abstand stark ähneln. Neben seiner als effizient beschriebenen Eigenschaft kann dem Algorithmus daher wohl eine gute Robustheit im Umgang mit im Mobilfunksegment typischen Signalen attestiert werden. 2.5.3 AudioDNA Das von Cano et al. entwickelte AudioDNA-System [22] verwendet zum einen Methoden aus der Bioinformatik, zum anderen die in der Spracherkennung erfolgreich eingesetzten Hidden Markov Models (HMM). Diese stellen im vorliegenden Kontext abstrakte Generatoren in Form endlicher Automaten dar, die zustandsbasiert eine reproduzierbare Folge von Symbolen eines Alphabets ausgeben. Die Umwandlung des Signals in eine solche Symbolfolge findet in mehreren Schritten statt. Zunächst werden MFCCs aus dem Signalspektrum erzeugt, die zur Komprimierung der niederwertigeren Koeffizienten und deren Dekorrelation nachfolgend einer Diskreten Kosinustransformation (DCT) unterzogen werden. Um die als Voraussetzung nachfolgender Schritte nötige Unabhängigkeit der Merkmalsvektoren zu ihren Nachbarn näherungsweise zu garantieren, werden auch die ersten beiden Ableitungen hinzugezogen. Unter Verwendung akustischer Modelle wird nun zu der gegebenen Vektorsequenz eine Anzahl von HMMs generiert, die als AudioGenes bezeichnet werden und gewissermaßen Generatoren für die übergebenen Signalfolgen darstellen. Diese AudioGenes, in die Angaben über zeitliche Positionen eingebettet sind, bilden zusammen die sogenannte AudioDNA. Die Dekodierung der Merkmalsfolge, also die Berechnung der wahrscheinlichsten AudioDNA, wird dabei durch den effizienten Viterbi-Algorithmus [112] durchgeführt. Dieser findet die wahrscheinlichste Zustandsfolge einer durch die verwendeten HMMs emittierten Symbolfolge. Die AudioDNA wird nachfolgend in einer Baumstruktur abgelegt. Das zur Identifikation übergebene Audiosignal wird ebenfalls in AudioDNA umgewandelt und per aus der Bioinformatik bekanntem schnellem approximativem Stringmatching mit den im Suchbaum vorhandenen AudioDNA-Elementen verglichen. Die eigentliche Identifikation erfolgt durch Kombination der verschiedenen AudioGenes und der zugehörigen Positionsangaben. Cano et al. legen in ihrer Arbeit besonderen Wert auf Robustheit bei Verwendung von Radiosignalen, insbesondere auf die Kompensation zeitlicher Skalierungen gesendeter Beiträge, was zur Verwendung von Hidden Markov Modellen führte. Neben Erweiterungen des ursprünglichen Konzeptes entstand aus dem Kontext des AudioDNA-Verfahrens das gut skalierbare Amadeus-System [14], welches ein auch flexibel auf andere Bereiche des Multimedia Information Retrievals adaptierbares Identifikations-Instrument darstellt. 27 2. Audiomonitoring 2.5.4 AudioHashing J. Haitsma und T. Kalker von Philips Research extrahieren in ihrem von Methoden aus der Kryptografie inspirierten Ansatz [45] in regelmäßigen Abständen von 11,8 ms Fingerabdrücke aus dem Signalfluss. Dabei genügt nach ihren Angaben ein Audiosignal mit einer gesamten Länge von nur 3 Sekunden für eine Identifikation. Nach dem Downsampling auf eine Abtastrate von 5 kHz wird das per STFT erzeugte Spektrum auf 300 – 2000 Hz eingegrenzt und in 33 logarithmisch gestufte Frequenzbänder eingeteilt. Für jedes Band wird die Bandenergie berechnet und aus der als ein Bit interpretierten Differenz zweier benachbarter Bänder ein 32 Bit langer, Hash-Signatur genannter Wert erzeugt. Eine Menge von 256 solcher Signaturen werden zu einem Hash-Block zusammengefasst und repräsentieren somit in 8192 Bit ca. 3 Sekunden des Audiosignals. Die Wahrscheinlichkeit des gleichen Auftretens zweier aus unterschiedlichen Audiosignalen erzeugten Hash-Blöcke A, B ∈ {0,1}32⋅256 ist sehr gering, ähnlich wie bei Zahlen, die durch eine geeignete Hash-Funktion generiert werden. Zur Indexierung eines Hash-Blockes werden alle 256 Signaturen in einer HashTabelle abgelegt, zusammen mit einer Referenz auf den nachfolgenden Hash-Block. Zwei Hash-Blöcke gelten dann als ähnlich, wenn ihr Hamming-Abstand (hier in Form der Bitunterschiede) kleiner einem gewissen Grenzwert ist. In den publizierten Experimenten zeigte sich, dass bis zu 2867 der 8192 Bits eines Blocks Fehler sein dürfen, um eine Identifikation noch zu ermöglichen. Eine zu identifizierendes Audiosignal wird ebenfalls in eine Folge von Hash-Signaturen umgewandelt. Da sich ein Brute-Force-Vergleich aus Performanzgründen verbietet, werden unter der Annahme, dass mit hoher Wahrscheinlichkeit auch ein verzerrtes Audiosignal zu einem dem Original ähnlichen Hash-Block führt und dabei mindestens eine Signatur je Block fehlerfrei bleibt, nur bestimmte Bit-Positionen verglichen. Bei Übereinstimmung wird der weitere HashBlock genauer untersucht. Dieses Vorgehen spiegelt sich in geringer Laufzeit und hohen Trefferquoten wider. Da in der Praxis die angenommene Robustheit bei stark verzerrten Signalen nicht immer gewährleistet ist, erlaubt man zur Steigerung der Robustheit 1-2 Bitfehler. Dies führt allerdings zu einer höheren Laufzeit. Das rechenintensivste Teilmodul ist jedoch die Fouriertransformation, die das Fingerabdrucksystem jedoch in Form einer reellwertigen Festkomma-Implementierung selbst auf einem PDA oder Mobiltelefon lauffähig macht. Die von Philips kommerziell vertriebene Implementierung besteht aus einer einfachen Master/Slave-Architektur, die sich gut skalieren lässt. Weiterhin ist der eigentlichen Identifikation eine unabhängige Klassifikation mit Qualitätseinschätzung vorgeschaltet. 2.5.5 Audentify! Das in der Arbeitsgruppe Multimedia-Signalverarbeitung der Universität Bonn von Professor Clausen unter Mitarbeit von F. Kurth und A. Ribbrock entwickelte Konzept zur Audioidentifikation [57, 58, 13, 91] basiert auf einem gruppentheoretischen, Operator-basierten Ansatz. Aufsetzend auf einer allgemeingültigen Theorie zur Konstellationssuche mit Ginvertierten Listen [57] wurde diese für die Arbeit mit Audiodaten hin konkretisiert. Die entwickelte Suchtechnik umfasst sowohl Translations-, wie in bestimmten Varianten auch Skalierungsinvarianz und verwendet eine klare Trennung von Merkmals-Extraktion und Suchbzw. Indizierungstechnik. Zur flexiblen Handhabung von verschiedenartigen Systemanforderungen wurden mehrere Merkmals-Extraktoren entwickelt, die jedoch darin übereinstimmen, dass sie Signale auf ksignifikante Maxima untersuchen, Positionen im Signal, deren Amplitude höher ist als die der k nächsten Nachbarn, und anhand der Merkmalsfolgen in Klassen einteilen. So untersucht der FVolExtraktor [91] die Abstände benachbarter aus der Lautheit des Signals extrahierter k-signifikante 28 2. Audiomonitoring Maxima, der FWFT-Extraktor hingegen die der Maxima der Mittelfrequenz-Folge des SignalSpektrums. Einen gänzlich anderen Ansatz bieten auf der Codierungstheorie aufbauende Extraktoren, die der oft ungünstigen Merkmalsverteilung entgegen zu wirken versuchen. Diese basieren auf Merkmalen wie etwa der Lautheit eines Signals und ermöglichen die Umwandlung der resultierenden Merkmalsfolge mittels eines binären Quantisierers und eines linearen, fehlerkorrigierenden Codes in binäre Codewörter c ∈ {0,1}n gleicher Länge. Anhand dieser Codewörter werden die Signale in Klassen eingeteilt. Die gewählten Vektorräume der Codewörter streben dabei einen möglichst großen paarweisen Hamming-Abstand an. Zur Erzeugung der Codes werden unter anderem approximative Lernverfahren eingesetzt. Eine Erweiterung stellen Codewörter der Form (0+1+)+ dar [13], die durch nicht-uniforme Länge ein Arbeiten auf skalierten Signalen erlauben. Der zugrunde liegenden Theorie folgend werden die Dokument, Translationswert und ggf. Skalierungsfaktor umfassenden Dateneinträge in invertierten Listen abgelegt. Zur Trefferbildung, die zu einer Menge von Treffern führt, die sich durch Dokumentenindex und Translationsinformation auszeichnen, wird die Anfrage sukzessiv per Schnittmengenbildung mit den invertierten Listen verknüpft. Entscheidend für die Effizienz ist daher die Kürze der einzelnen Listen. In der Praxis hat sich zu diesem Zweck die dynamische Speicherung in AVLBäumen bewährt, die ein schnelles Finden mittels binärer Suche erlauben. Erweiterungen dieses Schemas ergeben sich aus fehlertoleranter und unscharfer Suche, sowie aus einem Ranking einzelner Trefferkandidaten. Anwendung findet das Konzept unter anderem im Sentinel-System [58], das in Kapitel 2.7 erläutert wird, und im Rahmen des in dieser Diplomarbeit entworfenen generischen Monitoringsystems, das in den Kapiteln 4 und 5 vorgestellt wird. Für eine Übersicht über weitere Ansätze zur Audioidentifikation sei hier auf die Arbeit [21] verwiesen. Über die reinen Audioidentifikations-Technologien hinaus kam es in den letzten Jahren zu einem Boom von Start-Up-Unternehmen, deren Produkte sich mit Audioidentifikation beschäftigen, darunter das von Napster-Gründer Shawn Fanning gegründete Relatable [87]. Aufgrund rechtlicher Schwierigkeiten der Firma Napster war die neueste Version des Systems, die eine High-Level-Musikmodellierung zur Filterung von File-Sharing-Anfragen verwendete, jedoch nur wenige Tage im Einsatz. Die Technologie wurde von Fanning im Dezember 2004 in einem neuen Service namens Snocap [98] der Öffentlichkeit vorgestellt. Weitere Firmen und Projekte finden sich online, z.B. AudibleMagic [9], Yacast [120] und MusicBrainz [74]. 2.6 Audioklassifikation Ein der Audioidentifikation nah verwandter Teilbereich des Audio Information Retrieval ist die Audioklassifikation. Ziel ist dabei die automatische Zuordnung eines Anfrage-Audiosignals zu einer semantischen Klasse. Auch hier unterscheidet man auf Metadaten arbeitende Verfahren, z.B. Stringmatching unter Verwendung von Anmerkungen zu Autor und Titel, und inhaltsbasierte Verfahren. Hier soll auf letzteren Fall eingegangen werden. Einige der hierbei erläuterten Konzepte finden Anwendung in dem Klassifikationsmodul, welches im Rahmen dieser Diplomarbeit entwickelt und umgesetzt wurde. Die entsprechende Darstellung findet sich in Kapitel 5.3.10. Übliche Audioklassifikationsszenarien haben eine Einordnung eingehender Signaldaten als Musik oder Sprache zur Aufgabe [93], ebenso wie die Klassifikation von Musik in verschiedene Genres [108] oder die Klassifikation von in Audioaufnahmen vorhandenen Musikinstrumenten [47]. Reale Anwendungen ergeben sich z.B. in der Medizin, wo ein Expertensystem 29 2. Audiomonitoring Atmungsgeräusche analysiert, oder im Bereich der Heimelektronik, etwa zur automatischen Auswahl eines entsprechenden Equalizer-Presets anhand des erkannten Musikgenres [42]. Die Verwendung von Audioklassifikatoren stellt eines der Hauptelemente von Audiomonitoringsystemen dar. Dies reicht von Vorverarbeitungsschritten zur Effizienzsteigerung oder zur automatischen Segmentierung von Audioströmen [8], etwa um Datenströme automatisch zu beschriften [107], bis hin zur automatischen Diskriminierung von Nachrichtensendungen und Werbung in Datenströmen [62]. Auch andere Bereiche profitieren von effizienten Audioklassifikations-Verfahren. Da Musik und Sprache durch unterschiedliche Komprimierungsverfahren (Codecs) jeweils effizient bearbeitet werden können, universelle Codecs im Allgemeinen jedoch weniger Codierungseffizienz in Form geringerer Komprimierungsraten besitzen, könnte durch Verwendung eines Moduls zur Klassifikation in Musik und Sprache eine flexible, effektivere Komprimierung eingesetzt werden [34], etwa für Übertragung von Multimediadaten im Internet. Weitere denkbare Einsatzgebiete finden sich im Umgang mit Audiobibliotheken, die durch automatische Klassifikation von Audiosignaldaten gegenüber menschlichen Einordnungen sowohl von einer objektiveren Indexierung als auch von einer Geschwindigkeitssteigerung profitierten. Die zur Klassifikation verwendeten Methoden entstammen meist der Mustererkennung und lassen sich grundsätzlich in überwachte und unüberwachte Verfahren unterteilen [52]. Überwachte Klassifikation beschreibt die Zuordnung eines Objektes zu einer von mehreren vordefinierten Klassen, während die zu Beginn leeren Klassen im unüberwachten Fall selbstständig erlernt werden. Durch ihre Verwandtschaft teilen Audioklassifikationsverfahren viele Eigenschaften mit Methoden aus anderen wissenschaftlichen Gebieten, wie z.B. der Biometrik, Data Mining und der Bildanalyse. Audiosignale werden üblicherweise als Muster durch möglichst robuste d-dimensionale Merkmale repräsentiert und erlauben so das Verwenden der auch in der Audioidentifikation eingesetzten und in Abschnitt 2.3 und 2.4 erläuterten Verfahren. Die enge Verwandtschaft zu diesen Verfahren zeigt sich auch im grundsätzlich ähnlichen Aufbau, der aus Vorverarbeitung, Merkmalsextraktion und Entscheidungsmodul besteht. Entscheidend für die Effektivität des dabei verwendeten Merkmalsraumes ist, wie gut Muster verschiedener Klassen voneinander separiert werden können und somit die Qualität der die Klassen abgrenzenden Entscheidungsgrenzen (engl. decision boundaries). McKinney et al. [65] zeigen in ihrer Arbeit, dass die Wahl speziell auf das konkrete Problem zugeschnittener Merkmale (z.B. aus der Psychoakustik, im Gegensatz zu üblich verwendeten Merkmalen) einen großen Einfluss auf die Effektivität der Klassifikation besitzt. Scheirer und Slaney verwenden in ihrer vielzitierten Veröffentlichung [93] zur Diskriminierung von Sprache und Musik dreizehn verschiedene Merkmale und untersuchen Effektivität und Effizienz einzelner Merkmale. Neben typischen hier in Abschnitt 2.4.1d genannten Merkmalen in der Spracherkennung und deren Varianten, die teilweise bessere Ergebnisse erzielten als die zugrunde liegenden Merkmale, präsentieren die Autoren auch neue Merkmale, darunter das „Pulse-Metric“-Merkmal, das Rhythmizität anhand von Autokorrelationen über 5 Sekunden lange Zeiträume analysiert und das zu den drei effektivsten der untersuchten Merkmale gehört. Weiterhin werden zur Untersuchung der Praxistauglichkeit die Klassifikationsfehler der besten und der schnellsten Verfahren gegenübergestellt. Neben dem weit verbreiteten statistischen Ansatz spielen vor allem von biologischen Mustererkennungsverfahren inspirierte Neuronale Netzwerke eine wichtige Rolle. Diese besitzen eine integrierte Einheit aus Merkmalsextraktion und Klassifikator und arbeiten durch verschaltete Schichten bzw. Netze einzelner trainierbarer Module, den Neuronen. Die Topologie und das Zusammenspiel einzelner Neurone variiert je nach Netztyp und umfasst auch rückgekoppelte Netze und selbstorganisierende bzw. topologiebewahrende Karten [121]. Die Anzahl der 30 2. Audiomonitoring Neurone je Schicht korrespondiert dabei mit der jeweiligen Dimension der verarbeiteten Daten. So lässt sich beispielsweise in einem Multilayer-Perzeptron mittels zwischen Ein- und Ausgabeschicht befindlichen versteckten Schichten eine je nach Typ lineare oder nichtlineare Repräsentation der Hauptkomponenten der Daten erreichen [52]. Überwachte statistische Klassifikationsverfahren arbeiten in zwei Modi: Im Trainingsmodus wird der Klassifikator trainiert, den Merkmalsraum mittels einer Menge von Trainingsmustern zu partitionieren. Anhand von Feedback-Mechanismen können dabei Vorverarbeitungsparameter als auch die Merkmalsextraktion optimiert werden. Im Klassifikationsmodus wird ein durch einen d-dimensionalen Merkmalsvektor repräsentiertes Muster anhand einer Entscheidungsregel einer Klasse zugeordnet. Da die Verteilungswahrscheinlichkeiten der Klassen in der Praxis üblicherweise unbekannt sind und im Trainingsmodus abgeschätzt werden, finden aus der Mustererkennung bekannte optimale Verfahren wie die Bayes-Regel meist keine direkte Anwendung. Falls die Form der Verteilung bekannt ist (z.B. Gaußsch), mehrere Parameter jedoch unbekannt, spricht man von einem „parametrischen Entscheidungsproblem“. Eine in diesem Fall übliche Herangehensweise stellt das Ersetzen der unbekannten Werte durch Schätzungen dar. Falls keinerlei Informationen über die Wahrscheinlichkeitsverteilung der Klassen vorliegen, spricht man dagegen von einem „nichtparametrischen Entscheidungsproblem“, in dem auf den Trainingsdaten basierte Entscheidungsgrenzen konstruiert werden müssen, z.B. über die k-nearest-neighbour-Regel oder die Verwendung eines Multilayer-Perzeptrons. Ein in der Praxis entscheidender Faktor betrifft die Auswahl der Trainingsdaten. Durch unzureichendes Wissen über zu klassifizierende Audiosignale und der daraus meist resultierenden Abhängigkeit von Schätzungen müssen die im Trainingsmodus verwendeten Trainingsdaten besonderen Ansprüchen genügen: Zum einen muss ihre Anzahl angemessen sein, zum anderen sollten ihre Werte typisch für nachfolgende zu klassifizierende Werte sein. Bei Verwendung zu weniger Trainingsmuster kann der Klassifikator den Merkmalsraum nicht gut modellieren, zu viele Daten können hingegen zum Effekt des Übertrainierens führen, bei dem sich der Klassifikator zu sehr den Parametern der Trainingsdaten angepasst hat. Strategien zur Vermeidung solcher Probleme weisen auf rotierende Trainingsmengen hin, die unabhängig zu Optimierung und Evaluation eingesetzt werden [52]. So verwenden Scheirer und Slaney [93] für ihren Klassifikator zur Diskriminierung von Musik und Sprache je 20 Minuten an Audiodaten, die sie aus Radioaufnahmen gewinnen. Dabei legen sie Wert auf eine repräsentative Auswahl verschiedener Genres mit und ohne Gesang, sowie Stimmen beider Geschlechter mit verschiedenen Hintergrundgeräuschen und typischen Verzerrungseffekten. Die Trainingsdaten geben darüber hinaus Auskunft über die Fehlerrate des Klassifikators, d.h. den Prozentsatz falsch klassifizierter Daten. Wenn die Menge der Trainingsdaten groß und aussagekräftig genug ist und Trainings- und Klassifikationsmuster unabhängig sind, gibt dieser Wert eine gute Schätzung der tatsächlichen Fehlerrate. Diese ist dagegen selbst für den Fall, dass sämtliche System-Parameter vorliegen, äußerst schwierig analytisch festzusetzen und ist in der Praxis in einem solchen Fall bestenfalls per Bayes’schem Fehlermaß abzuschätzen. Für eine Übersicht weiterer Fehlermaße siehe Jain et al. [52]. Die Performanz eines Klassifikators hängt darüber hinaus auch vom Verhältnis aus Datengröße, Merkmalszahl und Klassifikator-Komplexität ab. Bei Einteilung der Trainingsdaten in Klassen steigt die Zahl der Trainingspunkte im Merkmalsraum exponentiell mit der Größe der Merkmalsdimension – ein „Fluch der Dimensionalität“ getauftes Problem, das auch in vielen anderen Wissenschaften die Arbeit mit großen Datenmengen beschränkt. Jain et al. [52] weisen in diesem Zusammenhang darauf hin, dass durch ein Verhältnis von mindestens zehn mal so vielen Trainingsmustern per Klasse wie der Anzahl verwendeter Merkmale eine Vermeidung des Problems erreicht werden kann. 31 2. Audiomonitoring Abbildung 2.8: Zustand eines GMM zu Beginn und nach einigen Iterationen. Man beachte, dass die als Kreise dargestellten Merkmalsvektoren eine sich im Laufe der Iterationen verändernde Wahrscheinlichkeit der Klassenzugehörigkeit aufzeigen. Klassifikatoren lassen sich je nach enthaltenem Entscheidungsverfahren in verschiedene Typen einteilen. Der einfachste Ansatz verwendet sogenanntes Ähnlichkeitsmaß, um Muster Klassen zuzuordnen. Dazu wird das Anfrage-Muster mit Repräsentanten jeder Klasse verglichen und anhand des Ähnlichkeitsmaßes der naheliegendsten Klasse zugeordnet. Die Berechnung der Repräsentanten kann per Mittelwert der Klasse (nearest mean classifier) oder auch durch komplexere Verfahren wie Vektor-Quantisierung (VQ) erfolgen. Ein typischer solcher Klassifikator ist der knearest neighbour-Klassifikator (k-NN), bei dem per Euklidischer oder Mahalanobis-Distanz zu einem eingehenden Punkt im Merkmalsraum die k nächstliegenden Punkte berechnet werden. Die Zuordnung erfolgt dann zu derjenigen Klasse, der die Mehrheit dieser k Punkte zugeordnet ist. Nachteil ist die nötige Speicherung einer großen Zahl von Trainingsvektoren und die dadurch hohe Anzahl an Vergleichen. Zur Effizienzsteigerung werden daher unter anderem räumliche Partitionierungsstrategien wie k-d-Bäume eingesetzt [93], die den Merkmalsraum per ManhattanMaß vorpartitionieren und so die Anzahl nötiger Vergleiche drastisch reduzieren. Ein anderer Klassifikatoransatz verwendet Wahrscheinlichkeitsberechnungen und parametrische Modelle, um über Schätzungen von Parametern eine Entscheidung über eine Klassenzugehörigkeit eines zu klassifizierenden Objekts durch Wahl der höchsten Wahrscheinlichkeit zu ermöglichen. Ein typischer solcher Klassifikator ist z.B. der mehrdimensionale Gaußsche MAP (maximum a posteriori)-Schätzer, der jede Klasse als Gaußsche Verteilung von Punkten eines multidimensionalen Raumes interpretiert. Anhand von durch Trainingsdaten geschätzten Mittelwert- und Kovarianz-Parametern jeder Klasse können eingehende Anfragemuster anhand der Mahalanobis-Distanzmessung der nächsten Klasse zugeordnet werden [93]. In ähnlicher Weise modellieren Gaußsche Mixtur-Modelle (GMM) Klassen als Vereinigung mehrerer Gaußscher Cluster. Siehe auch Abbildung 2.8. Anhand geschätzter Wahrscheinlichkeitsmodelle werden Anfragen der wahrscheinlichsten Klasse zugeordnet. Die Schätzungen werden dabei iterativ durch den Expectation-MaximizationAlgorithmus durchgeführt, wie im Fall des von Vacher et al. [110] zur Sprachklassifikation im Rahmen eines medizinischen Telesystems verwendeten GMMs. Eine direkte (geometrische) Berechnung der Entscheidungsgrenzen kann jedoch auch zu einem dritten Klassifikatoransatz führen. Dazu wird ein Fehlerkriterium optimiert, beispielsweise der durchschnittliche quadrierte Fehler (engl. mean squared error, MSE). Dies kann beispielsweise durch Neuronale Netze geleistet werden [52]. Einen relativ neuen Ansatz findet man im Bereich der Support Vector Machines. Diese zweiKlassen-Klassifikatoren berechnen eine Menge von Vektoren, die den (geometrisch interpretierten) leeren Randbereich zwischen den beiden zu trennenden Klassen definieren [52]. 32 2. Audiomonitoring Auch die Verwendung der in der Spracherkennung erfolgreich eingesetzten Hidden Markov Models (HMM) bietet, insbesondere in Verbindung mit anderen Verfahren, neue Möglichkeiten, vor allem im Bereich der Audio-Segmentierung [56]. Zhang et al. setzen HMMs in ihrem hierarchischen Klassifikationssystem ein, um regelbasierte Grobklassifikationen von Audiosignalen weiter zu verfeinern [122]. Da jedes Klassifikationsverfahren problemspezifische Vor- und Nachteile besitzt, kann durch eine Verschaltung mehrerer Klassifikatoren eine Effektivitätssteigerung erzielt werden. Die Möglichkeiten umfassen verschiedene Architekturen und Gewichtungen. So kann etwa durch eine serielle Kombination schneller, aber ungenauer Klassifikatoren und langsamer, effektiver Klassifikationsverfahren eine Leistungsverbesserung erzielt werden. Für eine Übersicht siehe Jain et al [52]. Eine ähnliche Möglichkeit stellt eine dynamische Gewichtung, z.B. in Form eines gleitenden Mittelwertes dar, mittels dem eine fehlerhafte Klassenzuordnung (engl. class switching) eingeschränkt werden kann [34]. Eine unüberwachte Audioklassifikation muss im Gegensatz zu Ansätzen, die auf vorklassifizierten Trainingsdaten arbeiten, selbstständig semantische Klassen generieren. Dies kann durch eine regelbasierte Heuristik geschehen, wie von Djeraba et al. [31] beschrieben wird. Die Autoren skizzieren ein System zur Klassifikation von Audiosignalen in Stille, Rauschen, Sprache und Musik, wobei die Klassifikation nach Anwenden einer Fensterfunktion wie folgt durchgeführt wird: Zunächst wird versucht, das Signal als Stille über einen Selbst-Normalisierung genannten adaptiven Ansatz zu erkennen, der nach der Erkennung die eigenen Parameter aktualisiert. Die Autoren weisen darauf hin, dass eine Erkennung mittels der Lautheit des Signals wegen in der Praxis zu erwartender Hintergrundgeräusche nicht ausreiche. Mittels einer Autokorrelationsfunktion wird nachfolgend die Periodizität gemessen. Falls keine Periodizität vorliegt, wird die Anfrage als Rauschen klassifiziert. Falls kein Rauschen vorliegt, wird die Nulldurchgangsrate des Signals untersucht. Ist diese höher als ein Grenzwert, wird die Anfrage als Sprache, im anderen Fall als Musik klassifiziert. Panagiotakis et al. verwenden serielle Tests aus Kombinationen einfacher Merkmale zur Diskriminierung von Sprache und Musik und setzen eine vorgeschaltete Erkennung der Signalpräsenz anhand eines Maßes der Signalamplitude zur Klassifikation von Stille ein. Der Vorteil solcher Verfahren liegt in ihrer Effizienz [82]. Liegt ein solches Regelsystem nicht vor, kann ein Clustering-Algorithmus zu Hilfe gezogen werden, der unter Verwendung eines Cluster-Kriteriums Muster in selbstgenerierte Klassen (Cluster) einteilt. Neben hierarchischen Methoden [52], auf die hier nicht weiter eingegangen werden soll, gibt es Techniken, die auf Partitionierungstrategien beruhen und sich üblicherweise eines quadratischen Fehler-Kriteriums bedienen. Ziel ist dabei die Generierung einer Partition aus einer fixen Anzahl von disjunkten Clustern, wobei ein quadratisches Kostenmaß minimiert werden soll. Jedes Cluster wird durch seinen Mittelpunkt, den Centroid, repräsentiert, der nach Einfügen neuer Muster aktualisiert wird. Der quadratische Fehler jedes Clusters ist die Summe der Euklidischen Entfernungen jedes Musters zum Centroid. Ziel ist die Minimierung der Summe aller Cluster-Fehler. Der auf diesem Ansatz basierende k-means-Algorithmus ist effizient und liefert unter bestimmten Umständen erstaunlich gute Ergebnisse [69, 52]. Leong setzt ihn beispielsweise im Rahmen eines Musikidentifzierungssystems ein, um MFCC-Merkmale zu clustern [59]. 33 2. Audiomonitoring 2.7 Audiomonitoringsysteme Der Begriff des Audiomonitorings beschreibt diejenige Spezialisierung des in Abschnitt 2.1 beschriebenen allgemeinen Multimediamonitorings, die auf den erläuterten Komponenten Audioidentifikation und/oder -Klassifikation aufbaut. Die in der Praxis verwendeten Systeme bedienen sich dabei der gesamten Spannweite der in den vorigen Abschnitten erläuterten Ansätze. Oft finden sich dabei Kooperationen zwischen Forschungsgruppen und kommerziellen Interessenten, wie unter dem Punkt Monitoring am Übertragungskanal nachfolgend beschrieben wird. Wie in Abschnitt 2.1 erläutert, ist ein zentrales Merkmal dieser Systeme ihre EchtzeitFähigkeit. Da es wegen der Vielfältigkeit der Zielsetzungen und den verwendeten Frameworks kaum möglich scheint, eine allumfassende Definition des Audiomonitorings zu geben, soll im Folgenden zunächst auf übliche Gemeinsamkeiten vieler Systeme eingegangen und danach ein konkreter Überblick über ausgewählte Beispiel-Anwendungen gegeben werden. Nach Cano et al. [21] lassen sich Audiomonitoring-Systeme je nach Anwendungsbereich in drei Klassen einteilen: • Monitoring auf Seiten des Distributors Anbieter von Inhalten können feststellen, ob sie über die zur Veröffentlichung nötigen Berechtigungen verfügen. Auch die Arbeit mit archiviertem Audiomaterial kann durch Monitoring profitieren. Das gilt auch für Anbieter von CD-VerfältigungsDienstleistungen, die auf diese Weise nicht autorisierte Inhalte überprüfen können [90, 10]. • Monitoring am Übertragungskanal Sowohl Rechteinhaber von z.B. im Radio übertragenen Musikstücken als auch gewerbliche Werbekunden haben ein Interesse daran, gesendete Inhalte zu überprüfen – sei es, um Übertragungsentgelte zu überwachen, tatsächliches Airplay von Werbeanzeigen zu kontrollieren oder aus statistischen Gründen. Dazu zählen neben der Generierung von Spiellisten und der Erstellung von Charts auch die Kontrolle staatlicher Vorgaben, etwa in Form von Quoten, wie sie beispielsweise in Frankreich vorgeschrieben sind und derzeit auch in Deutschland diskutiert werden [99]. Anbieter solcher AudiomonitoringDienstleistungen sind Nielsen Broadcast Data System [79] und MusicTrace [76], die das am Fraunhofer-Institut entwickelte AudioID-Verfahren verwenden, das in Abschnitt 2.5.1 beschrieben wurde. Weitere Firmen in diesem Segement sind Music Reporter [73], deren Technologie auf dem in Abschnitt 2.5.3 beschriebenen AudioDNA-Verfahren aufsetzt [22] und Audible Magic [9]. Letztere kauften im Jahr 2000 Muscle Fish, eine Firma, die eines der ersten Audioklassifikationssysteme entwickelte [117]. Weitere Anwendungen ergeben sich aus Filesharing-Applikationen. Siehe dazu beispielsweise die in Abschnitt 2.5 angeführten Bemerkungen zu Relatable und Napster. Auch auf Webseiten befindliche Inhalte können mittels geeigneter Software analysiert und dokumentiert werden, etwa die der Firma Bay TSP [15]. • Monitoring beim Konsumenten Bei privaten wie gewerblichen Kunden eingesetzte Audiomonitoring-Anwendungen können vor allem dazu dienen, digitales Rechte-Management (DRM) durchzusetzen, etwa durch einen Echtzeit-Abgleich mit online befindlichen Datenbanken und einer bei entsprechender Verletzung von Rechten automatischen Abspielsperre von Geräten und/oder Software. Hier spielen auch digitale und/oder akustische Wasserzeichen eine wichtige Rolle. Darüber hinaus können sich auch hier aus Filesharing-Netzwerken neue Anwendungen ergeben, etwa zur Verifizierung der Echtheit und Vollständigkeit von Musikstücken. 34 2. Audiomonitoring Abbildung 2.9: Struktur des Sentinel-Systems Ein implementiertes Audiomonitoringsystem ist das von F. Kurth und R. Scherzer entwickelte Sentinel-System [58]. Aufsetzend auf dem in Abschnitt 2.5.5 beschriebenen Audentify!-System [57] erlaubt diese C++-Software den Echtzeit-Vergleich einer Menge eingehender Audioströme mit in einer Datenbank repräsentierten Referenz-Audiostücken, beispielsweise im Szenario der Suche nach im Radio gespielten Musikstücken, die über ein Mobiltelefon angefragt werden. Nach einer optionalen Vorverarbeitung mittels eines linearen Bandpass-Filters, durch den eine Simulation eines rauschenden Kanals erreicht werden kann, können zu jedem Anfrageelement verzögerte Kopien in den Eingabestrom eingefügt werden. Dadurch wird die Simulation eines Halleffektes ermöglicht. Die Merkmalsextraktion erzeugt aus den gefensterten Signalen eine Folge von Differential-Signalen und quantisiert diese zu einer {–1, +1}-Sequenz. Der frameweise Vergleich der Anfrage mit den ebenfalls aus {–1, +1}-Strömen bestehenden Referenzströmen – und zusätzlichen verzögerten Versionen davon – erfolgt über eine Korrelationsfunktion, deren über k Frames gemittelte Amplituden-Spitzenwerte in Verbindung mit zur Diskriminierung von konstanten Plateaus und echten Spitzenwerten verwendeten Varianzwerten eine Menge von möglichen Trefferkandidaten ergeben. Daraus wird dann ein sogenannter Superkandidat gewonnen, der zusammen mit den übrigen Kandidaten als Systemausgabe zurückgeliefert wird. Die Autoren evaluieren in ihrer Veröffentlichung neben möglichen maximalen Verzögerungseinspeisungen und Verzerrungstoleranzen auch die maximale Anzahl sowohl simultan verarbeitbarer Referenz- wie separat auch Anfrageströme bei jeweils fixen übrigen Systemparametern und weisen so die Praxistauglichkeit des Sentinel-Systems nach [58]. Das von Garcia et al. entworfene AIDA-Audiomonitoringsystem [41] verwendet eine hierarchische Struktur auf Basis von CORBA und Web Services, dessen Knoten jeweils versuchen, eine gegebene Anfrage zu identifizieren und bei Misslingen den nächsthöheren Knoten aufrufen. In der Identifikationsschicht wird die von Cano, Batlle et al. [22] entwickelte AudioDNA-Technik in Form von C++-Bibliotheken eingesetzt. Zwei in CORBA umgesetzte Schichten organisieren die Zuteilung der Identifikationsaufträge an physikalisch dezentral gehaltene Knoten, die zur Vereinheitlichung in eine Menge virtueller Knoten eingeteilt sind. Die 35 2. Audiomonitoring Anbindung an Clients, die verschiedene Betriebssysteme und Anforderungen haben können, wurde über SOAP/Web Services umgesetzt. Durch die dezentrale Lösung ist dieses System hervorragend skalierbar und kombiniert dazu die guten Performanz- und Robustheitseigenschaften des AudioDNA-Verfahrens. Ein Prototyp dieses Systems wird in Spanien zur Überwachung mehrerer Radio- und Fernsehsender eingesetzt. Neben diesen datenbankbasierten Systemen ergeben sich aus den ständig fortschreitenden Technologien auch immer alltäglichere Verwendungsmöglichkeiten. So sind erste Sicherheitssysteme zur robusten Klassifikation von akustischen Signalen in alltägliche und verdächtige Geräusche auf dem Markt, die über ein angeschlossenes Mikrofon einen Einbruch beispielsweise anhand des Geräusches von splitterndem Glas erkennen und Alarm schlagen können. Ein ähnliches System ist auch als Notrufsystem im medizinischen Bereich oder für Kleinkinder denkbar. Nooralahiyan et al. entwickelten ein kostengünstiges System zur Überwachung des Straßenverkehrs über ein verteiltes sensorisches Netzwerk. Mit Hilfe der Eingaben von gerichteten Mikrofonen und der Analyse durch eine Autokorrelationsfunktion erlaubt dieses System die Klassifikation des Verkehrsgeräusches in verschiedene Fahrzeugtypen. Ein Neuronales Netz lernte anhand von Trainingsdaten die Diskriminierung in vier verschiedene Fahrzeugklassen und erreicht eine überragende Klassifikationsleistung, die auch künstliche Verzerrungen nicht wesentliche beeinträchtigten [80]. Duarte und Hu entwickelten diese Überwachungstechnik weiter und verwenden in ihrem Ansatz ein System aus drahtlos kommunizierenden verteilten Sensoren, die über eine Reihe von Klassifikationsverfahren Umgebungsgeräusche einordnen [33]. Im Forschungsfeld des Verkehrs-Monitorings arbeiten darüber hinaus weitere Forschungsgruppen, zu deren Zielen unter anderem die Steigerung der Transporteffizienz, sowie die Überwachung von Umwelt- und Sicherheitsaspekten gehören [102]. Das im vierten Kapitel eingehend vorgestellte generische Monitoringsystem, das im Rahmen dieser Diplomarbeit entwickelt wurde, weist einige Gemeinsamkeiten mit den gerade vorgestellten Audiomonitoringsystemen auf. Im Gegensatz zu ihnen handelt es sich dabei jedoch um ein Konzept, das die Einbindung prinzipiell beliebiger Audiomonitoringverfahren ermöglicht. Da dieses Monitoringsystem intensiven Gebrauch von Multimedia-Framework-Mechanismen macht, soll das Konzept des Multimedia-Frameworks im nachfolgenden dritten Kapitel behandelt werden. 36 Kapitel 3 Multimedia-Frameworks Mit steigender Prozessorleistung, wachsender Anzahl von Breitbandverbindungen und stetig stärkerer Einbindung von Computern in alltägliche Bereiche spielen Multimedia-Applikationen mittlerweile für viele Benutzer eine zentrale Rolle im Umgang mit Computern. Auch kommerziell ist die Einbindung von Multimedia-Fähigkeiten integraler Bestandteil vieler Systeme. Ausdruck für diese Veränderung war auch die Wahl des Wortes Multimedia zum Wort des Jahres 1995 durch die Gesellschaft für deutsche Sprache (GfdS) [43]. Multimedia besitzt keine bindende allgemeingültige Definition, sondern wird in verschiedenen Wissenschaftsgebieten unterschiedlich aufgefasst. Im technischen Bereich kann es aber mit „Synthese und Nutzung verschiedener Medien“ umschrieben werden [48]. Ein weiterer Hinweis für die wichtige Rolle von Multimedia ergibt sich aus der Art, wie Menschen multimediale Daten filtern: So können die meisten Menschen nur 20% der gesehenen und separat 30% von gehörten Informationen speichern, im Fall des simultanen Reizens beider Sinne steigt die Rate des Gespeicherten dagegen auf 50% [101]. Die gestiegene Popularität von Multimedia-Anwendungen hat Auswirkungen auf sowohl Produzenten als auch Konsumenten. Da zum einen Entwicklungszyklen immer kürzer und Entwicklungsbudgets zunehmend gekürzt, zum anderen multimediale Anwendungen immer komplexer werden, hat sich der Einsatz einheitlicher, objektorientierter Multimedia-Frameworks bewährt, die naht- wie problemlos in System-Architekturen eingefügt werden können. Ziel dieses Kapitels ist es, Aufgaben und Fähigkeiten verschiedener Multimedia-Frameworks herauszuarbeiten und gegenüberzustellen. Grund dafür ist die Tatsache, dass das im Rahmen dieser Diplomarbeit entwickelte Audiomonitoringsystem maßgeblich auf einem der vorgestellten Multimedia-Frameworks aufsetzt. Zu diesem Zweck wird in Abschnitt 3.1 zunächst das Konzept des Frameworks allgemein erläutert, bevor in Abschnitt 3.2 elementare Aufgabenbereiche besprochen werden. Den Abschluss dieses Kapitels bildet in Abschnitt 3.3 die Darstellung aktueller Multimedia-Frameworks, deren jeweilige Arbeitsweise zusammen mit dem entsprechenden Funktionsumfang erläutert wird. 37 3. Multimedia-Frameworks Anwendungslogik Framework Eventloop Bibliothek Callbacks Anwendungslogik Aufrufe Eventloop Abbildung 3.1: Strukturunterschiede zwischen Framework und Bibliothek 3.1 Frameworks „Ein Framework ist ein Verbund von Klassen, die einen abstrakten Lösungsentwurf für eine Familie verwandter Probleme darstellen.“ (R.Johnson [54]) Objektorientierte Frameworks (zu deutsch etwa „Anwendungsgerüst“) bieten allgemein ein implementiertes Grundgerüst aus Architektur, Code und Entwurfsprinzipien für ähnliche Applikationen eines Anwendungsbereiches, das Entwickler üblicherweise durch Vererbungsmechanismen und Instanziierung verwenden können. Im Unterschied zu konventionellen Klassenbibliotheken liegen also gewissermaßen bereits „halbfertige“ generische Applikationen eines Anwendungsbereiches vor, die lediglich um eigene Applikationslogik erweitert werden müssen. Nach Fayad und Schmidt [36] weisen objektorientierte Frameworks vier primäre Vorzüge auf: • Modularität: Durch die Verkapselung der Implementierung hinter öffentlichen Interfaces erhöht sich die Software-Qualität, da sich Verständnis und Wartung vereinfachen. • Wiederverwendbarkeit: Die durch stabile Interfaces bereitgestellten generischen Komponenten beinhalten bereits komplette Lösungen typischer Probleme des jeweiligen Anwendungsbereiches in Form von Expertenwissen. Durch Verwenden dieser Lösungen erhöhen sich neben der Entwickler-Produktivität auch Qualität, Performanz, Verlässlichkeit und Interoperabilität. • Erweiterbarkeit: Durch Erweiterung der Interfaces und durch Hook-Methoden sind Frameworks erweiterbar. • Invertierung der Kontrolle: Der Applikationscode wird vom Framework aufgerufen. Dies wird auch als Hollywood-Prinzip bezeichnet: „Don’t call me, I’ll call you“. Weitere Vorteile bei Verwendung von Industriestandard-Frameworks: • Ergonomie: Die Homogenität von Applikationen gleicher Frameworks erleichtert den Einstieg und Umgang mit solchen Applikationen. 38 3. Multimedia-Frameworks • Zuverlässigkeit: Durch den hohen Verbreitungsgrad sind solche Frameworks vielfach und dauerhaft getestetet. • Performanz: Üblicherweise Leistungsfähigkeit auf. • Systematische Tests: Frameworks bieten gute Möglichkeiten für den Einsatz systematischer Tests. weisen weitverbreitete Frameworks eine gute Während bei der Verwendung von Bibliotheken die Klassen unabhängig voneinander verwendet werden können und die Applikationsarchitektur frei wählbar ist, gehören die Klassen eines Frameworks zu einem kooperierenden Verband und beruhen auf einer vordefinierten Architektur. Daraus ergeben sich nach Fayad und Schmidt [36] einige Herausforderungen bei der Entwicklung und Verwendung von Frameworks, vor allem auch im direkten Vergleich mit anderen, weniger komplexen Ansätzen wie Patterns, Klassenbibliotheken und Komponenten: • Hoher initialer Entwicklungsaufwand: Dieser ergibt sich aus der hohen Komplexität von Frameworks. • Lernkurve: Die oft mehrmonatige Einarbeitungszeit in ein Framework amortisiert sich üblicherweise nur, falls Applikationen des selben Anwendungsbereiches oder Anwendungen mit übergeordneten Gemeinsamkeiten (und Unterschieden nur im Detail) entwickelt werden sollen. „The most profoundly elegant framework will never be reused unless the cost of understanding it and then using its abstractions is lower than the programmer’s perceived cost of writing them from scratch”. (G.Booch [18]) • Integrierbarkeit: Die Kombination verschiedener Frameworks (GUI, Datenbanken, Kommunikation, ...) ist oft sehr schwierig, vor allem, wenn auch Klassenbibliotheken oder Komponenten miteingebunden werden müssen. Die Gründe dafür finden sich auf mehreren Abstraktionsebenen, etwa wegen der oben genannten. „Invertierung der Kontrolle“ im Zusammenspiel der jeweiligen Kontrollmechanismen. • Wartbarkeit: Aufgrund der Komplexität von Frameworks sind Änderungen der Anforderungen oft schwer umzusetzen oder resultieren in weitreichenden Folgen für darauf aufbauende Applikationen. • Validierung und Entfernen von Fehlern: Durch die zunehmende Abstraktion und das Verwenden generischer Komponenten wird eine Validierung ebenso immer schwieriger wie die Lokalisierung eines Fehlers in Framework oder Applikation. Auch die invertierte Kontrolle erschwert das Debuggen maßgeblich. • Effizienz: Der Preis hoher Flexibilität ist oft eine reduzierte Effizienz, z.B. durch das übliche Verwenden von Dynamic Binding. • Fehlende Standards unter Frameworks: Dies betrifft sowohl Design und Implementierung wie Dokumentation und Adaption von Frameworks. Bekannte Frameworks sind beispielsweise die Microsoft Foundation Classes (MFC), ein GUIFramework, und CORBA, ein Object-Request-Broker (ORB)-Framework, das Kommunikation 39 3. Multimedia-Frameworks zwischen lokalen und entfernten Objekten ermöglicht. Andere ORB-Frameworks sind DCOM und das Java RMI. Frameworks lassen sich nach dem Taligent-White-Paper [103] anhand von zwei Kriterien klassifizieren; zum einen nach Einsatzart: • Anwendungs-Frameworks (engl. application frameworks) umfassen die gesamte Anwendung, d.h. Expertenwissen zur Systemarchitektur, z.B. GUI-Frameworks. • Bereichsspezifische Frameworks (engl. domain frameworks) beinhalten Expertenwissen zu einem speziellen Anwendungsbereich. Darunter fallen auch Multimedia-Frameworks. • Infrastruktur-Frameworks (engl. support frameworks) stellen Systemdienste bereit, z.B. für den Dateizugriff. Klassifikation nach Architektur: • architekturgetriebene Frameworks (engl. architecture-driven) werden angepasst durch Vererbung und Überdefinieren. Sie beinhalten komplexe Klassenhierarchien, so dass zum einen ein hoher Einarbeitungsaufwand entsteht und zum anderen relativ viel Code zu schreiben ist. Dafür bieten sie einen hohen Grad an Flexibilität. • datengetriebene Frameworks (engl. data-driven) dagegen werden anhand von Objektkonfigurationen und anderen Parametereinstellungen angepasst und sind daher leicht zu adaptieren. Allerdings ist das Systemverhalten dadurch stark eingeschränkt und unflexibel. Gut entworfene Frameworks bieten üblicherweise eine zweischichtige Architektur aus einer architekturgetriebenen Basis mit einer darauf aufsetzenden datengetriebenen Schicht. Die weitverbreitete Einteilung von R.Johnson [54] ähnelt dieser Klassifikation sehr: Nach diesem Ansatz entsprechen architekturgetriebene Frameworks in etwa sogenannten White-Box-, datengetriebene dagegen Black-Box-Frameworks. In diesem Zusammenhang wird auch von „Anpassungs-“ bzw. „aufrufenden“ (engl. calling) auf der einen und „Use-As-Is-“ bzw. „aufgerufenen“ (engl. called) Frameworks auf der anderen Seite gesprochen. Reale Frameworks sind in der Praxis normalerweise zwischen den Extremen angesiedelt und werden daher als „grau“ bezeichnet. 3.2 Multimedia-Frameworks Multimedia-Frameworks stellen Infrastruktur und Dienste für Multimedia-Anwendungen zur Verfügung. Dies umfasst [113]: • Performante und ressourcenschonende Wiedergabe von Multimediadaten verschiedener Typen: In jedem Multimedia-Bereich und in Abhängigkeit der betrachteten Plattform gibt es verschiedene Dateiformate, die mehr oder weniger etabliert sind. Neben der Unterscheidung zeitbasierter (kontinuierliche Medien, z.B. Video und Audio) und nicht zeitbasierter (diskrete Medien, z.B. Grafik, Text) Formate lässt sich weiterhin eine Einteilung in atomare (z.B. Bitmaps) und zusammengesetzte bzw. integrative (z.B. 40 3. Multimedia-Frameworks HTML, PDF) Datentypen vornehmen. Ein wichtiges Gütekriterium für MultimediaFrameworks sind die Menge und Art der unterstützten Dateiformate und die Möglichkeiten zur Konvertierung dieser Formate. Die Effizienz des Frameworks spielt eine ebenso wichtige Rolle. Diese hängt von vielen Faktoren ab, darunter dem Grad der Abstraktion, bzw. der Anzahl von Schichten zwischen Ausführungsebene und Hardware, und der verwendeten Transportarchitektur. Diese beruht üblicherweise auf einer hierarchischen Kombination von Modulen mehrerer Typen [28]: Quellen dienen der Eingabe von Datenströmen – also z.B. Module zum Einlesen von Videodateien – während Renderer mit der Ausgabe von Daten beschäftigt sind. Module, die auf den Multimediadaten arbeiten, werden als Transformatoren bezeichnet; letztere haben je mindestens einen Ein- und Ausgang. Die Modellierung solcher einzelner Geräte erfolgt mittels eines Datenflussgraphen, in dem die Geräte durch Knoten und Datenströme durch gerichtete Kanten dargestellt werden [100]. Datentransportarchitekturen lassen sich unterscheiden in Push- und Pullmodelle, je nachdem, ob der Produzent oder der Konsument den Transport initiiert. Die genauen Details der Umsetzung der Architektur bestimmen somit maßgeblich die Performanz des Frameworks. • Netzwerkfunktionalität & Streaming: Streaming erlaubt – auch lokal – die Echtzeit-Übertragung von Multimediadaten ohne vorheriges Laden der gesamten Datei. Dies spielt vor allem in zeitkritischen Applikationen wie Live-Übertragungen und Internet-Radio eine entscheidende Rolle, beinhaltet jedoch einen durch begrenzte und/oder schwankende Bandbreite begründeten Trade-Off zwischen Qualität, Robustheit und Datenmenge. Die Daten dieser zentralen Framework-Komponente werden dabei paketweise übertragen, um – in Verbindung mit geeigneten Protokollen – eine möglichst geringe Latenz zu gewährleisten. Darüber hinaus spielt der Umgang mit verlorenen Daten eine wichtige Rolle und sollte durch entsprechende QoS-Maßnahmen behandelt werden. Neben einer Unterstützung grundlegender Netzwerk-Protokolle wie HTTP ist vor allem die Unterstützung von Protokollen wie RTP (Realtime Transport Protocol) [88] oder RTSP (Realtime Streaming Protocol) [89] von Interesse, die speziell für den EchtzeitEinsatz in Multimedia-Szenarien entworfen wurden. Insbesondere die Verwendung möglichst effizienter und performanter Protokolle ist von Belang; so ist in realen Applikationen meist statt des Paket-quittierenden TCP das schnellere UDP-Protokoll implementiert, das keinerlei Garantien für das Ankommen versendeter Pakete gibt. Die daraus resultierende fehlende Fehlerkontrolle wird z.B. durch das aufsetzende RTPProtokoll in Form von Zeitstempeln und Sequenznummern gewährleistet, das durch RTCP (RTP Control Protocol) [88] um QoS-Funktionen wie Statusinformationen der Clients, Metadaten-Transport und eindeutige Teilnehmeridentifikation ergänzt wird. Neben punktweisen Unicast-Verbindungen existieren mit Broad- und MulticastKonzepten Ansätze, die komplexere Verbindungsstrukturen erlauben. In diesem Zusammenhang spielen vor allem Last-balancierende Konzepte wie IP-Multicast ein Rolle, die verfügbare Bandbreite weniger stark belasten. Auch der Einsatz von dynamischen Cachingtechnologien erlaubt eine Reduktion der Netzbeeinträchtigung [100]. • Synchronisation von Datenströmen: Dies beschreibt das Herstellen eines Gleichlaufes zwischen mehreren Prozessen zu integrativen Zwecken; so dürfen beispielsweise zusammengehörige Audio- und Videostream-Timecodes einer Fernsehübertragung nur um einen gewissen Betrag variieren, um nicht als fehlerhafte Darstellung wahrgenommen zu werden. Üblicherweise betrachtet man „weiche“ Synchronisationsanforderungen, die eine abstufbare Güte der 41 3. Multimedia-Frameworks Synchronizität verwenden. Dem zugrunde liegt die Erkenntnis, dass das Wahrnehmen von Asynchronizität problemspezifisch ist. Daraus resultierende Informationen beeinflussen daher die Anforderungen zu zeitlichen Auflösungen der MultimediaFrameworks. Steinmetz [100] zeigt dazu ausführliche Fallstudien aus verschiedenen Multimediabereichen und –Anwendungen, entsprechende maximale Versatzgrößen und Lösungsansätze, etwa durch QoS-Mechanismen, die der Anpassung von Puffergrößen und Latenzen dienen. • Bereitstellungen von Quality-of-Service(QoS)-Funktionen: Zur Garantie einer gewissen Dienstgüte werden Ressourcen durch dynamische Skalierung und Reservierung entsprechend gesteuert. Vorgaben betreffen z.B. EchtzeitAnforderungen, Korrektheit bzw. Fehlertoleranzen und garantierte Antwortzeiten. Üblicherweise sind diese nach dem ISO-Standard QoS oder weitergehenden Verfahren flexibel parametrisierbar und schichtweise implementiert [100]. Darüber hinaus werden Möglichkeiten zur Erkennung von und dem robusten adaptiven Umgang mit Fehlern gegeben, um wahrnehmbare Effekte zu vermeiden. Zusätzlich werden oft auch statistische Daten verfügbar gemacht. • Integration mit und Unabhängigkeit von Hardware: Dies wird möglich z.B. durch ein geeignetes Treibermodell und die Unterstützung von CPU-Multimedia-Erweiterungen. • Verwaltung von Framework-Komponenten: Üblicherweise erweitern Drittanbieter ein gegebenes Framework über eine standardisierte Plugin-Schnittstelle. Plugins sind im Allgemeinen kleine, portable Code-Objekte, die über einen definierten Registrierungs-Mechanismus in ein Framework integriert werden können und – ähnlich einer Bibliothek – ein oder mehrere Interfaces implementieren. Das Einbinden bzw. das Aufrufen des enthaltenen Codes findet dann über Funktionen des Frameworks statt, z.B. unter Verwendung eines Factory-Patterns. Beispiele für Plugins sind Audio-/Video-Codecs und Filter-Transformatoren. • Dienste für die Produktion von Multimediadaten: Bereitstellung von entsprechenden Werkzeugen und dokumentierten Schnittstellen, z.B. für das Capturing von Daten, also die Aufnahme eines Eingangsdatenstromes, mit entsprechender Dokumentation und automatischen Metadaten. • Rechtemanagement und Sicherheitsfunktionalität: Hierunter fällt neben einer Sicherheit gegenüber Angriffen durch kryptografische und konfiguratorische Maßnahmen auch Ausfallsicherheit in Form von Datensicherungsmechanismen, Threadsicherheit und Robustheit gegenüber z.B. fehlerhafter Hardware. Die rechtlichen Aspekte dagegen betreffen die Einhaltung von Copyright-Verfahren und damit verbundene Zugriffsbeschränkungen bzw. -rechte, Datenschutz & Anonymität, Funktionen zum Authenzitätsnachweis, Kryptoverfahren zur Vertraulichkeitseinhaltung und Integritätsprüfungen für Multimediadaten [100]. • Plattformunabhängigkeit: Bereitstellung standardisierter Komponenten und Schnittstellen. Ein höheres Maß an Plattformunabhängigkeit geht allerdings üblicherweise einher mit einer stärkeren Abstraktion und damit oft mit einer geringeren Performanz. 42 3. Multimedia-Frameworks • Medienserver-Funktionen: Speicherung und Verteilung multimedialer Daten, verbunden mit einem Verzeichnisdienst. Je nachdem, ob Client oder Server den Sendeprozess initiieren, spricht man von Pull- oder Push-Server. Pull-Server werden im Allgemeinen nur in LANs eingesetzt, Push-Server dagegen auch für Broad- oder Multicast-Dienste, z.B. im Internet. • Bereitstellung von Interfaces zur flexiblen Erweiterung: Neben High-Level-Ansätzen wie Skriptsprachen ist vor allem der systemweite objektorientierte Eingriff von der Möglichkeit z.B. neue Dateitypen hinzuzufügen bis hin zu Low-Level-Interfaces interessant. Neben der generellen Dokumentation verwendeter Interfaces ist dazu vor allem die Bereitstellung von Entwicklungspaketen (engl. Software Development Kit, SDK) von primärem Belang. 3.3 Aktuelle Multimedia-Frameworks Die große Marktbedeutung von Multimedia-Frameworks führt dazu, dass in den meisten kommerziellen Fällen die Software zum Abspielen (Player) kostenlos verfügbar ist, um eine starke Marktdurchdringung zu erlangen, die zur vollwertigen Produktion benötigten Versionen und Servereditionen jedoch dafür um so kostspieliger sind. Zwar existieren auch zahlreiche Multimedia-Frameworks, die wie z.B. MME [29], das an der Universität Zürich entwickelte MET++ [1], das Berkeley CMT [97] und Nsync [12] aus universitärem Kontext heraus oder wie Steinbergs VST-Technologie [123] oder Cycling 74 Max/Msp [26] zumindest teilweise kommerziell entwickelt wurden, im Folgenden soll jedoch lediglich eine Auswahl weit verbreiteter oder zumindest hinreichend komplexer MultimediaFrameworks genauer vorgestellt werden. 3.3.1 Quicktime Apple schuf mit Quicktime [7] 1991 als Erweiterung des eigenen Betriebssystems zur Behandlung zeitbasierter Daten die erste Streaming-Technologie, die heute in Form der stark weiterentwickelten Version 6 elementarer Bestandteil der aktuellen „OS X“-Systemarchitektur ist. Auf Quicktime basierende Software kann darüber hinaus auch für Windows und Java entwickelt werden. Zum umfassenden Funktionsumfang gehören unter anderem die Anzeige und Bearbeitung von Audio, Video, Grafik, Text, MIDI, Flash und VR-Panoramen sowie mehr als 250 unterstützter Dateiformate. Das enthaltene Streaming basiert auf der Unterstützung von HTTP, RTP, RTSP und 20 weiteren Netzwerkprotokollen und bekommt neben Broadcasting auch durch die ebenfalls enthaltene Funktionalität des Mobilfunk-Standards 3GPP zusätzliche Gewichtung. Die Quicktime-Architektur besteht aus einer Kombination flexibler Toolsets und PluginKomponenten in Form von über 2000 Funktionen. Zu diesen Toolsets gehören z.B. die grundlegende Movie Toolbox, die Streaming API und andere Toolsets zu jeweils abgegrenzten Funktionsbereichen wie Bildkompression und Videocapturing, die von Applikationen explizit aufgerufen oder bei Bedarf automatisch verwendet werden und über Callbacks mit diesen kommunizieren. Gleiches gilt für die Plugin-Komponenten, zu denen beispielsweise Handler für die einzelnen Medientypen, Standard-User-Interfaces, und Daten-Handler für verschiedene Arten von Datenquellen wie lokale Dateien, URLs oder Zeiger gehören. Jede Komponente wird dabei über einen je vierstellig repräsentierten Typ, Subtyp und Herstellercode identifiziert und über den Component Manager angesprochen. 43 3. Multimedia-Frameworks Applikation Movie NewMovieFromFile() Movie Toolbox DatenhandlerKomponente Movie-ImporterKomponente Videodatei Abbildung 3.2: Beispiel zur Quicktime-Architektur Im Beispiel aus Abbildung 3.2 fordert die Applikation die Movie Toolbox auf, eine bestimmte Datei zu öffnen. Die Toolbox verwendet daraufhin eine zum Dateiformat entsprechende Dateihandler-Komponente, um die Datei anzusprechen. Falls es sich bei der Datei nicht um eine (native) Quicktime-Videodatei handelt, wird unter Verwendung der zum Dateiformat passenden Movie-Importer-Komponente ein Movie-Objekt aus der Datei erzeugt. Dieses Objekt wird an die Applikation zurückgeliefert. 3.3.2 Java Media Framework Das Java Media Framework (JMF) [53] stellt als optional installierbarer Teil der Java Media API umfangreiche Funktionalität im Umgang mit zeitbasierten Daten bereit. Dies umfasst in der aktuellen Version 2 unter anderem Capturing, Datenverarbeitung, Streaming via RTP/RTCP und ein flexibles Plugin-Modell. Großer Vorteil der JMF-Architektur ist die zugrunde liegende Plattformunabhängigkeit mit gleichzeitiger Unterstützung der gängigen Dateiformate. Aus Performanzgründen steht sowohl eine plattformübergreifende Pure-Java-Variante als auch „Performance Packs“ mit nativem Code für verschiedene Plattformen bereit. JMF verwendet ein fundamentales Datenverarbeitungsmodell aus Eingabe-, Verarbeitungsund Ausgabeschicht mit den Schlüsselelementen Capturing Device/Data Source, Player/Processor und Data Sink, das über die Implementation von Interfaces mit Hilfe von sogenannten „Managern“ erweitert werden kann. JMF kennt vier verschiedene Typen von Managern, die ihre Daten mittels einer Registrierungsdatenbank verwalten: • Manager: Handhabt die Erzeugung von JMF-Klassen • PackageManager: Verwaltet verfügbare JMF-Klassen • CaptureDeviceManager: Verwaltet die verfügbaren Capturing-Geräte • PluginManager: Verwaltet verfügbare Plugins 44 3. Multimedia-Frameworks Java Applications, Applets, Beans JMF Presentation / Processing API JMF Plugin API Demultiplexer Codec Effect Multiplexer Renderer Abbildung 3.3: High-Level-Architektur von JMF Die Plugin-Architektur umfasst fünf verschiedene von der Player- oder der Processor-Klasse abgeleitete Typen: • Demultiplexer: Parsing und Zerlegung von Eingabeströmen, z.B. WAV-Daten; • Codec: (De-)Komprimierung und Konvertierung von Daten; • Effect : Spezialisierter Typ von Codec, der sonstige Transformationen durchführt; • Multiplexer: Vereinigung von Datenströmen, z.B. in ein MPEG-Format; • Renderer: Auslieferung von Daten; Plugins werden beim PluginManager unter Verwendung eines eindeutigen Bezeichners registriert, der üblicherweise einem umgekehrten Domain-Namen des Autors folgt, z.B. „COM.sun.java.MeinEffekt“. Hinzu kommen Angaben zu unterstützten Datenformaten. Sämtliche Objekte, z.B. Zeitstempel, von Controller-Objekten verwaltete Events, Datenblöcke und Objekteigenschaften werden ebenso über eine Hierarchie von Interfaces beschrieben und ausgelesen wie Medienrepräsentationen und -handler. Erweiterungen von JMF finden daher entweder per Plugin oder per direkter Implementation der Player-, Processor-, DataSource- oder DataSink-Interfaces statt. 3.3.3 Linux Der Stand der Entwicklung von Multimedia-Frameworks zeigt ein uneinheitliches Bild: Linux als Multiusersystem und nicht als Hochleistungssystem für Einzelrechner hat historisch einigen Rückstand zu den professionellen Multimedia-Frameworks anderer Betriebssystem und besitzt (noch) keinen Distributions-übergreifenden Standard. Deutlich wird dies anhand der Bestplatzierten in der Rubrik „Best Multimedia Framework“ des Linux New Media Award 2004 [60]: Die Wertungen der drei Gewinner JACK, GStreamer und SDL unterscheiden sich um nicht einmal 5%. JACK [51] ist ein auf dem populären ALSA-Audio-Treiber-Format [4] aufsetzender AudioServer mit geringer Latenz, der Streaming, Callbacks und Inter-Applikations-Kommunikation unterstützt. Das aus dem Umfeld des Gnome-Projekts heraus entstandene GStreamer [44] ist eine in Anlehnung an Microsofts nachfolgend erläutertes DirectShow-Framework entwickelte Streaming-Media-Architektur, die für In-Prozess-Konstruktion von Media-Pipelines konzipiert wurde und ein eigenes Modell zur Verwaltung von Plugins, hier GstElements genannt, beinhaltet. 45 3. Multimedia-Frameworks Abbildung 3.4: GStreamer-Pipeline zum Abspielen einer MP3-Datei Diese werden wie in Abbildung 3.4 dargestellt in Pipelines, also einer seriellen Verschaltung von Modulen, organisiert, indem die für den Austausch von Datenblöcken zuständigen Ein- bzw. Ausgabeinterfaces, Pads genannt, miteinander verbunden werden. GStreamer wurde als OpenSource-Projekt auch auf andere Plattformen portiert. Die Linux Simple Direct Layer (SDL) [61] schließlich ist ebenfalls plattformübergreifend und setzt unter Windows beispielsweise auf DirectX auf. Es unterstützt neben Audio auch Video, Ereignisbehandlung und ThreadingFunktionalität wie Semaphore und Mutex-Objekte. Es scheint etwas fragwürdig, in allen drei Fällen sowohl von Multimedia als auch Frameworks zu sprechen: JACK unterstützt lediglich AudioApplikationen und ist wie auch SDL wohl eher als Bibliothek denn als ein echtes Framework zu bezeichnen. 3.3.4 Helix / RealMedia Um ein vollwertiges Multimedia-Framework für Linux verfügbar zu machen, haben mit RedHat und Novell zwei führende Linux-Distributoren Pläne angekündigt [46], das aus dem kommerziellen Real-Player von Real Networks [86] heraus entwickelte plattformübergreifende Open-Source-Projekt Helix Player [46] zum Standard-Framework ihrer Distributionen zu machen. Helix ist ein auf über 1000 Interfaces und Methoden aufbauendes MultimediaFramework, bestehend aus den Elementen Helix DNA Server, Client und Producer, die Backend-, Player- und Authoring-Komponenten darstellen. Die Helix-Plattform unterstützt COM-basierte Plugins, Monitoring, QoS-Dienste, webbasierte Administration, Zugriffskontrolle, Caching und vor allem Streaming-Funktionalität, deren Güte durch z.B. das „loss protection“-System zur Rekonstruktion verlorener Frames sowie weitergehende Video-Filter und Audio-ResamplingRoutinen weiterentwickelt wurde. Neben HTTP und FTP werden RTSP (Realtime Streaming Protocol), das RTP Control Protocol (RTCP) für QoS-Zwecke und SDP (Session Description Protocol) zum Initiieren von Multimedia-Sessions verwendet, die ihrerseits auf TCP/IP bzw. UDP aufsetzen. Unterstützte Dateitypen sind neben RealAudio/-Video auch Apple QuickTime, MPEG-2, MPEG-4 und selbst Microsofts Windows Media Format. 3.3.5 Windows Media Windows Media ist eine Plattform für Erstellung, Transport und Distribution von digitalen Multimedia-Inhalten, die auf den in Abb. 3.5 dargestellten Komponenten beruht und in das Windows-Betriebssystem integriert ist. Aus letzterem ergibt sich zum einen ein großer Verbreitungsgrad und zum anderen eine für andere Frameworks kaum erreichbare Performanz. Gleiches gilt auch für die speziell zugeschnittenen Codecs, die – auch in Verbindung mit weiteren 46 3. Multimedia-Frameworks Applikationen & Inhalt Windows Media Plattform Server Player Codecs Encoder DRM SDK Windows-Betriebssystem Abbildung 3.5: Überblick über die Windows-Media-Plattform Merkmalen wie adaptiver Bitrate, Frame Smoothing und variabler Wiedergabe-Rate – sehr effizientes und komfortables Streaming durch die skalierbare Server-Komponente mittels HTTP, RTSP und dem Media Transfer Protocol (MTP) [66] erlauben. Die zum Streaming benötigten Elemente können ebenso kostenlos nachgerüstet werden wie der Encoder. Dieser generiert optional eine auf optimiertes Streaming ausgelegte ASF-Datei (Advanced Streaming Format), die den enkodierten Datenstrom in mehreren Qualitätsstufen enthält und auch HDTV-Ansprüchen moderner externer Multimedia-Geräte (mit entsprechend angepasstem Windows-Betriebssystem) genügt. Der Player bietet eine durch verschiedene Skins anpassbare Oberfläche und gibt sowohl gestreamte als auch andere Multimediadaten wieder, sogar in Surround-Audio bis 7.1 Kanälen. Fehlende Codecs werden – wenn möglich – automatisch nachgeladen. Die System-Architektur besitzt darüber hinaus ein Plugin-Modell für Player, Server und Encoder, das über ein SDK für eigene – im Vergleich zu anderen Frameworks allerdings eingeschränkte – Anforderungen, z.B. zur Synchronisation mit portablen Abspielgeräten oder für das digitale Rechtemanagement verwendet werden kann. Letzteres liegt allen Komponenten zugrunde, kann serverseitig in Echtzeit angepasst werden und erlaubt über ein eigenes Lizenzmodell fortschrittliche DRM-Operationen wie quantitativ beschränkte Abspielwiederholungen (engl. counted play), zeitliche Gültigkeitsbereiche und Restriktion bezüglich der weiteren Verwendung von Inhalten, z.B. bezüglich des Brennens auf CD oder den Transport auf portable Medien. Darüber hinaus bieten im Player integrierte QoS-Funktionen z.B. Feedback über Bandbreite, Mediennutzung und Paketverluste. 3.3.6 DirectX Microsoft DirectX [67] ist eine 1995 eingeführte performante Multimedia-Erweiterung des Windows-Betriebssystems, bestehend aus Low-Level-APIs für z.B. 2D- und 3D-Grafik, Soundeffekte und Musik, Eingabegeräte und vernetzte Applikationen. DirectX existiert aktuell in der Version 9 und bietet abstrakten Zugriff auf Hardware-Merkmale. Mit DirectShow ist eine Komponente zur Erstellung von Streaming-Media-Anwendungen enthalten, die umfassende Multimedia-Funktionalität und flexible Erweiterbarkeit bietet: Unterstützt werden grundsätzlich ebenso Wiedergabe und Capturing von Datenströmen gängiger Formate wie Konvertierungen und andere Transformationen. Der Funktionsumfang, z.B. vorhandene Netzwerk-Protokolle, hängt von den im System registrierten Plugins ab. Standardmäßig werden jedoch alle gängigen Anforderungen erfüllt. Da das im vierten Kapitel vorgestellte generische Monitoringsystem, das im Rahmen dieser Diplomarbeit entwickelt wurde, maßgeblich auf DirectShow aufbaut, sollen nachfolgend einige Teile des DirectX-Frameworks besonders hervorgehoben werden. DirectShow basiert maßgeblich auf dem Component Object Model (COM), das fester Bestandteil von Windows ist. Es besteht aus einer Menge von hierarchischen Interfaces sowie aus 47 3. Multimedia-Frameworks File Source AVI Splitter AVI Decompressor Video Renderer DirectSound Device Abbildung 3.6: Filtergraph-Struktur zum Abspielen einer AVI-Datei. Quell-, Transformatoren- und Rendererfilter sind unterschiedlich gefärbt. einigen zentralen COM-Komponenten und einer erweiterbaren Zahl von Plugins, hier Filter genannt. Diese werden mit Hilfe der wichtigsten Komponente, des Filtergraphen, entweder automatisch oder gezielt miteinander verbunden und bilden so einen Datenflussgraphen. Der Filtergraph kontrolliert darüber hinaus sämtliche den Graphen betreffenden Belange, z.B. Synchronisationsfunktionen oder Anfragen der Applikationen bezüglich einer KontrollKomponente für bestimmte Wiedergabe-Merkmale. Filter sind ebenfalls COM-Komponenten, die das CBaseFilter-Interface implementieren und anhand ihrer definierten GUID (Global Unique Identifier, ein unter COM verwendeter kurzer Textstring zur Identifikation z.B. eines Filters, Interfaces oder Datentyps) im System identifiziert, registriert und verwaltet werden. Zur Verbindung mit anderen Filtern besitzt jedes Filter besondere Teilobjekte, genannt Pins, die sich in Ein- und Ausgangspins unterteilen lassen und mittels in Interfaces veröffentlichten Methoden zu Format- und Typeigenschaften ihre Verbindbarkeit mit Pins anderer Filter abstimmen. Pins sind auch für den Datentransport verantwortlich, indem sie gestreamte Datenblöcke von einem Ausgangspin an einen Eingangspin weiterreichen und somit von einem Filter zum nächsten übertragen. Es gibt drei Grundtypen von Filtern, die eine entsprechend ihrem Typ verschiedene Anzahl von Ein- und Ausgangspins besitzen: Quellfilter, Transformatoren und Renderer. Quellfilter dienen der Eingabe von Datenströmen und haben daher nur einen Ausgangspin. Dazu gehören z.B. Capturing-Filter und Filter zum Lesen in Dateien. Transformatoren verändern und verteilen Daten und verfügen daher über mindestens je einen Ein- und Ausgangspin. Renderer schließlich besitzen nur einen Eingangspin und handhaben die Ausgabe des Datenstroms, z.B. durch Schreiben in eine Datei oder die Weitergabe an Audio- oder Videotreiberinstanzen. In Abbildung 3.6 ist ein Beispiel-Filtergraph mit den enthaltenen Filtern dargestellt. Durch ein von Microsoft bereit gestelltes SDK ist es sowohl möglich, DirectShow um neue Filter zu erweitern als auch bestehende Filter in eigenen Applikationen zu verwenden. Diese flexible Erweiterbarkeit kann dazu genutzt werden, Quellfilter für neue Dateiformate zu entwickeln, andere Abspielmechanismen zu implementieren oder den Datenfluss vollständig zu ändern. Auch die Erstellung grundsätzlich neuer Filtertypen ist möglich. Grundlage der Filter-Entwicklung sind bestimmte Identifikationsangaben, die Implementierung von DirectShow-Interfaces und die Kompilierung als Windows-DLL. Zur Verwendung muss der im Allgemeinen kleine Filter auf dem Ziel-Betriebssystem registriert werden. Aufgaben wie Abspielkontrolle und der Seeking genannte Vorgang zur wahlfreien Neupositionierung des in Quellfiltern enthaltenen Zeigers auf die aktuelle Position können über weitere zentrale COM-Komponenten durchgeführt werden. Manche dieser Operationen setzen allerdings das Vorhandensein einer Implementation bestimmter Interfaces jedes im Graphen enthaltenen Filters voraus. DirectX bietet darüber hinaus weitere, meist in COM-Objekte/-Schnittstellen verpackte Funktionalität wie erweiterte Synchronisations- und Debuggingmechanismen, die auch in Verbindung mit DirectShow verwendet werden können. Ein Nachteil von DirectX ist das Fehlen weitergehender QoS-Funktionen. Zwar ist DirectX bisher nur für Windows verfügbar, das mittlerweile in Cedega umbenannte WineX-Projekt [24] stellt eine Portierung von DirectX für Linux zur Verfügung, die z.B. von Spieleentwicklern zahlreich genutzt wird, um populäre Titel auch unter Linux verfügbar zu machen. 48 3. Multimedia-Frameworks Abschließend soll auf ein weiteres Multimedia-Framework eingegangen werden, dessen Umsetzung allerdings erst noch bevorsteht, aufgrund der enthaltenen Konzepte jedoch in die hier vorgelegte Aufzählung gehört: 3.3.7 MPEG-21 Ziel des MPEG-21-Standards [71] ist die Schaffung einer vereinheitlichten Infrastruktur für Multimedia-Kommunikation und –Dienstleistungen, die allen Produzenten, Distributoren und Benutzern gleichberechtigt Homogenität, Transparenz und Kompatibilität bieten soll. MPEG-21 beruht auf zwei Konzepten, nämlich dem fundamentalen Digital Item, einem strukturierten digitalen Objekt mit einer Standardrepräsentation und Metadaten, sowie der darauf aufbauenden Menge von Benutzerinteraktionen, die Erzeugung, Austausch, Transport, Verarbeitung, Konsumierung, Handel und sonstige Manipulationen des Objektes umfasst. Um dies zu ermöglichen, muss das Digital Item genau identifiziert, beschrieben, verwaltet und geschützt werden. Dies setzt eine Standardisierung sämtlicher verwendeter Komponenten, auf Interfaces fußende Inhalts-Definitionen von Syntax und Semantik sowie die Beschreibungen enthaltener Beziehungen voraus. Das MPEG-21-Framework basiert daher grundsätzlich auf sieben Schlüsselelementen: • Digital Item Declaration: Einheitliche Abstraktion zur Definition von Digital Items • Digital Item Identification and Description: Mechanismen zur Identifikation und Beschreibung • Content Handling and Usage: Benutzerinteraktionen • Intellectual Property Management and Protection: Rechteverwaltung • Terminals and Networks: Transparenz gegenüber dem Transportmedium • Content Representation: Darstellung der Inhalte • Event Reporting: Performanzmessung Interfaces und Protokolle für sämtliche MPEG-21-Benutzer werden nicht in Kategorien wie etwa Produzent eingeteilt, sondern individuell anhand ihrer Beziehungen zu anderen Benutzern identifiziert. Die sich durch eine solche Standardisierung eröffnenden Möglichkeiten sind offensichtlich so weitreichend, dass der gesamte Multimedia-Markt maßgeblich davon betroffen sein dürfte, vom Privatanwender über Internethandel bis zu digitalem Fernsehen. Nachdem in diesem und dem vorigen Kapitel die Grundlagen dafür gelegt wurden, soll im nun folgenden zentralen vierten Kapitel das entwickelte generische Monitoringsystem für akustische Datenströme konzeptionell vorgestellt werden. 49 Kapitel 4 Entwurf des GenMAD-Systems Vorgegebenes Ziel der vorliegenden Diplomarbeit ist die Konzeption, Realisierung und erste Evaluation eines generischen Monitoringsystems für akustische Datenströme. Das System soll in der Lage sein, unter Verwendung einer oder mehrerer Eingangsaudiodatenströme eine frei konfigurierbare Signalfluss-Verschaltung zu ermöglichen, wobei Verarbeitungsergebnisse geeignet visualisiert und als formatierte Datei ausgegeben werden können sollen. Dies beinhaltet die folgenden Aspekte: • Verarbeitung von On- und Offline-Eingangsdatenströmen, d.h. sowohl in Echtzeit eingehende als auch in Dateien gespeicherte Audiodaten. • Erstellung eines geeigneten Plugin-Konzeptes mit möglichst universeller, für Nachfolgearbeiten gut zugänglicher Schnittstelle, um Signalverarbeitungsmodule in das System einbinden zu können. Unterstützt werden sollen zwei Signaltypen: Zum einen „herkömmliche“ zeitbasierte Daten x : Z → X äquidistanter Abtastung mit impliziter Zeitachse, zum anderen durch Ereignismengen x ⊆ Z × X modellierte nicht-äquidistant abgetastete Signale, deren Tupel die Angabe eines expliziten Zeitpunktes t ∈ Z enthalten. Letztere sind z.B. als Ausgabe von Identifikations- oder Klassifikationsmodulen zu verstehen und werden nachfolgend als Events bezeichnet. • Die Plugins müssen durch den Benutzer geeignet konfigurierbar sein und in einer beliebigen Kaskadierung verwendet werden können. Darüber hinaus muss ein Parameterabgleich verbundener Plugins jenseits reiner Signaldaten möglich sein. • Das eingesetzte Streamingmodell muss in der Lage sein, jedem Plugin die zu bearbeitenden Daten paketweise und mit einer geeigneten Paketlänge anzubieten. • Mitschneiden sowohl der Audiosignaldaten als auch der Eventdaten eines Plugins in einer separaten, geeignet formatierten Datei sollen möglich sein. • Visualisierungskomponenten für beide Signaltypen sind erforderlich. • Exemplarische Plugin-Umsetzung eines von der betreuenden Arbeitsgruppe MultimediaSignalverarbeitung bereitgestellten Audioidentifikations-Algorithmus und eines eigenen Klassifikators, zur Unterscheidung eines Signalausschnitts in die Klassen Sprache, Musik, Stille und Sonstiges. 50 4. Entwurf des GenMAD-Systems • Zu implementieren sind Methoden zur geeigneten linearen Kombination von Datenströmen mehrerer Plugins, etwa zur Behandlung widersprüchlicher Identifikationen. • Durchzuführen ist ein Test des Systems anhand der Analyse von Radiosendungen. • Das System soll unter Windows 2000 lauffähig und in MS Visual Studio 6 kompilierbar sein. 4.1 Verwandte Ansätze & Motivation Es existieren, wie in Abschnitt 2.7 erläutert, zahlreiche Audiomonitoring-Systeme verschiedenster Art. Diese haben jedoch gemein, dass sie jeweils auf einen speziellen Zweck hin entwickelt wurden. Dabei kann es sich um so verschiedene Ansätze wie das Verkehrsüberwachungssystem von Nooralahiyan et al. [80], das von Kurth und Scherzer entwickelte Sentinel-System [58] oder ein kommerziell zur Überwachung von Radiostationen eingesetztes System handeln. Jedes dieser Systeme setzt auf einer bestimmten Monitoringtechnik auf und verwendet eine eigens für diesen Fall entworfene Anwendungsschicht, etwa zur Bereitstellung von Visualisierungs- und Interaktionsfunktionalität. Diese Spezialisierung ist um so erstaunlicher, als die meisten Audioidentifikations- und Klassifikationsverfahren aufgrund ihrer verschiedenartigen Herkunft bestimmte Anwendungsszenarien und Umgebungsparameter besitzen, in denen sie sich durch besondere Güte auszeichnen, sei es bezüglich Robustheit, Performanz oder Effektivität. In anderen Szenarien dagegen können viele weniger überzeugen, da sie nicht universell einsetzbar sind. Die Verschiedenheit der Systeme erschwert darüber hinaus die Einarbeitung und schränkt dadurch einen effektiven Wissensaustausch ein, was die Entwicklung von Lösungen für den Markt verlangsamt. Sicherlich spielen dabei in einigen Fällen kommerzielle Strategien eine Rolle. Hinzu kommt das in anderen Ansätzen auffällige Fehlen von eingebundenen Standards wie populären Plugin-Schnittstellen. Ein mit diesen Schnittstellen ausgestattetes System profitiert zum einen von einer solchen Erweiterbarkeit, zum anderen kann es aus einer, je nach Standard verschieden großen, Menge existierender Algorithmen schöpfen, um eine qualitative Verbesserung der enthaltenen Routinen, z.B. im Bereich der Vorverarbeitung, zu erreichen und dem Anwender mehr Handlungsspielraum zum experimentellen Verwenden neuartiger Ansätze zu geben. Eine Möglichkeit des generischen Audiomonitorings unter Verwendung solcher Plugins besteht in der Zweckentfremdung bestehender Applikationen aus dem professionellen AudioBereich. Dazu bieten sich vor allem sogenannte Digital Audio Workstations wie Steinbergs Cubase [123] oder das von Apple entwickelte Logic [6] an, die neben einer Unterstützung zeitbasierter Audiosignale auch nicht-äquidistante, Event-basierte Daten in Form des MIDI-Formates [68] verarbeiten können. Sie verfügen über eine große Flexibilität bei der Verschaltung von signalverarbeitenden Modulen, einen großen Funktionsumfang für das Arbeiten mit Audiodaten und Ansätze zur Visualisierung der beiden genannten Signaltypen. Noch tiefere Veränderungen ermöglicht das von Native Instruments [78] entwickelte Reaktor, welches ein vollständig modulares System zur Verarbeitung und Synthese von Audiodaten darstellt. Die Anforderungen für die Arbeit mit eventbasierten Identifikationsdaten überfordern jedoch die Flexibilität derzeit bestehender Systeme. Das von Tzanetakis et al. entwickelte MARSYAS-System [64, 106] ist kein AudiomonitoringFramework, sondern ein Framework für Entwicklung und Test von Algorithmen zur Audioanalyse und -Synthese, bietet jedoch durch die verwendete Client/Server-Struktur und den 51 4. Entwurf des GenMAD-Systems freien Zugang die Möglichkeit zur Erweiterung auf Monitoringmechanismen. Enthalten sind neben frameworkartigen Möglichkeiten zu Verschaltung und Manipulation von Datenströmen auch Hilfsmittel z.B. zur Klassifikation von Musikstücken. Zusammen mit anderen Veröffentlichungen des Autors, vor allem zur Echtzeit-Visualisierung von Klassifikationsergebnissen [105], verspricht dieses System einen interessanten Ansatz. MARSYAS befindet sich allerdings noch in einem frühen Entwicklungszustand und verfügt nicht über Mittel, um Monitoring oder andere Visualisierungen performant zu gewährleisten. Die vorliegende Arbeit erhebt zwar nicht den Anspruch, einen Standard schaffen zu wollen, sie möchte aber die Vorteile eines solchen noch zu schaffenden Standards aufzeigen. In diesem Sinne wird nachfolgend das im Rahmen der vorliegenden Diplomarbeit entwickelte GenMADKonzept vorgestellt, das eine flexible Verschaltung von Multimediadaten verarbeitenden Modulen verschiedenster Herkunft mit Mechanismen zur Handhabung und Visualisierung von Eventdaten anbietet. Im Gegensatz zu bisherigen Arbeiten auf diesem Gebiet erlaubt GenMAD die einfache Verwendung beliebiger akustischer Monitoring-Algorithmen über ein klar definiertes Software Development Kit (SDK) und stellt daher ein generisches Monitoringsystem für akustische Datenströme dar. 4.1.1 Wahl des Multimedia-Frameworks Da GenMAD verschiedenartige Monitoring-Verfahren unterstützen soll, spielt die Wahl des ihm zugrunde liegenden Multimedia-Frameworks eine zentrale Rolle. Die maßgeblichen Entscheidungsgründe sind daher nachfolgend aufgeführt: Das entwickelte Konzept basiert auf DirectShow, da nur dieses – im Gegensatz zu den anderen in Abschnitt 3.3 vorgestellten Multimedia-Frameworks – sowohl unter Visual Studio 6 kompilierbar ist als auch hinreichend tiefen Eingriff in das Framework erlaubt. Im Gegensatz zu einem vollständig eigenen Ansatz ohne ein zugrunde liegendes Multimedia-Framework bietet der verwendete Ansatz folgende Vorteile, vor allem in Anbetracht der begrenzt zur Verfügung stehenden Entwicklungszeit: • Neben dem von Steinberg [123] entwickelten VST-Plugin-Format stellen DirectX-Plugins den zweiten wichtigen De-Facto-Standard unter Windows dar. Dies resultiert in einer großer Anzahl und Verschiedenheit existierender DirectX-Plugins, darunter hochqualitativen Filtern und andere Signalverarbeitungseffekten, die z.B. als Teil der Vorverarbeitungskette eines Identifikationsmoduls eine für eigene Entwicklungen nicht leistbare Qualität bieten können. Darüber hinaus ist auf diesem Weg auch ein problemloser Zugriff auf zukünftig entwickelte Algorithmen möglich. Hinzu kommen visuelle Analysemodule, die einen Echtzeit-Einblick z.B. in Form eines Spektrometers erlauben. Siehe z.B. [30] für eine Auswahl von DirectX-Filtern. • DirectX besitzt eine durch seine zehnjährige Entwicklungsgeschichte, die enge Verzahnung mit dem Windows-Betriebssystem und den immensen Verbreitungsgrad begründeten Entwicklungsvorsprung hohe Performanz, die einhergeht mit in zahlreichen komplexen Projekten eingehend getesteter Stabilität. • Das Aufsetzen auf den DirectX-Standard statt auf eine proprietäre Lösung führt zu weiteren Vorteilen: So wird, obwohl dies keineswegs Voraussetzung ist, die Einarbeitung bei vorhandenem Wissen um DirectX erleichtert, das stabile COM-Grundgerüst reduziert die Menge potentiell enthaltener Fehler um eine entscheidende Schicht und das kostenlos bereitgestellte SDK erlaubt, auch durch seine gute Dokumentation, eine leichte und tiefgehende Erweiterung. 52 4. Entwurf des GenMAD-Systems • Über das Cedega-Projekt [24] ließe sich in Zukunft auch eine Portierung des Systems nach Linux gestalten, wobei der Funktionsumfang dies derzeit noch nicht erlaubt. • Die unter anderem durch das WDM-Treibermodell in DirectX enthaltene Abstraktion von der Hardware-Ebene erlaubt den Zugriff auf spezielle Hardware-Fähigkeiten wie z.B. extern konfigurierbare Capturing-Treiber mit erweitertem Funktionsumfang, die über Plugins verfügbar gemacht wurden. • Der durch DirectShow bereitgestellte große Funktionsumfang umfasst auch den Zugriff auf via Internet verfügbare Dateien, die durch die Angabe ihrer URL wie lokale Dateien transparent gestreamt werden können. Weitere Möglichkeiten betreffen sowohl die Konfiguration und die Automation von Plugin-Parametern als auch erweiterte Kontrollmechanismen wie etwa ein durch Interpolation der Quelldaten mögliches Echtzeit-Skalieren der Abspielgeschwindigkeit. 4.2 Das GenMAD-System Das hier entwickelte GenMAD-System (Generisches Monitoringsystem für Akustische Datenströme) besteht wie in Abbildung 4.1 dargestellt aus zwei fundamentalen Komponenten, die über zwei Schnittstellen miteinander kommunizieren: Zum einen aus der Host-Applikation, zum anderen aus Filtern, die in einem Datenflussgraphen miteinander verbunden sind. Diese beiden Komponenten kommunizieren über Schnittstellen miteinander: Die GenMADApplikation implementiert das IMonitoringMaster-, Filter das IMonitoringSlave-Interface. Wie in der Abbildung gezeigt, kann der Graph auch Filter enthalten, die von Dritten entwickelt wurden und nur dem Signalfluss dienen. Diejenigen Filter, die das IMonitoringSlave-Interface implementieren und somit Monitoring-Funktionen unterstützen, sind – wie auch in der später erläuterten visuellen Oberfläche von GenMAD – durch weiße Schrift auf dunklem Hintergrund markiert; hier mit B und C. GenMAD kommuniziert darüber hinaus über separate Schnittstellen mit dem Datenflussgraphen und somit allen darin enthaltenen Filtern. Im Folgenden wird die Applikation kurz als GenMAD bezeichnet, das Gesamtsystem als GenMAD-System. 4.2.1 Grundlegendes Konzept des GenMAD-Systems Wichtigstes Element von GenMAD ist der Datenflussgraph. Dieser ist ein gerichteter, azyklischer Graph und besteht aus einer Menge miteinander verbundener Module, genannt Filter, die verschiedene Signalverarbeitungsoperationen durchführen können. In GenMAD werden zwei Typen von diskreten Signaldaten unterstützt. Zum einen Signalelemente dAudio einer Audiodatenemenge DAudio:={f | f: ZlR}. Die Audiodatenelemente sind von der Form dAudio: ZlR , dAudio ⊆ DAudio, und ordnen einem Zeitpunkt einen reellen Wert zu. Die Differenz der Zeitpunkte zweier Audiodatenelemente entspricht stets dem Mehrfachen einer festen – als Abtastrate bezeichenten – Frequenz fA. In GenMAD werden jedoch nur endliche Signale f :[a : b]lR, b − a + 1 = N , verarbeitet, die in sogenannten Puffern pi der Länge Len(pi) := N gespeichert werden. Ein Puffer pi ist ein Tupel aus einem einfachen Vektor und einem Zeitstempel: pi ∈ RN × Z mit einer Zeitdauer von N/fA Sekunden. Der Zeitstempel eines Puffers wird über Zeit : RN × ZlZ zurückgeliefert. Die Folge der Puffer wird als Datenstrom bezeichnet. 53 4. Entwurf des GenMAD-Systems Datenflussgraph A D B C IMonitoringSlave IMonitoringMaster GenMAD Abbildung 4.1: Schema des GenMAD-Systems Daneben werden auch sogenannte Eventdaten dEvent einer Eventmenge DEvent := Z × E unterstützt, die eine explizite Zeitangabe enthalten, dEvent ⊆ DEvent. E wiederum ist ein 10-Tupel, welches Informationen zu einem Ereignis enthält. Die Zeitangabe wird ebenfalls über Zeit : Z × E lZ zurückgeliefert. Eventdatenelemente sind im Gegensatz zu Audiodaten zeitlich unabhängig voneinander. Trotzdem werden aufeinander folgende Eventdaten ebenfalls als Datenstrom bezeichnet, um eine einheitliche Beschreibung zu gewährleisten. Um Aussagen zu ermöglichen, die wahlweise einen der beiden Datentypen betreffen, kann die folgende Menge verwendet werden: DT={Audio, Event}. Es sei darauf hingewiesen, dass in GenMAD verwendete Filter fremder Anbieter weitere Datentypen unterstützen können. Dieses können jedoch nicht von GenMAD-Filtern verarbeitet werden, sondern müssen ggf. in einen der beiden genannten Datentypen transformiert werden. Das i-te GenMAD-Filter im Datenflussgraphen kann wie folgt modelliert werden: Fi : ( D Audio ) k A × ( D Event ) k E1 → ( D Audio ) k A × ( D Event ) k E 2 Dabei sind kA ∈ {0, 1} und kE1, kE2 ∈ {0, 1, 2} die (Ein- bzw. Ausgangs-) (Audio- respektive Event-)Verbindungskardinalitäten. Die i-te Eingangs- bzw. Ausgangs-Verbindungskardinalität vom Typ T ∈ DT eines Filters F lässt sich wie folgt ermitteln: EinT,i(F) bzw. AusT,i(F). Die zweite Ausgangs-Event-Verbindungskardinalität des Filters F2 beispielsweise ist AusEvent,2(F2). Im Fall des Audiodatentyps kann der i-Index auch weggelassen werden, da die entsprechende Verbindungskardinalität kA wie eben definiert höchtens eins ist. Die über alle Typen und Indizes kumulierte Ein- bzw. Ausgangs-Verbindungskardinalität eines Filters F wird mit Ein(F) bzw. Aus(F) bezeichnet. Entsprechend liefern EinEvent(F) bzw. AusEvent(F) die kumulierte Eingangs- bzw. Ausgangs-Verbindungskardinalität des Typs Event. Bezeichne F(dA, dE)Audio die Projektion auf die Audiodatentyp-Komponente und F(dA, dE)Event,i die Projektion auf die i-te Eventdatentyp-Komponente der Ausgabe eines Filter F mit den Eingaben dA, dE. Ist die entsprechende Verbindungskardinalität AusT,i(F) = 0, dann gilt mit T ∈ DT : F(dA, dE)T,i = {}. Nun lässt sich die Ausgabe eines Filters F1, das über einen Audiodatenstrom mit F2 und über Eventdaten mit F3 verbunden ist, folgendermaßen darstellen (wobei die Eingaben dem obigen Muster folgen): F1 ( F2 (d Audio1 , d Event1 ) Audio , F3 (d Audio 2 , d Event 2 ) Event ,i ) 54 4. Entwurf des GenMAD-Systems Auf diese Weise lassen sich auch komplexe Filter-Verschaltungen darstellen. Ist die Ausgabe eines Filters F1 die Eingabe eines anderen Filters F2 – wobei die Datentypen von Ein- und Ausgabe übereinstimmen müssen -, so nennt man die beiden Filter verbunden und spricht von einem Datenfluss oder Datentransport von F1 zu F2. Allerdings darf wegen der Kausalität des Graphen für jeden Index i jeden Typs T ∈ DT die Ausgabe eines Filter nur Eingabe für einen einzigen Filter im Graph sein. Dies schließt insbesondere, da der Graph azyklisch ist, die Möglichkeit aus, dass die Ausgabe eines Filter direkt oder indirekt Teil der eigenen Eingabe ist. Filter gibt es darüber hinaus in verschiedenen Typen. Die grundsätzlichste Unterteilung in drei Filterklassen leitet sich direkt aus den jeweiligen Ein- und Ausgangsverbindungs-Kardinalitäten ab. Quellfilter sind Filter mit Ein( F ) = 0 , Rendererfilter diejenigen, für die gilt: Aus ( F ) = 0 . Als Transformatorfilter werden dagegen alle Filter F bezeichnet, für die Ein( F ) ≥ 1 und Aus ( F ) ≥ 1 gelten. Ein Filter mit Ein( F ) + Aus ( F ) = 0 ist nicht möglich. Da Rendererfilter keine Ausgabe und Quellfilter keine Eingabe besitzen, ergibt sich ein Datenfluss von den im Graph vorhandenen Quell- über die Transformator- zu den Rendererfiltern. Ein Graph ist darüber hinaus erst dann vollständig und somit funktionsfähig, wenn sich mindestens ein Quell- und ein Rendererfilter darin befindet. Aufgrund ihrer Besonderheit sind es auch diese beiden Filtertypen, die den Datenfluss im Graphen grundsätzlich kontrollieren: Quellfilter initiieren den Fluss, während Rendererfilter ihn blockieren können. Daher setzt die durch den Benutzer beeinflussbare Datenflusskontrolle letztlich an genau diesen beiden Enden des Datenflussgraphen an. Eng damit verwandt ist die Datensynchronität: Es muss gewährleistet sein, dass zu jedem Zeitpunkt t ∈ Z alle Datenelemente d mit Zeit(d) ≥ t an die Rendererfilter übergeben wurden. Dazu werden zwei Mechanismen kombiniert: Zum einen wird von (insbesondere Audiodaten verarbeitenden) Filtern erwartet, dass sie in Echtzeit und nach dem FIFO-Prinzip (First In, First Out) arbeiten, d.h. dass die Zeit zum Verarbeiten eines Puffers p durch das Filter F kleiner als die im Puffer enthaltene Zeitdauer ist, und dass eingehende Daten vollständig verarbeitet werden, bevor neue Daten angenommen werden. Zum anderen haben alle Filter Zugriff auf eine Referenzuhr RefClock ∈ Z, um so Zeitstempel von Datenströmen mit der Referenzzeit vergleichen zu können. Da die Ein- und Ausgangsverbindungskardinalität für Audiodaten höchtens eins ist, betrifft das Problem der Datensynchronisierung von Transformatorfiltern nur Filter mit einer EventEingangsverbindungskardinalität von zwei. Die Synchronisierung kann in diesem Fall über die Zeitstempel der Eventdatenelemente gewährleistet werden. Aus der Definition der drei Grundfiltertypen ergibt sich die Möglichkeit, die miteinander verbundenen Filter des Datenflussgraphen als gerichteten Graphen darzustellen. Dabei wird jedes Filter durch einen Knoten repräsentiert. Quellfilter stellen die Wurzelknoten dar, Transformatorfilter die inneren Knoten und Rendererfilter die Blätter. Falls zwei Filter F1, F2 miteinander verbunden sind, wird dies durch eine gerichtete Kante zwischen den Filtern dargestellt, und an jedem der beiden Kantenenden wird der entsprechende Typ T ∈ DT und ggf. der Index vermerkt, der für den Filter die Verbindung markiert. Ein solcher Beispielgraph ist in Abbildung 4.2 abgebildet. Transformatorfilter lassen sich – bezogen auf ihren Einsatz in GenMAD – noch weiter typisieren, wobei in besonderen Fällen Filter mehreren Typen entsprechen können: Gilt für ein Filter F und T ∈ DT : EinT(F) > AusT(F) > 0, so spricht man von einem Kombinator, im entgegengesetzten Fall 0 < EinT(F) < AusT(F) von einem Splitter. Gilt dagegen EinEvent(F) = AusEvent(F) und EinAudio(F) = AusAudio(F), so wird F Verarbeitungsfilter genannt. Für Generatoren gilt 0 = EinT(F) < AusT(F), für Konsumenten EinT(F) > AusT(F) = 0. Das in Abbildung 4.2 gezeigte Filter F2 etwa ist nach dieser Definition ein Generator, F5 dagegen ein Kombinator. 55 4. Entwurf des GenMAD-Systems F1 F4 Event, 1 Audio Audio F2 Event, 1 Audio Event, 1 Event, 2 F5 Event, 1 Audio F3 Event, 1 F6 Abb. 4.2: Beispielgraph Transformatorfilter können also vielfältige Aufgaben besitzen: Datenströme vereinen, verteilen, verändern, erzeugen oder zerstören. Erst durch diese Fähigkeiten wird ein maximal flexibles Arbeiten in GenMAD ermöglicht. Wie in Kapitel 5 erläutert, wurde im Rahmen dieser Arbeit eine Reihe verschiedener Transformatortypen konzipiert und umgesetzt. Wie erwähnt, stellt neben der umfangreichen und flexiblen Manipulation des Datenflussgraphen die Datenvisualisierung eine zentrale GenMAD-Funktionalität dar. Da dies das Verwenden der Datenströme des Datenflussgraphen erfordert, wurde das Konzept des Visualisierungsfilters erstellt, das als Splitterfilter auch die GenMAD-Applikation zu einer Art abstraktem Rendererfilter macht und auf diese Weise eine echtzeitfähige und effiziente Visualisierung ermöglicht. 4.2.2 Zentrale Aspekte der GenMAD-Applikation Primäre Ziele des GenMAD-Konzeptes sind: • Bereitstellung einer grafischen Oberfläche zur visuellen Erstellung und Editierung eines Datenflussgraphen aus DirectX-Filtern • Kommunikation mit und Konfiguration von Filtern • Abspiel- und Transportkontrolle mit Fehlerbehandlung • Projektzentriertes Arbeiten mit Möglichkeiten zum Laden/Speichern des aktuellen Datenflussgraphen • Bereitstellung einer geeigneten, konfigurierbaren Echtzeit-Visualisierung von Audio- und Eventdaten mehrerer Filter 56 4. Entwurf des GenMAD-Systems Visualisierung und Konfiguration Ereignisbehandlung und Systemkontrolle DirectShow-Kommunikation und -Modellierung Abbildung 4.3: Schicht-Aufbau von GenMAD Dazu werden die verschiedenen Aufgabenbereich möglichst klar in Klassen und diese abstrakt in Schichten getrennt. Dieser Schicht-Aufbau ist in Abbildung 4.3 dargestellt und erleichtert zum einen die Übersicht und somit die Erweiterbarkeit und das Debugging der Implementierung, zum anderen dient es durch das Ausführen in verschiedenen Threads und die Zugriffskontrolle (private, geschützte und öffentliche Methoden und Eigenschaften) der Robustheit bzw. Laufzeitsicherheit der Anwendung. Die Tiefe einer Schicht ergibt sich durch die Nähe zum DirectShow-Framework bzw. zu Applikations-basierenden Funktionen, etwa zur grundlegenden Ereignisbehandlung oder zur Erzeugung von Fensterobjekten. Dies geht nicht unbedingt einher mit einer abstrakteren Sicht (engl. scope) der Klassen, sondern eher mit einem abstrakteren Aufgabenbereich: Die enge Verzahnung mit DirectShow und das Ziel einer möglichst ressourcenschonenden und effizienten Anwendung impliziert zum einen Klassen, die sich über mehrere Schichten erstrecken und zum anderen auch in höheren Schichten wie der Visualisierung den Umgang auch mit nur rudimentär aufbereiteten Signaldaten. In der tiefsten Schicht findet die direkte Kommunikation mit DirectShow-Komponenten statt. Die zentrale DirectShow-Komponente GraphBuilder wird ebenso durch eine Klasse gekapselt wie Filter und Pins. Um eine erweiterte Kommunikation mit den Filtern zu ermöglichen, ist in dieser Schicht auch die Implementation des IMonitoringMaster-Interfaces angesiedelt. Dies erlaubt eine geeignete Modellierung der von DirectShow bereitgestellten Funktionen zur ObjektErzeugung und –Kontrolle von Filtern und anderen Klassen und schafft somit die grundlegende GenMAD-Schicht, auf der eigene Funktionsschichten aufgesetzt werden können. Auf dieser Schicht baut eine Ebene zur Behandlung von systemweiten Ereignissen und zur Kontrolle von Transportfunktionen auf. Diese stellen durch das Verwenden sowohl betriebssystemnaher als auch DirectShow-bezogener Funktionen tieferer Klassen und die Delegierung abstrakterer Klassen die Vermittlungsschicht von GenMAD dar. Auf der obersten Ebene finden sich Klassen, die verschiedene Visualisierungssichten auf die beiden grundlegenden Signaltypen erlauben. Auch die visuelle Konfiguration und Anordnung von Filtern findet hier statt. Die aufgabenspezifische Kommunikation von GenMAD mit den Filtern spielt eine zentrale Rolle im hier vorgestellten Konzept. Dies umfasst neben generellen Objekt-Kontrollmechanismen vor allem die über das IMonitoringMaster-Interface eingeführten Methoden, die nicht von DirectShow abgedeckte oder anwendungsspezifische Funktionalität bereitstellen. Dazu gehören folgende Funktionsbereiche: • Abstimmung von Filter-Parametern im gesamten Graphen • Push-Funktionen für Analyse und Visualisierung von Audio- und Eventdaten • Mitteilung von internen Filter-Veränderungen • Mitteilung von Datenstrom-Unterbrechungen • Identifikation von Filtertypen 57 4. Entwurf des GenMAD-Systems Zwar besitzt DirectShow eine eigene Infrastruktur für Ereignis-Mitteilungen, Funktionen mit hoher Datenlast überfordern jedoch die bereitgestellten Transportmechanismen. Diese Infrastruktur wird daher in GenMAD nur für wenige Funktionen verwendet, wie in der technischen Dokumentation beschrieben wird. 4.2.3 Filter DirectX-Filter sind Windows-DLLs (dynamic link libraries), deren Basisklasse von der DirectShow-Klasse CBaseFilter abgeleitet ist. Dadurch wird eine grundlegende Behandlung durch das umgebende DirectShow-Framework ermöglicht, die z.B. die Erzeugung einer Instanz anhand eines identifizierenden COM-Bezeichners ermöglicht. Durch Ableiten weiterer DirectShow-Klassen und Überladen von Methoden sind entsprechende Anpassungen z.B. des lokalen Datentransports von Filter zu Filter möglich. Durch optional implementierte DirectShow-Schnittstellen ist es möglich, Methoden zu definieren, deren Funktionsumfang über die vom DirectShow-System bereitgestellten minimalen Fähigkeiten hinausgeht. Dazu zählen z.B. Funktionen zur Neu-Positionierung von Zeigern eines Quellstroms, um bei der Wiedergabe einer Datei vor- oder zurückzuspulen, oder die Unterstützung von Speicher- bzw. Ladefunktionalität. Um eigene Funktionen bereitzustellen, können daher eigene COM-Interfaces unter Angabe einer GUID definiert und implementiert werden. Der GraphBuilder von DirectShow liefert unter Angabe dieser Interface-GUID einen Zeiger auf die so definierte Schnittstelle. Das entsprechend Abbildung 4.1 von GenMAD-Filtern unterstützte IMonitoringSlave-Interface soll die von DirectShow bereitgestellte vor dem gegebenen Anwendungshintergrund um zusätzliche Funktionen erweitern und ermöglicht so die in Kapitel 5 erläuterte Implementation der zu Beginn dieses Kapitels vorgegebenen Zielfunktionalität. Das IMonitoringSlave-Interface umfasst vor allem folgende Funktionsbereiche: • Registrierung beim GenMAD-Host • Methoden zur Festlegung und Abfrage der Blockpuffergröße • Datentransport-bezogene Funktionen, z.B. Abfrage eines erweiterten Status • Filter-Benennung • Funktionalität zur Konfiguration durch den Benutzer • Parameterabstimmung • Visualisierungsfunktionen Um den Aufwand zur Entwicklung eigener Filter so gering wie möglich zu halten, steht ein dafür konzipiertes und getestetes Software Development Kit (SDK) bereit. Dieses wird in Kapitel 5 erläutert und ist im Anhang technisch dokumentiert. 58 Kapitel 5 Implementation 5.1 GenMAD GenMAD besitzt ein Hauptfenster, das aus einer Toolbar und einem Bereich zur visuellen Manipulation des Datenflussgraphen besteht und in Abbildung 5.1 dargestellt ist. Die fest im oberen Bereich positionierte Toolbar beinhaltet sowohl Buttons für Projekt-bezogene Operationen (Neues Projekt, Laden, Speichern) und für das Hinzufügen lokaler und im Internet verfügbarer Mediendateien als auch Buttons für das Hinzufügen neuer Filter sowie für den Aufruf des Visualisierungs-Fensters, die Kontrolle der Referenzuhr und des Transports. Darüber hinaus sind dort eine Anzeige der aktuellen Laufzeit des Graphen, ein sich analog zur ablaufenden Zeit bewegender Schieberegler für den manuellen Vor- und Rücklauf und ein editierbares Feld zur Eingabe eines Skalierungsfaktors über eine von DirectShow angebotene Interpolations-Methode enthalten. Der Manipulationsbereich enthält die durch verschiedenartig kolorierte Rechtecke repräsentierten Filter des aktuellen Graphen mit namentlicher Beschriftung. Dabei sind Filter, die das IMonitoringSlave-Interface implementieren, dadurch markiert, dass ihr Name statt durch dunkle durch weiße Schrift auf dunklem Hintergrund hervorgehoben ist. Eingehende Pins sind als kleine graue Quadrate stets an der linken Seite jedes Filters, ausgehende an der rechten Seite befestigt und mit ihrem Namen versehen. Verbindungen zwischen Filtern respektive Pins sind durch Linien gekennzeichnet. Der Aufbau ist dabei inspiriert von dem im DirectX-SDK enthaltenen Programm GraphEdit. Sämtliche durch den Benutzer ausführbare Operationen sind entweder über die Toolbar erreichbar oder durch Editieren der genannten Objekte im Manipulationsbereich möglich. Per Rechtsklick kann ein Filter dialogbasiert konfiguriert werden. Darüber hinaus verfügen Filter und Pins zusätzlich über Kontextmenüs, die Informationen zu Zustand und Eigenschaften sowie verschiedene Operationen anbieten. Abbildung 5.1: Überblick über das Hauptfenster von GenMAD 59 5. Implementation Abbildung 5.2: Das Visualisierungsfenster von GenMAD Das in Abbildung 5.2 dargestellte Visualisierungsfenster ist zum einen ebenfalls mit einer Toolbar ausgestattet und zum anderen – entsprechend der in Abbildung 4.3 dargestellten drei Teilklassen zur Visualisierung – in drei Teilbereiche jeweils variabel einstellbarer Größe eingeteilt. Auf der linken Seite befindet sich eine in Listenform gehaltene Darstellung aller Events, die zu jedem Event auch die entsprechenden Parameter enthält. Die rechte Hälfte des Fensters enthält im oberen Teil eine Echtzeitdarstellung der Wellenform des ausgewählten Filters, falls der im folgenden erläuterte Audiofokus gesetzt ist, und im unteren eine Piano-Roll-ähnliche EchtzeitRepräsentation der Events. Verschiedene Instanzen des zur Event-Visualisierung verwendeten MonitoringEventVisualizer-Filters werden übereinander angeordnet dargestellt. Die Farbgebung korrespondiert dabei, ebenso wie in der Liste, mit der Farbe der Filter im Manipulationsbereich. Jeder vertikale Strich der Eventdarstellung entspricht einem per Zeitstempel datierten Event, dessen Höhe seinem Ranking entspricht. Aufeinander folgende Events gleicher Quelle werden als Eventblocks visuell zusammenfasst, indem ein darüber liegender, mit dem Namen des Events beschrifteter horizontaler Balken gezeichnet wird, wie in Abbildung 5.2 ersichtlich. Das erwähnte Konzept des Audiofokus bestimmt zu jeder Zeit maximal ein Filter, welches zum einen das IMonitoringSlave-Interface implementieren und zum anderen mindestens einen eingehenden Audio-Pin besitzen muss. Die Audiodaten des Filters mit dem Audiofokus werden im oberen rechten Fensterbereich in Echtzeit angezeigt. Die Auswahl kann außer der Wahl durch Doppelklick auf ein entsprechendes Filter im Manipulationsbereich auch durch die in der Toolbar enthaltene Auswahlbox erfolgen. Des weiteren enthält die Toolbar einen Button zum Umschalten der Echtzeit-Anzeigen auf Standby und einen beschrifteten Schieberegler zum Zoomen. Im Standby-Modus kann die Eventdarstellung per Schieberegler am unteren Fensterrand zeitlich durchlaufen werden und erlaubt so einen Rückblick. 60 5. Implementation CMonitorApp Erzeugung Erzeugung CMainFrame GUIKontrolle Erzeugung Kontrolle Darstellung Kommunikation mit Filter Erzeugung Fokus DirectShow-Events GUI-Events Filter-Informationen Verbindbarkeit CFilterContainer* Erzeugung CPinInfo* Audiofokus CChildView Events: Tasten, Maus, Zeichnen Erzeugung Darstellung Graph-Informationen Abspielkontrolle Event-/Audiodaten CVisualizerFrame Erzeugung Signal-Daten CAudioView CEventListView CEventView Abbildung 5.3: Schematischer Überblick über die wichtigsten Klassen von GenMAD. Die Farbgebung folgt dem in Abb. 4.3 eingeführten Schichtenmodell. Mit einem Stern (*) versehene Klassen werden nicht als Singletons verwendet. Im Anhang befinden sich Hinweise zur Verwendung und Installation von GenMAD, sowie ein Benutzerhandbuch und die technische Dokumentation. Sämtliche im Rahmen dieser Diplomarbeit entwickelten Komponenten liegen als kompilierte Versionen und im Quelltext auf CD bei. 5.1.1 Zentrale Klassen und Strukturen von GenMAD Die zentralen Klassen und die wichtigsten Beziehungen von GenMAD sind schematisch in Abbildung 5.3 dargestellt. Eine UML-Darstellung des gesamten Klassenbestandes ist in Anhang D.1 dargestellt. Im Folgenden sollen die Aufgabenbereiche der einzelnen abgebildeten Klassen kurz erläutert werden: • CMonitorApp: Haupt-Applikationsklasse, die die Anwendung durch Erzeugen des Hauptfensters und der CGraphController-Klasse initialisiert; • CMainFrame: Repräsentant des Hauptfensters, der sowohl GUI-Elemente zur Interaktion und zur Statusmeldung erzeugt und verwaltet als auch entsprechende Events und DirectShow-Events nach Vorverarbeitung an das CGraphController-Objekt weiterreicht; CChildView: Repräsentant des Zeichenbereiches, dient jedoch nur der Annahme von Benutzer- (Tastatur, Maus) und Zeichen-Events, die an CGraphController weitergeleitet werden; • 61 5. Implementation • CGraphController: Ebenso wie der den Datenflussgraphen kontrollierende GraphBuilder die zentrale Komponente von DirectShow darstellt, ist diese ihn in GenMAD modellierende Klasse wichtigstes Element der Applikation. Sie enthält analog zum Graphen und damit verbundenen Funktionen z.B. zur Abspielkontrolle auch die Repräsentanten-Objekte der verwendeten Filter sowie Funktionen zu Eventbehandlung, Erzeugung und Manipulation von Graph und Filtern. Darüber hinaus implementiert sie das bereits beschriebene IMonitoringMaster-Interface und stellt dadurch die Kommunikationsschnittstelle der Filter dar. Dies impliziert auch die Initiierung der Signal-Visualisierung. • CFilterContainer: Modelliert ein Filter und stellt durch Zugriff auf veröffentlichte DirectShow-Funktionen, die jeweils enthaltenen Pins und vor allem auf das IMonitoringSlave-Interface die Schnittstelle der Applikation zu jedem Filter dar. • CPinInfo: Repräsentiert einen Pin; • CVisualizerFrame: Klasse des Hauptfensters der Visualisierung, das die Organisation der untergeordneten Fenster-Teilbereiche übernimmt; • CAudioView: Fensterklasse Audiodatenstroms; • CEventView: Fensterklasse zur zoom- und scrollbaren Echtzeit-Visualisierung des Eventdatenstroms mittels einer Piano-Roll-Ansicht; • CEventListView: Fensterklasse zur Echtzeit-Auflistung des Eventdatenstroms; zur zoombaren Echtzeit-Visualisierung des Da Eventdaten eine zentrale Rolle in GenMAD spielen, soll ein kurzer Überblick über die Eigenschaften eines Events gegeben werden: • Beschreibung des Events, z.B. Name eines identifizierten Musikstückes • Zeitstempel • Score: Ranking des Events • Shift: zeitliches Mapping, z.B. auf das Auftreten des identifizierten Stückes in einer Datenbank • Generator: Name des Filters, das den Event erzeugt hat • Audiostrom-Informationen, z.B. Abtastrate und Kanalanzahl • Index: fortlaufende Nummerierung • Visualisierer: Name des Filters, das den Event zur Visualisierung übergeben hat Nachfolgend werden wichtige Mechanismen von GenMAD erläutert. 62 5. Implementation 5.1.2 DirectShow-Events Events in DirectShow können sowohl von Filtern als auch durch den Datenflussgraphen versendet werden, z.B. zur Benachrichtigung über das Ende des Datenstroms oder bei abnormaler Beendung durch den Benutzer. Der verwendete Mechanismus folgt insofern dem in Windows gängigen Schema zum Versand von Nachrichten (engl. messages), als zum einen Events bis zu ihrer Verwendung in einer abfragbaren Warteschlange (engl. queue) aufbewahrt werden, und zum anderen ein Event einen numerischen Eventcode und zwei Parameter umfasst, die als 32 Bit-Integers entsprechend auch als Zeiger verwendet werden können. Der Zugriff erfolgt über verschiedene Schnittstellen: Filter verwenden das IMediaEventSink-Interface zum Versand, Applikationen die IMediaEvent- und IMediaEventEx-Schnittstellen zum Empfang. Um einen Event empfangen zu können, muss eine Applikation über das Vorhandensein eines Events in der Warteschlange informiert werden. GenMAD verwendet dazu ein Window notification genanntes Verfahren. Zunächst wird ein privater Eventcode definiert: #define WM_GRAPHNOTIFY WM_APP + 1 WM_APP ist der per Definition höchstwertige Eventcode, der von Windows versandt wird. Über das IMediaEventEx-Interface wird dieser Code DirectShow als derjenige EventCode mitgeteilt, der beim Eintreffen eines DirectShow-Events als normale Windows-Message an GenMAD versandt werden soll. GenMAD prüft beim Eintreffen dieses Codes die per IMediaEventEx-Interface ansprechbare DirectShow-Warteschleife. Der Vorteil dieses Verfahrens besteht darin, dass GenMAD ohnehin normale Windows-Messages behandelt und daher kein zusätzlicher Handler implementiert werden muss. Die zur Behandlung von DirectShow-Events nötige Mehrstufigkeit des Verfahrens ist allerdings der Grund, warum GenMAD zur zeitkritischen Kommunikation mit Filtern ein COM-Interface-gestütztes Verfahren verwendet. 5.1.3 Hinzufügen neuer Filter Filter sind in DirectX nicht nur durch Angabe einer GUID – auch CLSID genannt, z.B. {0x481de083, 0x4712, 0x4ab2, 0xab, 0x16, 0x8d, 0x80, 0x8e, 0x1c, 0xf9, 0xb5} – eindeutig identifiziert, sondern darüber hinaus ebenfalls per GUID selbstständig einer Filter-Kategorie zugeordnet. Da nicht alle gängigen Kategorien in Zusammenhang mit GenMAD sinnvoll erscheinen, sind nur ausgewählte Kategorien in dem modalen Dialog enthalten, der dem Benutzer anhand einer Baumstruktur die im System registrierten Filter, sortiert nach genannten Kategorien, anbietet. Die Ermittlung dieser Filter erfolgt über ein System Device Enumerator genanntes COM-Objekt, das zunächst unter Angabe der entsprechenden GUID vom System erzeugt werden muss. In einer durch den Enumerator definierten Schleife werden von ihm sogenannte IMoniker-Instanzen zurückgeliefert, die das Auslesen des Filternamens über PropertyBags ermöglichen. Dieser wird unter verdecktem Speichern des aktuellen Schleifenindizes in der Baumstruktur veröffentlicht. Das Erzeugen eines durch den Benutzer bestimmten Filters verwendet einen beinahe identischen Algorithmus, der bis zu demjenigen Schleifenindex iteriert, der zum gewählten Filter im Baum gespeichert ist. Das IMoniker-Objekt erlaubt anschließend über die BindToObject-Methode das Füllen eines zuvor leeren Filter-Objektes. Da die PropertyBag auch das Auslesen der Filter-CLSID ermöglicht, wäre ein simpleres Verfahren zur Erzeugung des Filters anhand der CLSID wünschenswert. Diese Vorgehensweise schlägt jedoch leider im Fall von Capturing-Filtern aufgrund eines Bugs in der DirectShow-Implementation fehl. Angewandt wird sie jedoch bei der Erzeugung der sogenannten Filter-Favoriten, die zum schnellen Zugriff ähnlich einer künstlichen Kategorie im Baum angezeigt werden und zum einen aus einigen vordefinierten, häufig verwendeten Filtern, zum anderen aus sämtlichen GenMAD63 5. Implementation Filter bestehen. Letztere werden dynamisch anhand des Namens-Präfix Monitoring eingelesen, wodurch auch zukünftig entworfene GenMAD-Filter unterstützt werden. 5.1.4 Speichern & Laden Das aktuelle GenMAD-Projekt, bestehend aus Datenflussgraph und dem internen Zustand der Applikation, kann unter Verwendung eines CArchive-Objektes serialisiert und in einer Datei gespeichert werden. Damit eine Klasse diese MFC-Funktion verwenden kann, muss sie von CObject abgeleitet sein, je ein Makro in Header- und Implementationscode enthalten und die Funktion void Serialize( CArchive& archive ) implementieren. Die zunächst aufgerufene CGraphController-Klasse führt diese Operation auf allen enthaltenen Filtern aus. Diese speichern extern verfügbare Verbindungen, Pins und Zustand, darunter die Filter-CLSID. Falls ein Filter das IPersistStream-Interface implementiert, kann es selbstständig seinen privaten internen Zustand als IStream-Objekt zurückliefern. Dieses unterstützt eine Methode zur Speicherung des Inhaltes in einem IStorage-Objekt, welches eine komplette virtuelle Dateistruktur mit Verzeichnissen in einer einzelnen Datei verwaltet. Um das gesamte GenMAD-Projekt in nur einer Datei zu speichern, wird die von IStorage erzeugte Datei anschließend binär ausgelesen und dem seriellen CArchive-Strom hinzugefügt. Entsprechend werden beim Laden nach einem Zurücksetzen des Graphen zunächst die Filter separat deserialisiert und in der CFilterContainer::Recreate()-Methode bei gegebener Unterstützung des IPersistStream-Interfaces durch Schreiben in eine temporäre Datei und das entsprechende IStorage-Objekt in den originalen internen Zustand versetzt. Quellfilter, die auf eine Mediendatei zugreifen, müssen damit neu initialisiert werden. Die abschließend ausgeführte CGraphController::Recreate()-Methode fordert ausgehend von den Quellfiltern jedes Filter dazu auf, zunächst all seine ausgehenden Pins erneut per DirectShowMethodenaufruf zu verbinden und anschließend rekursiv auch nachgeschaltete (downstream) Filter dazu aufzufordern. 5.1.5 Hinzufügen von Mediendateien als Datenquelle Eine vom Benutzer ausgewählte lokale oder per URL referenzierte Mediendatei wird durch die Methode CGraphController::RenderData() in den Graph eingefügt. Falls der Graph leer ist, wird der von DirectShow bereit gestellte Mechanismus zum automatischen Erzeugen eines kompletten, auf der Mediendatei und ihrem Format beruhenden Quellfilters verwendet. Anschließend werden alle Filter analysiert und in einer CList aus CFilterContainer-Objekten repräsentiert. Falls sich bereits Filter im Graph befinden, wird ein zweistufiger Prozess eingeleitet, der zunächst einen temporären Graphen erstellt und diesen mittels des gerade genannten Verfahrens füllt. Um auf alle in GenMAD implementierten Funktionen zurückgreifen zu können, werden nun der ursprüngliche und der temporäre Graph vertauscht und der Vorgang ähnlich dem eines leeren Graphen durchgeführt. Nach dem Wiederherstellen des Originalzustandes werden die neuen Filter sukzessiv in den Graphen eingefügt und entsprechend verbunden. Analog zum Ladevorgang müssen auch hier besondere Maßnahmen im Fall von Quelldateifiltern ergriffen werden. Gleiches gilt für den Fall, dass ein Filtername bereits im Graphen vorhanden ist, denn manche Methoden des DirectShow-Graphen arbeiten auf den internen Filternamen und nicht auf den entsprechenden GUIDs. In einem solchen Fall wird versucht, vor dem Einfügen automatisch einen neuen internen Namen zu erzeugen. Diese internen Namen können allerdings nach der Instanziierung nicht mehr geändert werden. Die tatsächlich im Manipulationsbereich von GenMAD angezeigten Filternamen von GenMAD-Filtern sind davon allerdings unabhängig und somit unbetroffen und können über die Konfiguration des Filters editiert werden. 64 5. Implementation 5.1.6 Filter-Konfiguration Falls ein DirectShow-Filter die ISpecifyPropertyPages-Schnittstelle implementiert, kann seine Konfiguration über einen ein oder mehrere Seiten umfassenden modalen Dialog editiert werden. Die einzelnen Seiten können auch eine Grafik und entsprechende Ereignisbehandlungsmethoden beinhalten, um z.B. das Drehen an virtuellen Knöpfen zu ermöglichen. Der in CFilterContainer::ShowPropertyPage() implementierte Aufruf des Dialogs verwendet die Funktion OleCreatePropertyFrame(), die ein eigenständiges OLE-Objekt mit den genannten Eigenschaften erzeugt. 5.1.7 Zeit und Uhren Jede Zeitangabe basiert in GenMAD auf einer kleinsten Zeiteinheit, die 100 Nanosekunden umfasst. Weiterhin werden Zeitangaben, z.B. Zeitstempel von Datenblöcken, üblicherweise relativ als Streamtime in Relation zu einer Startzeit des entsprechenden Streams angegeben. DirectShow verwendet in Form des GraphBuilder-Objektes eine sogenannte Referenzuhr, um alle Filter des Graphen zu synchronisieren. Diese wird z.B. durch einen Baustein auf der Soundkarte betrieben und über den entsprechenden Treiber bereitgestellt. Falls statt exakter Synchronität eine maximale Performanz erforderlich ist, kann die Referenzuhr über die Toolbar auf NULL gesetzt werden und ermöglicht dem Graphen so ein zeitungebundenes Arbeiten. In diesem Fall sollte jedoch – falls enthalten – der Audio-Renderer ein sogenannter Null-Renderer sein, der eingehende Audiodaten nicht an die Soundkarte weiterreicht, da sonst keine kontinuierliche Wiedergabe garantiert werden kann. 5.1.8 Datenfluss, Abspielkontrolle & Seeking GenMAD bietet über das DirectShow-Interface IMediaControl die drei üblichen Operationen zum Abspielen an – Start, Pause und Stop. Die möglichen Übergänge der entsprechenden drei Graphund auch Filterzustände sind dabei nur zwischen benachbarten Zuständen möglich, also Start Î Pause Î Stop Î Pause Î Start. Dabei senden Quellfilter im gängigen Push-Modus auch im Pause-Zustand Daten, die sie so über ihre Ausgangs-Pins lange an Eingangs-Pins nachgeschalteter Filter weiterschieben, bis diese blockieren. Genau das tun Renderer nach Erhalt eines Datenblockes im Pausemodus. Dies entspricht dem aus der Videotechnik bekannten „Standbild“, bei dem derselbe Frame ununterbrochen dargestellt wird. Sobald der Graph gestartet wird, hebt der Renderer die Blockade auf. Bevor GenMAD durch die CGraphController-Klasse den Zustand des Graphen ändert, wird durch Aufruf der entsprechenden Methode jedes Filters zunächst überprüft, ob alle GenMADFilter bereit sind. Erst, wenn dies für alle Filter der Fall ist, wird versucht, in den Run-Modus zu schalten. Abschließend wird das Signal an verschiedene Objekte weitergegeben, darunter CVisualizerFrame. Seeking, also der wahlfreie Vor- und Rücklauf, muss von allen im Graph enthaltenen Filtern in Form des IMediaSeeking-Interfaces unterstützt werden. GenMAD verwendet genau dieses Interface, um Neupositionierungen an den Graphen weiterzugeben. Dieser leitet die Anfrage an alle vorhandenen Renderer weiter, die, falls sie nicht über die entsprechende Funktionalität verfügen, rekursiv vorgeschaltete Filter anfragen, bis entweder der Befehl ausgeführt oder abgelehnt wird. Üblicherweise wird diese Funktionalität nur von Quellfiltern ausgeführt. 65 5. Implementation CVisualizerFrame Timer CAudioView Action() Reduktion auf Extrema Mutex Mutex Ringpuffer CGraphController Filter Abbildung 5.4: Visualisierung von Audiodaten. Verschiedene Threads sind farbig dargestellt. 5.1.9 Visualisierung Das auf der CVisualizerFrame-Klasse beruhende Fenster zur Visualisierung wird dynamisch erzeugt und verfügt wie zu Beginn dieses Kapitels erläutert über drei Teilbereiche, jedes davon als von CWnd abgeleitete Klasse implementiert. Intern läuft ein Timer, der in MillisekundenAbständen die drei Klassen zu Updaten auffordert und in einem zum CGraphController-Objekt separaten Thread ausgeführt wird. Bei Veränderung des Laufzeit-Zustandes, z.B. Start Î Pause, wird CVisualizerFrame analog dazu benachrichtigt und stoppt bzw. startet entsprechend den Timer. Die zur Visualisierung benötigten Audio- und Eventdaten werden über separate Mechnismen erhoben: Demjenigen Filter, das den oben erläuterten Audiofokus erhält, wird dies per IMonitoringSlave::SetShowAudioData()-Methoden-Aufruf mitgeteilt, woraufhin es eingehende Audiodaten nicht nur an nachgeschaltete Filter, sondern auch an GenMAD weiterreicht. Eventdaten dagegen werden nur von einem Filtertyp, dem MonitoringEventVisualizerFilter, an GenMAD weitergegeben. Beide Datentypen werden dem CGraphController-Objekt über die IMonitoringMasterSchnittstelle übergeben und direkt an die CVisualizerFrame-Instanz weitergereicht. Diese verteilt sie auf die drei Teilfenster: Der CAudioView-Klasse wird ein AudioBuffer-Objekt übergeben, in dem sowohl ein Datenblock als auch Metadaten zu z.B. Abtastrate und Zeitstempel enthalten sind. Dieses wird mittels eines durch die aktuelle Zoomauflösung parametrisierten Algorithmus’ in gleich große zeitliche Abschnitte zerteilt, zu denen je minimaler und maximaler Signalwert ermittelt und zusammen mit dem jeweiligen Zeitstempel in einem Ringpuffer abgelegt werden. Die vom CVisualizerFrame-Timer in kurzen Abständen aufgerufene Methode CAudioView::Action()berechnet das Zeitintervall seit dem letzten Aufruf und die entsprechend gewählter Zoomauflösung dafür benötigte Anzahl von Pixeln, wobei letztere zur Vermeidung von leeren oder doppelten Pixels als double-Werte verwendet werden. Zusammen mit dem Raster wird nun für jedes neue Pixel ein entsprechend skalierter vertikaler Strich gezeichnet. Es sei angemerkt, dass das Zeichnen zur Vermeidung von Flacker-Effekten nicht in dem tatsächlichen Fensterbereich, sondern über versteckte Puffer stattfindet, die anschließend vollständig und zur Fenstergröße skaliert in den Fensterbereich hineinkopiert werden. Um Probleme durch synchronen Zugriff zu vermeiden, greifen beide Threads unter Verwendung eines durch DirectShow bereitgestellten Mutex-Verfahrens seriell auf den Ringpuffer zu. Das Verfahren ist in Abbildung 5.4 dargestellt. Das zur Anzeige von Eventdaten verwendete Verfahren ist ähnlich aufgebaut: Auch hier werden die vom Filter eingehenden Daten bis in die beiden verarbeitenden Klassen weitergeleitet 66 5. Implementation und dort in eine Speicherstruktur gefüllt. Allerdings handelt es sich hierbei um eine CList (eine doppelt verkettete Liste), und die Events werden, da sie aufgrund verschiedener Filterherkünfte möglicherweise in nichtsortierter Reihenfolge eintreffen können, zeitlich einsortiert. Darüber hinaus gibt es einen in diesem Zusammenhang aktualisierten Positionszeiger, der bei Eintreffen von Daten mit einem Zeitstempel kleiner als der bereits visualisierter Daten das Zeichnen auch dieser Daten garantiert; einmal gezeichnete Daten werden jedoch nicht noch einmal geschrieben. Die ebenfalls Zeichenpuffer-basierte, Timer-aufgerufene Zeichenmethode der CEventViewKlasse muss – im Gegensatz zum simplen Hinzufügen in eine Liste im CEventListViewTeilfenster – zusätzlich die Verteilung der verschiedenen Filter auf separate vertikal getrennte Bereiche, genannt Bahnen, dynamisch verwalten. Darüber hinaus werden auf jeder Filter-Bahn unterschiedliche Event-Beschreibungen ebenfalls dynamisch verschiedenen Subbahnen zugeordnet, die eine Filterbahn in vertikal getrennte Abschnitte unterteilen. Dazu bedient sich die Routine einer zentral in CVisualizer gehaltenen Liste aus FilterDesc-Objekten aller MonitoringEventVisualizer, die mit zusätzlichen Informationen z.B. zum vorigen Event und dem Beginn des aktuellen als zusammengehörend eingestuften Eventblocks versehen sind. Jedem Filter werden maximal 16 verschiedene Subbahnen zugestanden, die im Falle der Maximalauslastung bei Eintreffen bisher unbekannter Event-Beschreibungen dadurch neu strukturiert werden, dass die Subbahn der am längsten vergangenen Event-Beschreibung neu vergeben wird. Nach dem Zeichnen des Events wird geprüft, ob die Beschreibung des Event zu der des vorigen Events identisch ist und ob die Zeitdifferenz zu diesem vorigen Event einen definierten Grenzwert unterschreitet. In diesem Fall wird der aktuelle Eventblock verlängert und entsprechend eingezeichnet. 5.2 Das Filter-SDK Um die Entwicklung neuer Filter zu vereinfachen, wurde im Rahmen der Diplomarbeit ein Software Development Kit (SDK) entworfen. Dieses beruht auf einer implementierten Basisklasse CMonitoringBaseFilter mit vier zusätzlichen Klassen für die verschiedenen Pintypen und benötigt nur wenige Angaben, um ein laufendes Filter zu erzeugen. Dadurch wird zum einen die Notwendigkeit zur Einarbeitung in DirectShow vollständig genommen, zum anderen führt die Fokussierung auf Monitoring-Aspekte zu einer erhöhten Produktivität bei der Entwicklung neuer Filter. Die dafür nötigen technischen Schritte sind in Anhang A aufgeführt. Zur nötigen Registrierung eines Filters und dem späteren Erzeugen über eine FactoryFunktion benötigt Windows neben einer eindeutigen COM-CLSID und Informationen zu FilterNamen und sonstigen –Eigenschaften vor allem auch explizite Angaben über Anzahl und Art der enthaltenen Pins. Diese werden in Form eines globalen Feldes CFactoryTemplate g_Templates[] erwartet, das auf andere Felder verweist, die alle benötigten Informationen enthalten. Um dem Entwickler des SDK die Einarbeitung in diesen Mechanismus zu ersparen, enthält das SDK eine Datei namens FilterDefs.h, die auf übersichtliche Weise PräprozessorDefinitionen mit grundlegenden Angaben enthält, welche ein Entwickler anpassen muss. Im Fall des MonitoringEventIncluder-Filters sieht dies folgendermaßen aus: //================================================================== //Anzahl d. versch. Pintypen #define PINS_AUDIO_IO 0 #define PINS_EVENT_IN 1 #define PINS_EVENT_OUT 1 67 5. Implementation //================================================================== // *DER* GUID const GUID IID_MonitoringEventIncluder = { 0x4c03cfaa, 0xb667, 0x43ee, 0x96, 0xaa, 0xa1, 0xea, 0x66, 0xfa, 0x6e, 0xed }; //================================================================== //Definition d. Filter-Parameter für globale Makros #define FILTER_CLSID IID_MonitoringEventIncluder #define FILTER_CLASS CMonitoringEventIncluder #define FILTER_NAME "MonitoringEventIncluder" #define FILTER_NAME_WIDE L"MonitoringEventIncluder" #define FILTERPROP_CLSID #define FILTERPROP_CLASS CLSID_MonitoringBaseFilter_PropertyPage CMonitoringBaseFilterPropertyPage In einer zweiten zentralen Datei des SDK namens GlobalMacros.h wird unter Zuhilfenahme dieser Definitionen das globale CFactoryTemplate-Feld automatisch durch Präprozessorangaben generiert und ermöglicht so eine korrekte Kompilierung des Filters. In der neuen, von CMonitoringBaseFilter ableitenden Filterklasse werden diese Angaben durch das Einbinden (per Include) der dritten wichtigen Datei SDK.h in Variablenwerte, z.B. Pin-Felder, geschrieben. Darüber hinaus werden so wichtige Funktionen parametrisiert. Zusätzlich zur Verwendung der CMonitoringBaseFilter-Klasse, in der das lauffähige Grundsystem zu z.B. Datentransport, Medienformatverhandlung und GenMAD-Funktionen enhalten ist, wird die neue Filterklasse also dynamisch mit aktuellen Angaben ausgestattet und stellt daher eher eine Art Grundstruktur dar, die ohne diese zentralen SDK-Dateien nicht kompilierbar wäre. Im Folgenden sollen wichtige Teile der Filter-Implementation dargestellt werden, die in CMonitoringBaseFilter und den Pinklassen implementiert sind. 5.2.1 Medienformat-Abgleich Das in DirectShow enthaltene Konzept zur Behandlung von Datenformaten besteht aus je einer Angabe zu Haupt- und Untertyp der blockweise verwendeten Daten. Beim Versuch, Ausrespektive Eingangs-Pins zweier Filter zu verbinden (engl. hand-shaking), muss sichergestellt werden, dass das nachgeschaltete Filter das angebotene Datenformat verarbeiten kann. Dazu rufen die Pins nach einem von DirectShow diktierten Schema verschiedene Methoden zum Vergleich und der Suche nach möglichen Datentransformationen von Formattypen auf. In GenMAD-Filtern wird eine solche Kontrolle dadurch sichergestellt, dass die Pin-Klassen jeweils zunächst selbstständig versuchen, ein akzeptables Format zu finden und erst im Anschluss die entsprechenden Methoden von CMonitoringBaseFilter aufrufen. Unterstützt werden sowohl unkomprimierte PCM-Audiodaten in 8 und 16 Bit Auflösung und bis zu zwei Kanälen sowie der selbst definierte Typ MEDIATYPE_Event. 5.2.2 Datenübertragung Wie in Abschnitt 5.1.8 erläutert, verwenden alle GenMAD-Filter das Push-Modell zum Datentransport. Beim Erhalt eines neuen Datenblockes ruft daher der Eingangs-Audiopin die PreProcessAudio()-Methode des Filters auf. Dort wird zunächst eine Kopie der Daten an die GenMAD-Applikation übergeben, falls das Filter derzeit den Audiofokus besitzt. Anschließend wird der Datenblock an einen noch nicht vollständig gefüllten Datenpuffer mit einer vom Filter geforderten Größe angehängt und – falls dieser vollständig gefüllt ist – an die ProcessAudio()-Methode übergeben, wo die Daten von implementierten Filtern verwendet 68 5. Implementation werden können. Falls ein Ende des Datenstroms signalisiert wird, übergibt das Filter den offenen Puffer an diese Methode. Audiodaten werden automatisch an Eingangspins nachgeschalteter Filter weitergeleitet. Anders ist dies bei Eventdaten: Diese müssen explizit über SendEvent() weitergegeben werden, wodurch die Implementation von Filterungs-Mechanismen ermöglicht wird. Auch für Eventdaten existiert der genannte zweistufige Verarbeitungsmechanismus, indem in PreProcessEvent() jedes als binärer Datenblock versandte Event in ein Objekt umgewandelt wird und nachfolgend in ProcessEvent() für High-Level-Verarbeitung zur Verfügung steht. Der gesamte Vorgang findet innerhalb eines Filters im selben Thread statt. DirectShow erlaubt allerdings auch die Verwendung eines sogenannten Worker-Threads, der z.B. im Quellfilter MonitoringXMLReader eingesetzt wird. 5.2.3 Konfiguration Um Filter-Entwicklern eine einheitliche und einfache Möglichkeit zur dialoggestützten Konfiguration zu geben, verfügt CMonitoringBaseFilter über einen Mechanismus, der die automatische Erzeugung eines Dialoges mit bis zu acht Property genannten Variablen ermöglicht. Diese Properties können über AddProperty() unter Angabe von anzuzeigendem Namen, Variablentyp und der Speicheradresse registriert werden. Der Filtername wird automatisch als erste Property registriert. Nach einer Änderung durch den Benutzer ist es möglich, auf Änderungen bestimmter Properties zu reagieren, in dem die Methode SetProperty() überschrieben wird. Intern werden diese Properties in einem Feld verwaltet, auf das von einer für den Dialog zuständigen Klasse CMonitoringBase-FilterPropertyPage zugegriffen wird. Diese füllt die in acht Zeilen angeordneten Benutzerelemente des in Abbildung 5.5 abgebildeten generischen Dialogs. Nicht verwendete Zeilen werden ausgeblendet. Die Eventhandler-basierte Verwaltung der Eingaben durch den Benutzer überschreibt anhand der Variablen-Zeiger deren vorhandene mit neuen Werten. Abbildung 5.5: Ein automatisch generierter Konfigurationsdialog 69 5. Implementation 5.2.4 Seeking Um in einem Graphen Seeking-Fähigkeiten, also den wahlfreien Vor- und Rücklauf, verwenden zu können, muss jeder enthaltene Filter das IMediaSeeking-Interface implementieren. SeekingAnfragen durch den GraphBuilder werden an die Renderer abgesetzt, die diese „stromaufwärts“ weiterleiten bis die Anfrage bearbeitet wird oder ein Filter die Schnittstelle nicht implementiert. In CMonitoringBaseFilter werden sämtliche dieser Interface-Methoden dadurch implementiert, dass ankommende Anfragen direkt an ein vorgeschaltetes Filter weitergereicht werden, bevorzugt über solche, die über Audio-Pins verbunden sind. 5.2.5 Laden/Speichern Die implementierten DirectShow-Schnittstellen eines Filters gibt dieses unter Angabe eines zum jeweiligen Interface entsprechend definierten GUID über die DirectShow-Methode NonDelegatingQueryInterface bekannt. Ist auch IPersistStream darunter, werden beim Laden und Speichern des Graphen auch interne Eigenschaften des Filters auf von diesem zu implementierende Weise behandelt. CMonitoringBaseFilter tut dies standardmäßig für alle registrierten Properties. Möchte ein GenMAD-Filter weitere Eigenschaften speichern, so muss es dies durch Überschreiben von Write- bzw. ReadFromStream() unter Verwendung eines IStream selbst implementieren. 5.3 Implementierte GenMAD-Filter Die nachfolgend erläuterten Filter wurden im Rahmen dieser Diplomarbeit unter Verwendung des Filter-SDK entwickelt und getestet: 5.3.1 MonitoringAudentifyFilter Dieses Generatorfilter verwendet den in der Arbeitsgruppe Multimedia-Signalverarbeitung entwickelten Audentify!-Algorithmus [57], der in Abschnitt 2.5.5 beschrieben wurde. Dieser ist als DLL eingebunden und benötigt als Parameter die Angabe der verwendeten Index-Datenbank. Diese ist ebenso als Property veröffentlicht wie weitere Algorithmus-spezifisch Parameter. Die DLL selbst ist statisch eingebunden und wird nach Parameteränderung informiert oder ggf. neu initialisiert. Nach Aufruf der zentralen Identifikationsroutine werden die gefundenen Treffer mit weiteren Informationen, z.B. zum Typ des Audiostreams und einem Zeitstempel, angereichert und als EventSample-Objekt verpackt an nachfolgende Filter versandt. 5.3.2 MonitoringEventNullRenderer Dieser Renderer enthält keine eigene Logik, sondern dient nur mittels der in CMonitoringBaseFilter implementierten Methoden dem korrekten Abschluss einer Signalkette. Eingehende Events werden nicht weiterverarbeitet. Das Filter erfüllt jedoch sehr wohl einen Sinn, da es als Renderer durch die implementierten DirectShow-Schnittstellen Anfragen des Graphen, z.B. zum Seeking, entgegen nimmt und an vorgeschaltete Filter weiterleitet. Erst dadurch wird ein vollständiges Funktionieren des Datenflussgraphen ermöglicht. Diese Aufgaben werden natürlich auch von anderen Filtern, wie z.B. dem in 5.3.8 beschriebenen MonitoringXMLWriter übernommen, diese führen jedoch noch zusätzliche Operationen aus und sind daher je nach Projekt ungeeignet. 70 5. Implementation 5.3.3 MonitoringEventVisualizer Dieses Filter dient der Visualisierung von Events in GenMAD. Es besitzt eine numerische Property namens „Score-Threshold“ mit Standardwert 1, die bei eintreffenden Events mit dem darin enthaltenen Score-Ranking verglichen wird. Nur bei einem dem Threshold mindestens gleich hohen Score-Wert wird der Event an GenMAD übermittelt. Das exklusive Verwenden dieses Filters zur Eventvisualisierung erlaubt eine viel gezieltere Auswahl visualisierter Filter, als wenn sämtliche Filter Events sendeten, denn in diesem Fall würde das GenMAD-Visualisierungsfenster durch Mengen redundanter Daten so unübersichtlich, dass ein gezieltes Arbeiten stark erschwert würde. Auch die automatische Visualisierung der Event-Generatoren, wie dem MonitoringAudentifyFilter, widerspräche dem hier gewählten flexiblen Ansatz, vor allem im Fall komplexerer Verschaltungen. 5.3.4 MonitoringEventSplitter Dieses Splitterfilter dient der Verteilung von eingehenden Events an zwei nachgeschaltete Filter. 5.3.5 MonitoringEventMerger Als einziges der hier vorgestellten Filter besitzt dieses Kombinatorfilter zwei eingehende EventPins. Zweck ist das Zusammenführen zweier Event-Pipelines unter Verwendung eines Algorithmus’, welcher Ereignisse bewertet und ggf. verwirft. Diese Bewertung kann durch den Benutzer mittels mehrerer Parameters gesteuert werden: Zum einen gewichtet das Filter Ereignisse auf den beiden Eingängen separat mit je einem Faktor. Der Parameter Diffusion steuert in Abhängigkeit der Zeitstempel vergangener Ereignisse den Werteverfall jedes Ereignistyps und erlaubt so eine zeitbasierte dynamische Bewertung. Schließlich wird nur dann ein Ereignis weitergeleitet, wenn innerhalb eines parametrisierbaren Zeitintervalls in der unmittelbaren Vergangenheit nur dieser Ereignistyp versendet wurde. Das Filter erlaubt auf diese Weise das Verhindern von „Ausreißern“ oder anderen widersprüchlichen Events und somit eine Segmentierung des Ereignisstroms. Da dieses Filter eine wichtige Rolle im Kapitel 6 spielt, soll dieser Mechanismus etwas erläutert werden. Zur Kombination von Eventströmen hält das Filter in einem Feld events fixer Größe die Beschreibungen der letzten eingegangenen Events, unterschieden nach Event-Beschreibung. Trifft ein darin nicht enthaltener Event es ein, so wird dieser zum Feld an Stelle iEvent hinzugefügt, wobei im Fall der Maximalauslastung des Feldes der am längsten vergangene Event überschrieben wird. Nun wird die Bewertung unter Verwendung einer Winner-Takes-All-Strategie mit Gewinner-Feldindex iCurrentWinner durchgeführt: //berechne vergangenen wert REFERENCE_TIME rtDiff = es.rtTimestamp - events[iEvent].rtLastOccurance; //bisheriger Wert des Events mit zeitlichem Verfall double dValue = ValueFunction(events[iEvent].dLastValue, rtDiff); //berechne daraus den aktuellen Wert dValue += (double)es.lScore; //bisheriges Maximum überschritten? bool bNewWinner = (iCurrentWinner == -1); if (iCurrentWinner >= 0) { //selber Gewinner wie zuletzt? if (iCurrentWinner == iEvent) 71 5. Implementation { bNewWinner = true; rtCurrentSegmentLength += rtDiff; //Segment geht weiter } else { //Berechne Wert des bisherigen Gewinners double dWinnerValue = ValueFunction( events[iCurrentWinner].dLastValue, es.rtTimestamp - events[iCurrentWinner].rtLastOccurance); //bisherige + halber abstand zu vorigem gewinner-event if ((rtCurrentSegmentLength + (es.rtTimestamp - events[iCurrentWinner].rtLastOccurance) / 2) >= iMinimumSegmentLength*1000*10) { //neue Segmentlänge ist halber Abstand zu vorherigem gewinner-event rtCurrentSegmentLength = (es.rtTimestamp events[iCurrentWinner].rtLastOccurance) / 2; bNewWinner = true; } else //aktuelles segment fortsetzen rtCurrentSegmentLength += rtDiff; } } Falls ein Gewinner gefunden wurde, wird dies vermerkt und der Event gesendet. Die Funktion ValueFunction() berechnet dabei den durch die Diffusions-Property parametrisierten linearen zeitlichen Verfall der Bewertung. Entsprechend findet bei einem Diffusionswert von 0 keine Filterung, sondern ein reines Durchleiten statt: double CMonitoringEventMerger::ValueFunction(double dValue, REFERENCE_TIME rtDiff) { //umrechnen in Referenz-Zeit (100ns Auflösung) REFERENCE_TIME rtDiffusion = iMSecDiffusion*1000*10; //anwenden dValue -= (rtDiff/rtDiffusion); //ggf. abschneiden return max(0, dValue); } Das Filter arbeitet darüber hinaus auch bei nur einer eingehenden Verbindung. Dies kann z.B. zur Filterung eines Eventstromes eingesetzt werden. 5.3.6 MonitoringEventExcluder Dieses Verarbeitungsfilter verwendet eine Blacklist von Event-Beschreibungen, um Events zu filtern. Dazu stehen per Konfigurationsdialog bis zu acht Felder zur Verfügung. 72 5. Implementation 5.3.7 MonitoringEventIncluder Identisch mit MonitoringEventExcluder, allerdings wird hier eine Whitelist verwendet, so dass nur darin enthaltene Events weitergeleitet werden. Diese beiden Filter ermöglichen ein effektives, gezieltes Filtern von Events, z.B. im Szenario, dass GenMAD das Auftreten nur ganz bestimmter Events überwachen und alle anderen Events ignorieren soll. 5.3.8 MonitoringXMLWriter Bei diesem Filter handelt es sich um ein Renderer-Filter, das den eingehenden Eventstrom in eine per Property auszuwählende XML-Datei schreibt. Da Events nicht garantiert in der korrekten zeitlichen Reihenfolge eintreffen, werden sie bis zum durch Stoppen des Graphen ausgelösten Schreiben in einer sortierten Liste gehalten. Die XML-Datei folgt dabei folgender DTD: <?xml version="1.0"?> <!DOCTYPE event [ <!ELEMENT event (index, timestamp, description, shift, score, generator, sample_rate, bytes_per_sample, channels)> <!ELEMENT index (#PCDATA)> <!ELEMENT timestamp (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT shift (#PCDATA)> <!ELEMENT score (#PCDATA)> <!ELEMENT generator (#PCDATA)> <!ELEMENT sample_rate (#PCDATA)> <!ELEMENT bytes_per_sample (#PCDATA)> <!ELEMENT channels (#PCDATA)> ]> 5.3.9 MonitoringXMLReader Dieses Filter ist das einzige implementierte Quellfilter. Es liest Events aus einer XML-Datei mit dem im vorigen Abschnitt definierten Format und sendet diese an Filter stromabwärts. Um ein Reagieren auf Graphen-Befehle in Echtzeit zu ermöglichen, verwendet das Filter einen sogenannten Worker-Thread, der in einem separaten Thread das eigentliche Auslesen und Senden übernimmt. (Im Folgenden wird der Haupt-Thread des Filters einfach als Filter bezeichnet.) Der Worker läuft in einer durch das Filter terminierbaren Schleife und wartet auf Transportbefehle wie Start und Stop, die das Filter nach Erhalt durch den Flussgraphen ebenso weiterreicht wie Befehle zum Seeking. Der Worker startet, da er anders als viele andere Quellfilter im Push-Modus arbeitet, auf den Start-Befehl hin eine verschachtelte zweite Schleife. In dieser werden entweder (mehrere) neue Events aus der Datei eingelesen oder unter Verwendung der Referenzuhr des Graphen alle Events versendet, deren Zeitstempel kleiner oder gleich der aktuellen Zeit ist. Zum Lesen der Datei wird eine ereignisbasierte XML-Komponente verwendet, die auf der Grundkomponente von David Hubbard [49] beruht und um eigene Anforderungen erweitert wurde. Der Lesevorgang besteht aus den folgenden schematisch dargestellten sukzessiven Schritten: 1) 2) 3) 4) 5) Öffnen der Datei Testverfahren für Mindestlänge und enthaltene Event-Tags Ermitteln des Zeitstempels des letztes enthaltenen Events Ausführen einer Seek-Operation Lesen von maximal 65kB Daten 73 5. Implementation 6) Schließen der Datei 7) Übergabe der Daten an den XML-Parser Falls der Parser Events findet, werden diese in EventSampleObject-Objekte verpackt und zu einem Vektor hinzugefügt, der von der Sende-Schleife abgearbeitet wird. Vor- und Rücklauf werden über das Versetzen eines Positionszeigers in der Datei ausgeführt. Da die Events in einer Datei eine Start- und eine Endposition besitzen und im Allgemeinen nicht linear über ihre Zeitstempel in der Datei verteilt sind, wird ein rekursives Schätzverfahren angewandt. Es wird versucht die Dateiposition unmittelbar vor demjenigen Event zu finden, der den bezüglich des vom Graphen angeforderten nächstgrößeren Zeitstempel besitzt. Das Schätzverfahren versucht anhand bekannter Zeitstempel bekannter Events auf die Position in der Datei zu schätzen und schiebt dabei zwei eingrenzende Positionierungs-Zeiger sukzessiv auf einander zu, wie im nachfolgend etwas vereinfachten Algorithmus dargestellt: HRESULT CWorker::SeekPos(REFERENCE_TIME rtNewPos, FILE *pFile, long lEstSeekPos, XmlStream xml) { //rtNewPos: angeforderter Zeitstempel //lEstSeekPos: aktuell geschätzte Dateiposition //geschätzte Position in Datei (mit Länge lXMLSize) lEstSeekPos = min(lEstSeekPos, lXMLSize-64); //suche den dort befindlichen Event per Hilfs-Funktion if (!FindEventAtPos(lEstSeekPos, pFile, xml)) return E_FAIL; //check den gefundenen Event: exakt übereinstimmend? if (curEvent.rtTimestamp == rtNewPos) {iCurReadPos = lEstSeekPos; return S_OK;} if (curEvent.rtTimestamp < rtNewPos) { //zu früh: Variablen setzen -> Ziel eingrenzen lPosBefore = lEstSeekPos; indexBefore = curEvent.index; rtBefore = curEvent.rtTimestamp; } else [..] //zu spät -> das Gleiche für die “After”-Variablen //falls before- und after-Index aufeinanderfolgen -> gefunden! if ((indexBefore+1 == indexAfter) || (indexAfter == 0)) {iCurReadPos = lPosAfter; return S_OK;} else { //ggf. rekursiv vor- oder rückwärts weitersuchen, dazu neue Schätzung long lNewEstSeekPos = 0; //Was liegt weiter vom Ziel weg? Before- oder After-Pointer? REFERENCE_TIME rtDifBefore = rtNewPos-rtBefore; REFERENCE_TIME rtDifAfter = rtAfter-rtNewPos; // den weiter entfernten Zeiger (in gleichem Verhältnis wie den // anderen) ans vermeintliche Ziel heranschieben if (rtDifBefore > rtDifAfter) { //entweder neu anteilig berechnen oder zumindest minimal weiter! if (lPosBefore < lEstSeekPos) lNewEstSeekPos = lPosBefore + (lEstSeekPos-lPosBefore)/2; else 74 5. Implementation lNewEstSeekPos = max((lPosAfter - lPosBefore)/2, lPosBefore+256); } else [..] //entsprechend für den umgekehrten Fall //Rekursion ausführen return SeekPos(rtNewPos, pFile, lNewEstSeekPos, xml); } return S_OK; } Die Funktion FindEventAtPos() verwendet dabei den XML-Parser, um in demjenigen Bereich der Datei nach einem Event zu suchen, der sich ab der übergebenen Position erstreckt. 5.3.10 MonitoringClassifier Dieses Generatorfilter verwendet eine im Rahmen dieser Diplomarbeit konzipierte und realisierte Methode zur Klassifikation eingehender Audiosignale in Stille, Sprache oder Musik. Zur Diskriminierung der eingehenden Signale werden die folgenden Audiomerkmale verwendet: • Varianz der Zero-Crossing-Rate • Low-Energy-Frame-Percentage • Varianz des Spectral Flux • Varianz des Spectral Centroid • Varianz des Spectal Roll-Off Diese Merkmale wurden nach in verschiedenen Veröffentlichungen [108, 93, 34] publizierten Angaben zu Güte und Geschwindigkeit ausgewählt. Die Werte werden aus Hamming-Frames mit einer Fensterlänge von 512 Samples und einer Überlappung von 384 Samples gewonnen. Varianzen beruhen auf den in einem Ringpuffer gehaltenen Framewerten der letzten Sekunde. Die Diskriminierung in die genannten drei Klassen erfolgt durch ein zweistufiges Verfahren: Zunächst wird das Signal anhand eines Energiemaßes auf Stille untersucht. Zwar wurden auch andere Verfahren, wie unter anderem das von Panagiotakis & Tziritas [82] beschriebene Verfahren untersucht, die Klassifikationsleistung war jedoch bei dem Energiemaß am höchsten. Dieses vergleicht den berechneten Wert mit einem konfigurierbaren Schwellwert. Dessen Standardwert wurde empirisch ermittelt, in dem eine Auswahl von als Stille deklarierten Audiosignalen untersucht wurde. Falls keine Stille klassifiziert wurde, wird ein auf Trainingsdaten arbeitendes k-NN-Verfahren zur Klassifikation in Sprache und Musik eingesetzt, welches sich aus Gründen der Performanz eines k-d-Baumes bedient, um darin die trainierten Merkmale zu halten. k-d-Bäume sind Verwandte klassischer binärer Bäume, die – wie in der grundlegenden Arbeit von Friedman, Bentley und Finkel [39] beschrieben – d-dimensionale Daten in Zeit O(n log n) in achsenparallelen Hyperebenen ablegen können, wobei O(n) Platz benötigt wird. Dazu werden die Daten auf jeder Ebene anhand der Informationen nur einer Dimension in zwei disjunkte Teilmengen aufgeteilt. Die erwartete benötigte Zeit für die Suche im Baum beträgt lediglich O(log n) und ermöglicht daher das effiziente Ablegen sehr großer Vektorenmengen, wie in Kapitel 6 aufgezeigt. Zu jedem zu klassifizierenden Merkmalsvektor werden die im Baum befindlichen k nächsten Vektoren gefunden und in üblicher Weise anhand eines Votings zu einer Entscheidung 75 5. Implementation herangezogen. Inspiriert von dem von El-Maleh et al. [34] vorgeschlagenen Verfahren werden anschließend vorige Klassifikationen zu einer Mehrheitsentscheidung verwendet, um das Auftreten von Ausreißern zu minimieren. Im Gegensatz zu dem von El-Maleh vorgeschlagenen Verfahren, das nur drei Klassifikationen in das Voting mit einbezieht, arbeitet die hier verwendete Methode auf den Ergebnissen der letzten 250ms. Ein positiver Nebeneffekt ist die dadurch deutlich reduzierte Anzahl versendeter Klassifikationsevents. Die Konfigurations-Parameter und verschiedenen Modi des Filters für das Trainieren und Erkennen von Signalen sind in Anhang F beschrieben. 5.3.11 Weitere filterbasierte Problemlösungen Zwei weitere zu Beginn des 4. Kapitels genannte Ziele lassen sich über bereits bestehende Filter lösen: • Zum einen erlauben Capturing-Quellfilter, die üblicherweise als Teil der Treiberarchitektur eines Soundchips installiert werden und sich in Ausstattung und Parametern zum Teil stark unterscheiden, das Verwenden von in Echtzeit in den Rechner eingehenden Online-Audiodaten. In einem Graphen lassen sich solche Filter wie gewöhnliche Datei-Quellfilter verwenden. Allerdings können aus offensichtlichen Gründen keine Seeking-Funktionen verwendet werden. Auch andere zeitbasierte Mechanismen können je nach Capturing-Filter eingeschränkt sein. • Auch das Mitschneiden von Audiosignaldaten ist durch eine Kombination zwei Filter möglich. Dazu wird ein Wavedest genanntes Filter verwendet, das Teil des DirectX9-SDK ist und intern die für WAV-Dateien nötige Formatierung zu den reinen Datenblöcken hinzufügt. Der Ausgangspin dieses Transform-Filters muss mit einem „File Writer“-Filter verbunden werden, welches standardmäßig mit DirectX installiert wird. Der Pfad der Zieldatei kann dabei frei gewählt werden. 76 Kapitel 6 Anwendungen, Tests und Bewertungen 6.1 Test des Klassifikationsfilters Um verschiedene Eigenschaften des in Abschnitt 5.3.10 erläuterten MonitoringClassifier-Filters zu evaluieren, wurde eine Serie mehrerer Tests durchgeführt, die nachfolgend beschrieben sind. Dazu wurde zunächst der Einfluss verschiedener Parameterwerte und Verschaltungsmuster auf die Klassifikationsleistung untersucht, bevor in zwei abschließenden Tests die korrekte Klassifikation von zwei längeren Radiomitschnitten mittels eines komplexeren Projektes getestet wurde. 6.1.1 Datenauswahl Training und Parametertests wurden anhand von zwei Mengen aus Signaldaten durchgeführt, wobei jede Menge aus ca. 15 Sekunden langen Audioelementen eines Datentyps besteht und insgesamt je 20 Minuten umfasst. Zusätzlich wurde ein 90 Sekunden langes Stück aus verschiedenen, sehr leisen Signalen verwendet, um den Standardwert des im Filter enthaltenen separaten Stille-Erkennungsmoduls zu ermitteln. Wichtiges Ziel bei der Auswahl der Trainingsdaten war es, ein möglichst weites Spektrum verschiedener Musikgenres und Stimmen miteinzubeziehen, insbesondere weil der Klassifikator anhand von Radiomitschnitten getestet werden sollte. Die Daten entstammen daher sowohl FM-Radioaufnahmen, CDs als auch MP3s in unterschiedlichsten Qualitätsstufen und enthalten neben populärer Musik und Rock auch Klassik, Jazz, Ambient, elektronische Dancemusic und Schlager. Ähnlich sorgfältig wurden männliche wie weibliche Stimmen in verschiedenen Stimmungen und Lautstärken verwendet, wobei diese teilweise mit Hintergrundrauschen unterlegt sind oder einem telefonartigen Effekt unterliegen. Neben deutschen Stimmdaten sind weiterhin auch englische, französische, niederländische und japanische Elemente enthalten. Um die auch für Menschen oft schwierige Unterteilung in Musik oder Sprache zu unterstützen, wurden auch rein vokale Versionen von Popstücken als Sprache beschriftet. Die Trainingsdaten sind dabei mit einer Abtastrate von 44,1 kHz und in 16 Bit Qualität abgespeichert. Wurden für einen Test Signale in niedrigerer Qualität benötigt, so wurden diese mittels der Software CoolEdit heruntergerechnet. 77 6. Anwendungen, Tests und Bewertungen 6.1.2 Audiomerkmale Vier der fünf verwendeten Audiomerkmale (Zero-Crossing-Rate, Spectral Flux, Spectral Centroid und Spectral Rolloff) arbeiten nicht auf den eigentlich berechneten Werten, sondern den daraus abgeleiteten Varianzwerten, und auch das Low-Energy-Percentage-Merkmal greift auf laufende RMSMittelwerte zurück. Da zur Berechnung von Mittelwerten und Varianzen die Werte der vergangenen Sekunde herangezogen werden, haben alle Merkmale eine Latenz genannte Verzögerung gegenüber den Audiodaten von einer Sekunde. Aus Gründen der Performanz wurden die zur Spektraltransformation nötigen Berechnungen nur einmal je Frame durchgeführt. Da die Berechnung von STFT und Varianzen den Hauptteil der Rechenzeit ausmacht, ist der Einfluss der verschiedenen Merkmale auf die Gesamtrechenzeit bei allen annähernd gleich gering. Um die Diskrimierungsfähigkeit der einzelnen Merkmale zu untersuchen, wurden in Excel Histogramme zu den bei der Verarbeitung eine Menge von mehreren Tausend Frames entstehenden Merkmalsdaten von Musik- und Sprachdaten erstellt. Diese sind in Abbildung 6.1 dargestellt. Spectral Flux Spectral Centroid 900 3500 800 3000 700 2500 Häufigkeit Häufigkeit 600 500 400 2000 1500 300 1000 200 500 100 0 2,44E+04 1,02E+06 2,02E+06 3,02E+06 4,02E+06 0 2,13E-07 5,02E+06 5,39E-04 Spectral Centroid (Hz) 900 450 800 400 700 350 600 300 500 400 200 150 200 100 100 50 0 69,77% 2,70E-03 250 300 54,80% 2,16E-03 Spectral Roll-Off 500 Häufigkeit Häufigkeit Low-Energy-Percentage 39,82% 1,62E-03 Spectral Flux - Wert 1000 24,85% 1,08E-03 84,74% 99,71% 0 8,34E+04 4,28E+06 8,48E+06 1,27E+07 1,69E+07 2,11E+07 Spectral Roll-Off (Hz) Low-Energy-Percentage ZCR 1200 1000 800 600 400 200 0 3 766 1528 2290 3053 3815 ZCR Abb. 6.1: Histogrammdarstellungen zur Diskrimierungsleistung der einzelnen Merkmale. Dabei sind jeweils vertikal die Häufigkeit und horizontal die sortierten Merkmalswerte (in je 100 Bins) aufgetragen. Die Merkmale der Musikdaten sind jeweils blau, die der Sprachdaten rosa markiert. 78 6. Anwendungen, Tests und Bewertungen Kl assi f i kat i o n vo n M usi kd at en Klassifikation von Sprachdaten 100% 100% 80% 80% 60% 60% 40% 40% 20% 20% 0% 1 M i nut e 5 M i nut en 10 M i nut en Sons t i ges 3, 43 1, 53 0, 52 Spr ac he 19, 3 29, 19 36, 54 M us i k 74, 68 66, 85 60, 3 St i l l e 2, 6 2, 45 2, 66 0% 1 Minute 5 Minuten 10 Minuten Sonstiges 1,01 0,62 0,16 Sprache 48,36 50,65 53 Musik 33,68 31,95 32,76 Stille 14,96 16,79 14,1 Abb. 6.2: Klassifikationsleistung jeweils als Diagramm und als Matrix. Auf der linken Seite ist die Klassifikation von Musikdaten, auf der rechten die von Sprachdaten abgebildet. Zu sehen sind korrekte und falsche Zuordnungen in Abhängigkeit der Verteilung der Grunddaten auf Trainings- und Testdaten. Die Zeitangaben entsprechenden dem Anteil der zum Training verwendeten Daten der jeweiligen Klasse. Klassifikationsparameter: 44,1kHz Abtastrate, k=5, 3-Frame-Nachbearbeitung (siehe Abschnitt 6.1.6) In der Abbildung zeigt sich, dass jedes Merkmal mehr oder weniger gut getrennte Wertebereiche bezüglich der beiden Klassen besitzt. 6.1.3 Einfluss der Anzahl von Trainings- und Testdaten In diesem Test wurde untersucht, in welchem Maß die Anzahl der Trainings- und Testdaten die Klassifikationsleistung beeinflusst. Dazu wurden die 20 Minuten Daten jeder Klasse nacheinander in zwei verschiedene disjunkte Mengen von Trainings- und Testdaten unterteilt und die resultierende Klassifikationsleistung für die beiden Klassen separat gemessen. Alle Varianten wurden mehrfach kreuzvalidiert, um den Einfluss einzelner Audiofragmente zu minimieren. Die Klasse Sonstiges enthält die unklassifizierten Merkmalsvektoren. Dieses Verfahren wurde auch in den nachfolgenden Parametertests verwendet. Das Ergebnis ist in Abbildung 6.2 dargestellt. Zu erkennen ist, dass Sprachdaten zwar mit steigender Menge an Trainingsdaten besser erkannt werden, dass Musik jedoch immer weniger korrekt eingeteilt wird. Dabei nimmt die Qualität der Zuordnungen für Musik schneller ab als sie für Sprache zunimmt, vermutlich bedingt durch die Wahl der Trainingsdaten. Auffällig ist weiterhin die hohe Falschklassifikation von Sprache als Stille. Dies ist insofern nicht verwunderlich, als Sprache im Allgemeinen viele Lücken im Sprachfluss beinhaltet, die als Stille interpretiert werden können. Um den Einfluss der Erkennung von Stille zu eliminieren, wurde eine vereinfachte zweite Testreihe durchgeführt, die mit der gerade vorgestellten bis auf das ausgeschaltete Stille-Erkennungsmodul identisch ist. Die in Abbildung 6.3 gezeigten Ergebnisse bestätigen den Trend der ersten Messungen. In den nachfolgenden Tests wird daher, falls nicht anders angegeben, eine Trainingsmenge von je einer Minute pro Klasse verwendet und die Klassifikationsleistung mittels 19 Minuten Testdaten eruiert. Die Erkennung von Stille ist deaktiviert. Klassifikation von Musikdaten, ohne Stille K l a s s i f i k a t i on v on Spr a c hda t e n, ohne St i l l e 100% 100% 80% 80% 60% 60% 40% 40% 20% 20% 0% 0% 1 M i nut e 1 Minute 10 Minuten Sonstiges 2,02 1,07 Sons t i ges Sprache 15,95 38,26 Musik 82,03 60,67 10 M i nut en 4, 21 0, 06 Spr ac he 52, 04 60, 43 M us i k 43, 75 39, 51 Abb. 6.3: Klassifikationsleistung ohne Stille-Erkennung jeweils als Diagramm und als Matrix. Alle Parameter sind identisch mit den in Abb. 6.2 gezeigten Messungen. 79 6. Anwendungen, Tests und Bewertungen Klassikation von Sprachdaten Klassifikation von Musikdaten 100% 100% 80% 60% 50% 40% 20% 0% 44. 1kHz 22. 05k Hz 11. 025k Hz 8k Hz 3, 64 0 0 0 Spr ac he 20, 02 20, 48 28, 58 39, 93 M us i k 76, 35 79, 52 71, 42 60, 07 Sons t i ges 0% 1 2 3 4 5 Sonstiges 4,845 1,04 0,36 0,01 0,05 Sprache 54,73 67,58 75,48 78,12 70,36 Musik 40,43 31,37 24,465 21,87 29,6 Abb. 6.4: Klassifikationsleistung jeweils als Diagramm und als Matrix. Klassifikationsparameter: k=5, 3Frame-Nachbearbeitung (siehe Abschnitt 6.1.6) 6.1.4 Einfluss verschiedener Abtastraten Da Audiodaten in sehr unterschiedlichen Qualitätsstufen zu finden sind, wurde in diesem Test die Klassifikationsleistung bei Veränderung der Abtastrate untersucht, wie in Abbildung 6.4 dargestellt. Dabei wurden sowohl Trainings- als auch Testdaten mit derselben Abtastrate verwendet. Interessanterweise scheint die Klassifikation von Musikdaten am besten bei einer Abtastrate von 22,05 kHz zu funktionieren, während es bei Sprachdaten 8 kHz sind. Als Mittelweg werden daher in den nächsten Tests meist Daten mit einer Abtastrate von 11,025 kHz verwendet. 6.1.5 Einfluss der Fensterweite Getestet wurden die in den anderen Tests verwendete Fensterweite von 512 Samples, mit 384 Samples Überlappung, sowie die entsprechenden Paare 256/128 und 1024/512. Wie schon von Scheirer & Slaney [93] vermutet, konnte kein nachhaltiger Einfluss der Fensterweite oder der Überlappung auf die Klassifikationsleistung festgestellt werden. 6.1.6 Vergleich verschiedener Nachbearbeitungsmechanismen In der Publikation von El-Maleh et. al [34] wird ein Verfahren beschrieben, das darauf abzielt, das schnelle Wechseln von Klassenzuordnungen mittels eines laufenden 3-Frame-Votings in der Nachverarbeitung zu unterbinden. In einem Test wurde dieses Verfahren sowohl einem modifizierten Ansatz als auch der Klassifikation ohne entsprechende Nachbearbeitung gegenüberstellt. Das modifizierte Verfahren führt ein Voting auf der Menge von Merkmalsvektoren durch, die in den vorigen 250ms erzeugt wurden. Bei einer Fensterweite von 512 und einer Überlappung von 384 Samples sind dies bei 44,1 kHz ungefähr 28 Vektoren. Die Ergebnisse der drei Verfahren variierten allerdings nur um wenige Zehntel-Prozentpunkte. Im Fall des modifizierten Verfahrens wird jedoch eine bis zu 28-fache Verringerung der Anzahl zu versendender Eventausgaben des Filters erreicht, was der Performanz zu Gute kommen dürfte. Daher verwenden nachfolgende Tests dieses modifizierte Verfahren zur Nachverarbeitung von Klassifikationsereignissen. 80 6. Anwendungen, Tests und Bewertungen Klassifikation von Sprachdaten K l a s s i f i k a t i on v on M us i k da t e n 100% 100% 80% 80% 60% 60% 40% 40% 20% 20% 0% k =1 k=5 0 0 Spr ac he 23, 02 28, 58 M us i k 76, 98 71, 42 Sons t i ges 0% k=1 k=5 Sonstiges 0,05 0,36 Sprache 70,24 75,48 Musik 29,71 24,47 Abb. 6.5: Klassifikationsleistung jeweils als Diagramm und als Matrix. 6.1.7 Einfluss der Parameter des k-NN-Verfahrens In diesem Test wurde untersucht, wie sich die Klassifikationsleistung des Filters verändert, wenn verschiedene Werte für k verwendet werden, also für die Anzahl der im k-NNKlassifikationsverfahren dem Suchvektor nächstliegenden Trainingsvektoren. Die Ergebnisse sind in Abbildung 6.5 dargestellt und zeigen ein uneinheitliches Bild, in dem sich für verändernde k-Werte die Klassifikationsleistung von Musik- und Sprachdaten jeweils entgegengesetzt verbessert bzw. verschlechtert. 6.1.8 Parallelklassifikation mit verschiedenen Abtastraten In diesem Test wurde untersucht, ob sich mittels einer Parallelklassifikation durch zwei entsprechende Pipelines eine Verbesserung der Klassifikationsleistung erreichen lässt. Grundlage dafür war die in Abschnitt 6.1.4 erläuterte unterschiedliche Beobachtung, dass Sprache bei niedrigeren Abtastraten, Musik dagegen bei höheren Abtastraten besser erkannt wird. An dieser Stelle kommt die flexible durch GenMAD ermöglichte Signalverschaltung zum Einsatz, wie in Abbildung 6.6 aufgezeigt. Da zum Zeitpunkt des Testens kein hochwertiges Filter zum EchtzeitDownsampling der verwendeten 19 Minuten langen Test-Audiodatei vorhanden war, wurde diese extern mit CoolEdit auf 8 kHz heruntergerechnet und als separate Datei eingebunden. Weiterhin kamen in jeder Pipeline Equalizer zum Einsatz, die dem jeweiligen Klassifikator sowohl im Trainings- als auch im Erkennungsmodus vorgeschaltet waren. Ziel der Verschaltung war es, je eine Pipeline zur Erkennung von Musik und Sprache zu verwenden, deren Ausgaben durch ein MonitoringEventMerger-Filter zusammengeführt werden, wobei die Signale und Klassifikatoren jeder Pipeline auf höchste Klassifikationsleistung der jeweiligen Klasse optimiert werden. Die Ergebnisse dieses Tests sind in Abbildung 6.7 visualisiert. Abb. 6.6: GenMAD-Projekt mit zwei parallel arbeitenden Klassifikationspipelines. 81 6. Anwendungen, Tests und Bewertungen Klassifikation von Sprachdaten Klassifikation von Musikdaten Gesamtklassifikationsleistung 100% 100% 80 90% 80% 70 80% 70% 60% 60 60% 50 50% 40% 40% 40 30% 20% 30 20% 10% 0% 44.1kHz 8kHz Gesamt Sonstiges 4,55 0 2,82 Sprache 21,43 32,98 18,85 Musik 74,02 67,02 78,33 0% 20 44.1kHz 8kHz Gesamt 5,18 0 3,17 Sprache 55,54 78,58 63,96 Musik 39,28 21,42 32,87 Sonstiges 10 0 korrekt (%) 44.1kHz 8kHz Gesamt 64,78 72,8 71,15 Abb. 6.7: Links und in der Mitte: Klassifikationsleistung jeweils als Diagramm und als Matrix. Rechts: Gesamtleistung. Klassifikationsparameter: k=5, Merger: Diffusion=5, Gewichtung=0, SegmentMindestLänge=0 Wie erwartet erreichten beide Pipelines akzeptable Ergebnisse in ihren Spezialgebieten, die jedoch durch die jeweils entgegengesetzte Klassifikationsaufgabe wieder etwas entwertet wurde. Wie aus dem Gesamtüberblick erkennbar, ist die Leistung des 8 kHz-Klassifikators sogar etwas höher als die der Pipeline-Kombination. Bemerkenswert ist darüber hinaus, dass das Kombinatorfilter zu einer höheren Gesamtleistung führt als der Mittelwert der beiden Pipelines, so dass durch geeignetes Abstimmen der Merger-Parameter sowie durch optimierteren Einsatz der Equalizer (und weiterer Vorverarbeitungsschritte) eine höhere Leistung zu erwarten sein sollte. Der Vorteil der GenMAD-Plattform ist hier die Möglichkeit, mit wenig Aufwand neue Signalverarbeitungskaskaden zu testen. Auch wenn sich in diesem Test noch keine Verbesserung der Leistung ergab, wurde das Prinzip doch im nachfolgenden Abschlusstest eingesetzt. 6.1.9 Klassifikationsleistung anhand von Radiomitschnitten In diesem abschließenden Test sollte die Gesamtklassifikationsleistung anhand von zwei Radiomitschnitten ausführlich eruiert werden. Zunächst wurde ein 45 Minuten langer Mitschnitt eines per Internet mit 48 kbps gestreamten Radiosenders mit Schwerpunkt Rockmusik (StarFM 87,9, Berlin) untersucht, wobei der Projektaufbau dem in 6.1.8 gleicht. Anders als in den vorigen Funktionstest handelt es bei den Testdaten also nicht um Daten von jeweils nur einem Typ, vielmehr wechseln sich Musik und Sprache wie in vom Radio gewohnter Weise ab. Daher wurden der Parameter des Kombinatorfilters auf eine Mindest-Segmentlänge von vier Sekunden angepasst und die Gewichtung der mit 44,1 kHz arbeitenden Pipeline auf 1.5 erhöht, da durch die minderwertige Güte des Eingangssignals mit einer schlechten Klassifikationsleistung der anderen Pipeline zu rechnen war. Um die Klassifikationen bewerten zu können, wurden sie mit einer manuell durchgeführten Unterteilung verglichen, indem ein Excel-Makro nachträglich korrekte und fehlerhafte Zuordnungen der beiden Pipelines und des Gesamtergebnisses untersuchte. Die dabei erstellten Logdaten erlauben darüber hinaus einen Einblick in die Ursachen fehlerhafter Klassifikationen. Die Ergebnisse sind in Tabelle 6.8 aufgeführt. Die Gesamtleistung wurde anhand der Ausgabe des Kombinatorfilters gemessen. Da keine Klassifikation in Sonstiges oder Stille stattfand, sind diese Klassen nicht aufgeführt. Gesamte korrekte Klassifikation Gesamte falsche Klassifikation Musik korrekt klassifiziert Musik falsch klassifiziert Sprache korrekt klassifiziert Sprache falsch klassifiziert 44,1 kHz 82,38 17,62 88,56 11,44 70,11 29,89 8 kHz 66,82 33,18 69,84 30,16 60,85 39,15 Kombination 83,77 16,23 90,52 9,48 69,18 30,82 Tab.6.8: Übersicht über die Klassifikationsleistung (in %) der beiden Pipelines und der Kombination im Radiotest 1. 82 6. Anwendungen, Tests und Bewertungen Gesamte korrekte Klassifikation Gesamte falsche Klassifikation Musik korrekt klassifiziert Musik falsch klassifiziert Sprache korrekt klassifiziert Sprache falsch klassifiziert Stille korrekt klassifiziert Stille falsch klassifiziert 44,1 kHz 56,6 43,4 49,56 50,44 82,47 17,53 66,67 33,33 8 kHz 75,85 24,15 74,51 25,49 80,79 19,21 77,78 22,22 Kombination 63,71 36,29 57,23 42,77 84,92 15,08 86,67 13,33 Tab.6.9: Übersicht über die Klassifikationsleistung (in %) der beiden Pipelines und der Kombination im Radiotest 2. Auffällig ist hier zum einen, dass der auf 44,1 kHz operierende Klassifikator wie vermutet in beiden Fällen signifikant besser arbeitet als der 8 kHz-Klassifikator. Dies scheint auf die ohnehin hohe Komprimierung der Testdaten zurückzuführen zu sein, so dass die Verbindung von dem mit 48 kHz kodierten Signal und dem Downsampling auf 8 kHz eine zu starke Verzerrung erzeugte. Zum anderen wird hier im Gegensatz zum Test in 6.1.8 eine Verbesserung der Gesamtleistung in Folge der Kombination der beiden Pipelines sichtbar. In den Logdaten zeigt sich, dass alle drei gemessenen Ereignisreihen aus langen Passagen mit einer Klassifikation bestehen, die in mehr oder weniger häufigem Maß durch Ausreißer (Fehlklassifikationen) von ca. 1-20 Sekunden Länge unterbrochen werden. In der 44,1 kHzPipeline sind die Ausreißer seltener und von gleichmäßigerer Art und Länge als in der mit 8 kHz arbeitenden Pipeline, wo oftmals ein Wechsel zwischen 2-3 Sekunden langen Folgen zu beobachten ist. Die Häufigkeit dieser Ausreißer scheint das Hauptkriterium der Klassifikationsleistung zu sein, da komplette Falschklassifkationen über lange Zeiträume selten sind. Parametrisiert durch den Diffusionswert und die Segmentmindestlänge glättet das MonitoringEventMerger-Filter diese Ausreißer bis zu einem gewissen Maß. Hier kann durch eine feinere Anpassung des Parameter des Kombinatorfilters sicherlich die Leistung weiter erhöht werden. Weiterhin sichtbar wird, dass die 8 kHz-Pipeline oftmals eine Verzögerung gegenüber der manuell durchgeführten Klassifikation ausweist, wenn dort ein Klassenwechsel stattfindet. In einem zweiten Test wurde eine in CD-Qualität aufgenommene Radiosendung von ebenfalls 45 Minuten Länge dem gleichen Testverfahren unterzogen. Dabei wurde bewusst ein Sender (JamFM) gewählt, der wie viele der großen Radiostationen fast ausschließlich R’n’B und souligen Hiphop spielt. Die Teilergebnisse sind in Tabelle 6.9 zusammengefasst. Auch hier wurden keine Daten als Sonstiges klassifiziert. Da der Anteil falsch klassifizierter Stille-Daten minimal ist, wird auf eine Konfusionsmatrix zugunsten der Vergleichbarkeit verzichtet. Die sowohl schlechtere Klassifikationsleistung insgesamt als auch das im Gegensatz zur 8 kHz-Pipeline schlechtere Ergebnis der Kombination erklären sich aus dem Ablauf-Log: Anders als im Rock-Test findet man hier nicht nur ein häufiges Springen zwischen den Klassen, sondern auch lange falsch klassifizierte Passagen. Insbesondere wurde, wie auch aus Tab.6.9 zu entnehmen, oft Musik als Sprache eingeordnet. Stille dagegen wurde meist korrekt erkannt, in manchen Fällen jedoch mit einer leichten Verzögerung, die allerdings auch in den anderen beiden Klassen mit bis zu vier Sekunden auftrat. Die Falschklassifikation von Musik als Sprache scheint bei Analyse des Audiomaterials durch die Art der Musik begründet: So ist es in den aktuellen Fassungen der genannten Genres weit verbreitetes Stilmittel, den Instrumentalanteil auf sehr minimale percussive Elemente und punktuelle Basseinsätze zu reduzieren und die Stimmen stark hervorzuheben. Durch das Fehlen konstanter Hintergrundmusik wurde daher scheinbar der Stimmanteil oft als Sprache klassifiziert. 83 6. Anwendungen, Tests und Bewertungen Da auf der anderen Seite Radioansagen und sogar Nachrichtensendungen mehr und mehr mit Musik unterlegt werden, schwindet die auch für Menschen leicht zu trennende Grenze zwischen Musik und Sprache. Abhilfe könnte möglicherweise der geschickte Einsatz von Rhythmikanalysemodulen und -merkmalen bringen, wie das von Tzanetakis et al. zur musikalischen Genreklassifikation eingesetzte Verfahren [108]. Auch die von Scheirer et al. [92], Alonso et. al [3] und anderen Arbeitsgruppen veröffentlichten Publikationen beschäftigen sich mit dem Gebiet der Tempo- und Beatberechnung bzw. -schätzung, so dass Fortschritte bezüglich dieser Klassifikationsproblematik zu erwarten sind. 6.2 Performanz des GenMAD-Systems In diesem Abschnitt sollen die Ergebnisse verschiedener Tests präsentiert werden, anhand der die Performanz der entwickelten Filter und der GenMAD-Applikation überprüft wurde. Das Testsystem bestand aus einem mit 2,66GHz getakteten Pentium-4-Prozessor und einer Hauptspeichergröße von 512MB. Die abgebildeten Prozessorlastangaben sind gemittelte Schätzwerte. 6.2.1 Performanz der entwickelten Filter Das einzige der entwickelten Filter, dessen Speicherbedarf nicht nahe bei Null liegt, ist das MonitoringClassifier-Filter: Jede Instanz des MonitoringClassifier-Filters belegt einen Hauptspeicherplatz von etwa 60MB. Dieser Bedarf entsteht durch Variablenfelder konstanter Größe, die für die Verwaltung der Baumdaten benötigt werden. Ein ähnlich einseitiges Bild zeigt sich auch beim Test der Prozessorlast: Selbst bei Verschaltung von zwölf Filter-Instanzen in einem GenMAD-Projekt benötigt keines der rein ereignisbasierten Filter mehr als ein oder zwei Tausendstel der CPU-Leistung. Auch in Kombination, also z.B. in Form eines Projektes von je zwölf MonitoringXMLReadern, MonitoringEventSplittern und MonitoringXMLWritern, beträgt die Gesamtlast etwa 1%. Anders im Fall des Klassifikatorfilters: Falls das gesamte Projekt über nur eine Mediendatei in CD-Qualität durch ein nachgeschaltetes Audiosplitterfilter mit Daten beliefert wird, ist die Prozessorlast wie zu erwarten eine lineare Funktion der Zahl von Instanzen, wie in Abbildung 6.10a dargestellt: Jede Instanz benötigt etwa 5% Prozessorleistung. Verändert man die Abtastrate der Eingabedatei, so zeigt sich wiederum ein lineares Verhältnis, wie in Abbildung 6.10b dargestellt. Die dort abgebildeten Werte entsprechen der Last in einem Projekt mit zwölf Klassifikatorfiltern. Wird jedes Filter mit einer eigenen Audiodatei gespeist, so sind die Zusammenhänge nahezu identisch mit den in 6.10b abgebildeten Daten. Es scheint also – einen schnellen Dateizugriff vorausgesetzt – keinen Unterschied zu machen, ob aus verschiedenen Datei gestreamt wird oder ob ein Audiosplitterfilter einen eingehenden Datenstrom in verschiedene Datenströme aufteilt. Auch der Einfluss der Bitzahl je Sample eines Datenstroms auf die Prozessorlast scheint einer linearen Funktion zu folgen. Im Fall von vier Klassifikatorfiltern liegt die CPU-Auslastung bei 16 Bit Auflösung bei 19%, während es bei 8 Bit nur 11% sind. Der Einfluss mehrerer Datenkanäle ist zu vernachlässigen, da nur der linke Monokanal verwendet wird. Um auch den Einfluss des Audentify!-Filters zu testen, wurden in gleicher Weise wie im Falle des Klassifikatorfilters mehrere Instanzen in ein Projekt eingefügt. Die Filter greifen dabei auf verschiedene Indexdateien gleichen Inhalts zu. Aufgrund der großen, durch die DLL angeforderten Pufferlänge zeigt sich ein konstantes Bild von ca. 2% Last zwischen den Bearbeitungsphasen der DLL. Wird der Pufferinhalt bearbeitet, kommt es allerdings zu Leistungsspitzen von bis zu ca. 18% CPU-Last. Ab einer Zahl von drei Instanzen stürzt die DLL jedoch reproduzierbar ab, wodurch weitere Tests verhindert werden. 84 6. Anwendungen, Tests und Bewertungen 6.10b: Prozessorlast in Abh. der Abtastrate (Projekt mit 12 Klassifikatorfiltern) 6.10a: Klassifikator-Prozessorlast 70 70 60 Prozessorlast (%) Prozessorlast (%) 60 50 40 30 20 50 40 30 20 10 10 0 0 0 0 2 4 6 8 10 Anzahl Instanzen 12 14 10 20 30 40 50 Abtastrate (kHz) Abb. 6.10a, b Die Prozessorlast von Filter-Pipelines berechnet sich durch die modulare Filterstruktur von GenMAD direkt aus der den oben untersuchten Eigenschaften des Datenstromtyps und der Last der enthaltenen einzelnen Filter. Die entwickelten Filter besitzen also insgesamt gute Skalierungseigenschaften. Durch etwa den Einsatz von Pipelinekombinationen, wie in Kapitel 6.1 dargestellt, lassen sich dabei die Vorteile der unterschiedlichen Klassifikationsleistungen und der skalierbaren Prozessorlast vereinen. Die im Vergleich zu Audiodaten sehr geringe Datengröße von Ereignisdaten erlaubt darüber hinaus den zahlreichen, flexiblen Einsatz ereignisbasierter Filter, mittels denen ein Verarbeitungsnetzwerk zur Unterstützung von Klassifikation oder Identifikation umgesetzt werden kann. Die ungenutzte Prozessorleistung kann dann effektiv in Form hochwertiger Vorverarbeitungsfilter eingesetzt werden, wie in Kapitel 6.3 gezeigt. 6.2.2 Performanz von GenMAD Die Laufzeitleistung von GenMAD wird fast ausschließlich durch die im Datenflussgraphen enthaltenen Filter bestimmt. Lediglich die Visualisierung der verarbeiteten Daten benötigt in wesentlichem Maße Rechenzeit. Auch ohne eingehende Daten schlägt das offene Visualisierungsfenster mit ca. 4% Prozessorlast zu Buche. Für die datenbezogene CPU-Last muss zwischen Ereignis- und Audiodaten unterschieden werden: Die Audiodatenanzeige benötigt unabhängig vom Rest des Projektes ca. 10% der Prozessorleistung. Ist der Audiofokus keinem Filter zugewiesen, wird keine Prozessorlast verursacht. Die Darstellung von Eventdaten scheint ebenfalls einem linearen Verlauf zu folgen, bei dem je Event-Visualisierungsfilter 0,5% der Prozessorleistung benötigt werden. 6.3 Anwendungen GenMAD bietet vielfältige Ansätze für Monitoring-Anwendungen. Diese ergeben sich vor allem aus den Mitteln zur flexiblen Erzeugung und Bearbeitung des Datenflussgraphen in Kombination mit einer großen Menge von hochwertigen, durch Dritte entwickelten Filtern. Die im Monitoring stets präsenten Bereiche Vorverarbeitung, Analyse und Nachverarbeitung profitieren dabei alle von den gebotenen Möglichkeiten: Die Unterstützung aller gängigen Audioformate und die Verwendbarkeit von Capturingfilter erlauben den Einsatz in vielen verschiedenen Umgebungen. Ein Einsatzgebiet besteht z.B. in der Verwendung eines in Echtzeit eingehenden Videosignals, dessen Audiokanal für Monitoringzwecke eingesetzt wird. Hinzu kommt die Möglichkeit, Dateien über das Internet 85 6. Anwendungen, Tests und Bewertungen miteinzubeziehen. Auf diese Weise lassen sich auch servergestützte Projekte erzeugen, um z.B. öffentlich publizierte Nachrichtensendungen oder Onlineradiosendungen zu verwenden. In der Vorverarbeitung können beliebige Kombinationen hochwertiger Filterungs- und Effektmodule eingesetzt werden, um eingehende Datenströme zu transformieren. Ein Beispiel dafür ist etwa der in Abbildung 6.6 dargestellte Einsatz eines Equalizerfilters, der gezielt bestimmte Frequenzbereiche verstärkt bzw. vermindert, um den nachfolgenden Klassifikationsfiltern ein möglichst gut auf ihren Zweck zugeschnittenes Frequenzspektrum zu bieten. In ähnlicher Art können Sprachverarbeitungsfilter wie De-Esser zum Einsatz kommen, die Störlaute reduzieren. Ein übliches Problem bei der Verwendung von in Echtzeit über Capturingfilter eingehenden Signalen ist Rauschen, welches durch De-Noiser-Module vermindert werden kann. In vielen publizierten Verfahren werden Hoch- oder Tiefpassfilter eingesetzt, um das Frequenzspektrum einzugrenzen. Auf der anderen Seite ist es durch künstliches Einstreuen von Störungen und Signalverzerrungen genauso möglich, eine Simulationsumgebung zu erzeugen, die Parameterabstimmungen im Voraus für bestimmte Einsatzzwecke ermöglicht, etwa um die in einer Live-Aufnahme oft auftretenden Hintergrundgeräusche zu vermindern. Durch den Einsatz von Hall- und Verzögerungseffekten, vielleicht sogar in Verbindung mit zusätzlichen Beispieldaten typischer Hintergrundgeräusche, läßt sich ein fertiges Projekt für den Live-Einsatz vorbereiten, das den eventuellen Gegebenheiten Rechnung trägt. Ein großes Potential bietet auch die Verwendung von Pipelines, die durch Splitterfilter verteilte Datenströme unabhängig von anderen Signalwegen bearbeiten können. Dies kann z.B. zu Vorverarbeitungszwecken im Sprachmonitoring eingesetzt werden, indem eine Pipeline durch ein Hochpassfilter nur die oberen Frequenzbereiche eines Signals manipuliert, während in einer zweiten Pipeline unter Verwendung einer Tiefpassfilters der Bassanteil bearbeitet wird. Verwandt mit diesem Ansatz sind Projekte zur Analyse räumlicher Informationen. Dazu können Signale in den beiden Kanälen eines Stereosignals separat analysiert werden, um eine Signalquelle zu lokalisieren, etwa ein Vogelruf in einer Monitoringaufnahme in der Natur. Neben der Parallelverarbeitung reiner Audiodaten lassen sich auch Kombinationen aus Audio- und Eventdaten nutzen, um einen Mehrwert aus der Verwendung von Pipelines zu ziehen. Ein wichtiges solches Beispiel ist der in Abbildung 6.6 dargestellte und in den Anschnitten 6.1.8 und 6.1.9 untersuchte Ansatz, ein Audiosignal auf verschiedene Weisen vorzuverarbeiten, separat zu klassifizieren und die Eventdaten mittels eines Kombinatorfilters wieder zusammenzuführen. Auf diese Weise lassen sich Analyse- und Verarbeitungsmodule optimal aufeinander abstimmen und können, wie in 6.1.9 gezeigt wird, zu höheren Klassifikationsleistungen führen. In ähnlicher Weise ist der Aufbau einer parallel arbeitenden Filterbank möglich, die Analysen verschiedener Frequenzbänder zusammenführt, wie in Abbildung 6.11 dargestellt. Dazu wird das Signal zunächst auf vier Pipelines aufgeteilt, von denen jede das Signal durch ein Filtermodul auf einen bestimmten Frequenzbereich eingrenzt, das veränderte Signal klassifiziert und die generierten Eventdaten durch eine Kaskade von Kombinatorfiltern an einen XMLWriter-Filter übergibt. Durch das Hinzufügen zusätzlicher EventExcluder- oder Includerfiltern läßt sich das Auftreten bestimmter Ereignisse in einem Frequenzband herausfiltern. Durch die Möglichkeit Eventdaten aufzuzeichnen, lassen sich z.B. Identifikationsdaten archivieren und später zu Vergleichszwecken einsetzen, etwa im Rahmen einer Szenenanalyse. Ein solches Projekt ist in Abbildung 6.12 dargestellt. Dort werden zwei Pipelines zusammengeführt: In der einen werden in Echtzeit in den Rechner eingehende Signale per Audentify! auf bekannte Audiostücke hin untersucht, die daraus entstehenden Eventdaten mittels eines EventIncluder-Filters auf eine Menge erlaubter Ereignisse eingegrenzt, zur Visualisierung an GenMAD und anschließend an den Kombinator übergeben. Parallel dazu werden archivierte Eventdaten eingelesen, visualisiert und ebenfalls in den Kombinator eingespeist, der das Ergebnis 86 6. Anwendungen, Tests und Bewertungen Abb. 6.11: Klassifikation von Frequenzbändern der Kombination als dritten Visualisierungstrom an GenMAD übergibt. Auf diese Weise können im Visualisierungsfenster von GenMAD die drei Visualisierungssignale in Echtzeit verglichen werden. Auch die Nachbearbeitung profitiert von den genannten Möglichkeiten: Ebenso wie Eventdaten können auch Audiodatenströme archiviert werden, um sie später wiederzuverwenden oder in anderen Applikationen einzusetzen. Durch die bereits angesprochenen EventEx- und Includerfilter können Ereignisse manipuliert, durch EventSplitter und -Merger zerteilt und zusammengeführt werden. Wie in Abbildung 6.12 gezeigt, bietet der punktuelle Einsatz von EventVisualizerfiltern die Möglichkeit, das Monitoring gezielt auf bestimmte Ereignisse einzugrenzen: Nur gewünschte Ereignisdatenströme und auf Wunsch nur bestimmte darin enthaltene Ereignisse werden angezeigt. Über dieses Verfahren kann z.B. nach dem Auftreten eines bestimmten Werbejingles in einem Onlineradiostream gehorcht werden, ohne durch andere Identifikationsmeldungen den Überblick zu verlieren. Hier setzt ein weiterer Vorteil an, der im nachfolgenden Kapitel 7 weiter diskutiert wird: Die modulare Erweiterbarkeit von GenMAD durch eigene (mittels des SDK erstellte) Filter. Im genannten Beispielszenario ließe sich durch ein eventbasiertes Filter z.B. ein Emailversand beim Eintreffen des gesuchten Jingles realisieren. Abb. 6.12: Vergleich von archivierten und Echtzeit-Eventdaten 87 Kapitel 7 Zusammenfassung, Diskussion und Ausblick In dieser Arbeit wurde ein generisches Monitoringsystem für akustische Datenströme konzipiert und realisiert. Dieses GenMAD genannte System ermöglicht die flexible freie Verschaltung, grafische Konfiguration und Echtzeitvisualisierung von Signalverarbeitungsmodulen, die auf dem DirectShow-Plugin-Standard beruhen und die optional eine eigens entwickelte erweiterbare Schnittstelle für zusätzliche Funktionalität implementieren können. Unterstützt werden dabei explizit die Verarbeitung von sowohl Audio- als auch Ereignisdaten, die etwa von Klassifikatoren generiert werden können, sowie Möglichkeiten zur Einbindung von Live- und Offlinedaten, wobei letztere lokal und im Internet angesprochen werden können. Darüber hinaus bietet das System die Möglichkeit, Datenströme beider Typen geeignet formatiert in Dateien abzuspeichern. Neben der zentralen Host-Applikation wurden eine Reihe von Plugins des genannten Typs realisiert, die Datenströme vereinen, verteilen, verändern, erzeugen oder zerstören können. Insbesondere wurde ein Modul zur Klassifikation von Audiosignalen in Stille, Sprache, Musik und Sonstiges erstellt sowie ein von der Arbeitsgruppe Multimedia-Signalverarbeitung entwickelter Algorithmus zur inhaltbasierten Audioidentifikation in ein Plugin eingebunden. Darüber hinaus wurde auch ein Modul realisiert, das eine lineare Segmentierung eingehender Ereignisdatenströme mehrerer Quellen zur Vermeidung widersprüchlicher Daten ermöglicht. Bei allen realisierten Modulen kam ein im Rahmen dieser Diplomarbeit entwickeltes SDK (Software Development Kit) zum Einsatz, welches die Umsetzung von Plugins für das entworfene Monitoringsystem deutlich erleichtern soll. Weiterhin bietet dieses SDK die Möglichkeit, das entworfene Pluginmodell effektiv zu erweitern. Sowohl bei der Erstellung des zugrunde liegenden Konzeptes als auch während dessen Umsetzung wurde mit größter Sorgfalt darauf geachtet, die zu Beginn des Kapitels 4 genannten Anforderungen zu erfüllen. In der vorliegenden Arbeit wurden in Kapitel 2 Konzepte und bestehende Ansätze zu den Gebieten der inhaltsbasierten Audioidentifikation, der Audioklassifikation und des Audiomonitorings, sowie Anwendungen aus diesen Bereichen vorgestellt. Dabei wurde Wert darauf gelegt, sowohl formale Aspekte als auch umgesetzte Systeme zu präsentieren, um ein umfangreiches Verständnis für das entworfene Monitoringsystem zu ermöglichen. Das für die technische Umsetzung dieses Systems grundlegende Konzept von Multimedia-Frameworks wurde im nachfolgenden Kapitel 3 erläutert und in Form existierender Frameworks konkretisiert, deren Eigenschaften und Funktionsweisen verdeutlicht wurden. Das grundlegende Konzept des Monitoringsystems wurde in Kapitel 4 formal beschrieben. Weiterhin wurden Unterschiede und Gemeinsamkeiten mit bestehenden Systemen aufgeführt, sowie mögliche konzeptionelle Alternativen diskutiert. Auch zentrale Mechansimen des Systems 88 7. Zusammenfassung, Diskussion und Ausblick und das Zusammenspiel von Host-Applikation und Verarbeitungsmodulen wurden in diesem Kapitel vorgestellt. Ein Überblick über die konkrete Realisierung des Systementwurfs und die dabei umgesetzten Lösungen zentraler Probleme bestimmen den Inhalt von Kapitel 5. Verschiedene Leistungsaspekte und die Laufzeiteigenschaften aller entwickelten Elemente dieses Monitoringsystems wurden anschließend in Kapitel 6 beschrieben. Abschließend wurden verschiedene Anwendungen des entwickelten generischen Monitoringsystems aufgeführt und mögliche weitere Einsatzgebiete und konkrete Lösungen realer Probleme diskutiert. Der Anhang umfasst sowohl Hinweise zur Weiterentwicklung des Systems und der Module als auch das Benutzerhandbuch und die technische Dokumentation des entwickelten generischen Monitoringsystems. Wie in den Kapiteln 2.7 und 4.1 dargestellt wird, existiert nach Wissen des Autors zur Zeit kein Monitoringsystem, das die gerade genannten Eigenschaften besitzt. Insbesondere die Möglichkeit, sowohl auf die sehr große Anzahl existierender DirectShowSignalverarbeitungsmodule zurückzugreifen als auch mit Hilfe des SDK mit geringem Aufwand eigene Plugins zu entwickeln, schafft Raum für neuartige Monitoringanwendungen und erlaubt ein flexibles und produktives Arbeiten ohne aufwendige Einarbeitung. Hinzu kommt die durch das SDK und die grundlegenden Schnittstellen gegebene Erweiterbarkeit des Systems, so dass auch zukünftige Entwicklungen auf diesem Gebiet mit einfließen können. Gleiches gilt natürlich auch für die GenMAD-Applikation, die z.B. leicht um weitere Visualisierungsoptionen ergänzt werden könnte, wie in Abschnitt 7.1 beschrieben wird. Ein wesentliches Maß für die Praxistauglichkeit eines Systems stellen seine Performanz und Skalierbarkeit dar. Gegenüber einer proprietären Monitoringlösung ist in einem generischen System stets mit einem Overhead zu rechnen, der darauf beruht, dass das System eine große Verschiedenheit von Modulen verarbeiten können muss. Wie in Kapitel 6.2 aufgezeigt, zeichnet sich die GenMAD-Applikation jedoch durch eine äußerst geringe Grundprozessorlast aus, und auch die rein auf Eventdaten arbeitenden Filter benötigen eine lediglich minimale Prozessorleistung. Auch der Einsatz der Klassifikations- und Identifikationsfilter in komplexen Projekten ist problemlos möglich, wobei sich die Klassifikationsfilter zusätzlich durch die Wahl des Audioformates gut skalieren lassen. Trotzdem zeigte das System auch in komplexen Testprojekten eine solide Robustheit. Es sei allerdings angemerkt, dass fremdentwickelte Filter im Fall interner Fehler den Datenflussgraphen so beeinträchtigen können, dass ein Fortsetzen des Datentransports nicht möglich ist. Da DirectShow-Filter COM-basiert sind und durch das entsprechende Windows-Subsystem kontrolliert werden, bestehen prinzipbedingt nur eingeschränkte Möglichkeiten zur Behandlung solch grundlegender Fehler. Auf der anderen Seite – und im Normalfall – führt das COM-Framework aber auch zu einer sichereren Ausführung, da das gesamte grundsätzliche Filtermanagement, das z.B. die Verwaltung von Filtern und die Zuteilung von Ressourcen umfasst, extern durchgeführt wird. Dadurch wird GenMAD ein Arbeiten auf abstrakterer Ebene ermöglicht. Natürlich stellt die damit thematisch verbundene Festlegung auf DirectX und die WindowsPlattform eine Beschränkung dar. Wie in Kapitel 3.3 dargelegt, existieren jedoch mit Helix, Quicktime und JMF nur drei Multimedia-Frameworks, denen man eine plattformübergreifende Unterstützung zugestehen kann. Keines dieser Frameworks kann jedoch sowohl einen so hohen Verbreitungsgrad, eine vergleichbare Performanz und gleichzeitig eine äquivalent große Menge bereits existierender Verarbeitungsmodule wie DirectX aufweisen. Daher stehen dieser Einschränkung große Vorteile gegenüber, aus denen GenMAD seine genannten Stärken zieht. Die Umsetzung des Systems mit seinen jetzigen Eigenschaften wäre mit keinem anderen Multimedia-Framework möglich gewesen. 89 7. Zusammenfassung, Diskussion und Ausblick Ausblick Die gesamte GenMAD-Architektur wurde bewusst auf Erweiterbarkeit hin ausgelegt. Entsprechend vielfältig sind die Möglichkeiten, das System durch weitere Entwicklungen zu ergänzen: Die in der GenMAD-Applikation bereits vorhanden Möglichkeiten zur Visualisierung von Audio- und Eventdaten ließen sich durch ein konfigurierbares System ausbauen, so dass sich der Benutzer die Bestandteile des Visualisierungsfensters flexibel aus einer Menge von Visualisierungselementen zusammenstellen kann. Solche Elemente können z.B. eine EchtzeitVisualisierung von Audiomerkmalen wie RMS oder ZCR ermöglichen oder per STFT das Frequenzbild eines Audiofilters darstellen. Die dazu verwendeten Algorithmen können entweder direkt implementiert oder in Form von DLLs mit den entsprechenden Filtern geteilt werden. Eine dritte Möglichkeit besteht darin, Filter die Merkmalsvektorfolge direkt an GenMAD versenden zu lassen, wodurch eine Mehrfachberechnung umgangen werden kann. Solche Merkmalsdaten lassen sich z.B. wie in Abbildung 6.1 als Histogramm anzeigen, evtl. sogar mit einem chronologischen Verlauf. Dieser kann durch einen Farbverlauf verdeutlicht werden, bei dem aktuelle Daten mit hoher Farbintensität, ältere Daten dagegen zunehmend blasser dargestellt werden. Noch etwas weiter gedacht läßt sich auch die Darstellung beliebiger filterspezifischer (Echtzeit-)Informationen realisieren, wie etwa in einem Histogramm, das Zeitverschiebungen (Shift-Werte) des Audentify-Algorithmus’ anzeigt. Auch das Arbeiten mit Filtern und deren Verschaltung kann – gerade im Hinblick auf Filterpipelines – dadurch vereinfacht werden, dass Filtermodule in Multifilter-Containern zusammengefasst und wie Presets separat abgespeichert und geladen werden können. Ein weiterer interessanter Punkt ergibt sich aus der Automation von Abläufen: So bietet DirectX eine solche Automation an, mittels der sich Parameterwerte dynamisch ändern lassen. Diese Änderungen lassen sich ebenfalls laden und speichern und bieten so eine Möglichkeit für die Einführung von Sessions, bei denen ein bestehendes (statisches) Projekt aus Filtern mit zeitbasierten Dynamikinformationen angereichert wird. Damit verwandt ist das Konzept der Stapelverarbeitung, etwa zur sequentiellen Verarbeitung einer ausgewählten Reihe von Eingabedateien, gesteuert durch ein vom Benutzer erstelltes Skript. Auch Filter bieten Möglichkeiten für Weiterentwicklungen: So läßt sich durch Bereitstellen entsprechender Funktionen die vollständige Pflege der Audentify!-Parameter über das in GenMAD enthaltene dialogbasierte Konfigurationssystem abwickeln, wodurch Tests vereinfacht werden. Die zur Zeit implementierten Filter-Konfigurationselemente können zu diesem Zweck um Listen, Auswahlboxen und spezifische Buttons erweitert werden. Um die Flexibilität zu erhöhen und das Prinzip des Monitorings in einen größeren Zusammenhang zu stellen, können z.B. ereignisbasierte Filter entwickelt werden, die bei Eintreffen bestimmter Ereignisse externe Funktionen ausführen, wie etwa zum Emailversand oder zur Generierung akustischer Signale. Bereits bestehende Konzepte lassen sich darüber hinaus erweitern, indem statischen, parameterbasierten Entscheidungsprozessen Möglichkeiten zur Adaption an die eingehenden Daten gegeben werden, z.B. im Fall des MonitoringEventMergers, der so auf schnelles Springen zwischen mehreren Klassen reagieren kann. Ein weiteres wichtiges Feld bietet der Datenaustausch mit anderen Applikationen, ob lokal oder netzwerkbasiert. Hier ist z.B. die Möglichkeit zu nennen, Filter durch Matlab testen zu lassen, indem Matlab Daten blockweise zur Eingabe an ein Filter übergibt und die entsprechende Filterausgabe analysiert. GenMAD bietet also vielfältige Möglichkeiten zur Erweiterung, die den Rahmen möglicher Anwendungen noch einmal vergrößern können. Dies umfasst auch das Einbinden zukünftiger Technologien. 90 Anhang A Hinweise zur Verwendung des Filter-SDK Vorausgesetzt wird die Integrität der Verzeichnisstruktur, d.h. auf der obersten Verzeichnisebene GenMAD-SDK des SDK liegen mindestens die folgenden Unterverzeichnisse vor: GenMAD-SDK \BaseFilter \DirectX \Interfaces \SDK BaseFilter enthält für das SDK grundlegende Klassen, DirectX die unter Windows XP kompilierten Bibliotheken, sowie Quellen und Includes von DirectX9, Interfaces die öffentlichen GenMAD-Schnittstellen und SDK einen leeren Prototyp. Das SDK verwendet lediglich die STL, benötigt also keine MFC-Komponenten. Um ein kompilierbares Filter zu erstellen, sind die folgenden Schritte nötig: 1) Kopieren des Verzeichnisses SDK in ein neues Unterverzeichnis von GenMAD-SDK. 2) Öffnen der kopierten Datei Plugin1.dsw in Visual C++ 6.0 3) Ändern der Datei Plugin1.def: Oben neuen Ausgabenamen spezifizieren 4) In den Projekteigenschaften (Alt-F7) diesen Namen unter LinkerÎAllgemeinÎName der Ausgabedatei ebenfalls angeben 5) In FilterDefs.h muss Grundlegendes zum neuen Filter angegeben werden: - neue GUID (bitte UNBEDINGT neu generieren!!! Siehe Kommentare in Code!) - neuen Klassennamen und zu veröffentlichenden Filternamen angeben 6) Das SDK-Projekt enthält in NewFilter.h/.cpp die zu ändernde Filter-Klasse - ändere Klassennamen (siehe 5.) - definiere eigene zu veröffentlichende Variablen - implementiere/überschreibe Funktionen (bzw. lösche nicht verwendete BeispielFunktionen) 7) Nach dem Kompilieren muss die Filter-Datei (z.B. MeinFilter.ax) einmalig registriert werden: regsvr32 MeinFilter.ax (Hierbei wird auch der Pfad festgelegt, danach darf die Datei also nicht mehr verschieben! Der regsvr-Parameter /u hebt die Registrierung auf.) Falls – entgegen der Empfehlung – ohne Verwendung der NewFilter-Dateien gearbeitet werden soll, ist unbedingt darauf zu achten, dass die folgenden Include-Befehle in der nachfolgend abgebildeten Reihenfolge zu oberst in der entsprechenden Header-Datei des neue Filters deklariert werden: #include #include #include #include "..\BaseFilter\MonitoringPlugin.h" "..\BaseFilter\PropertyPage.h" "FilterDefs.h" "..\BaseFilter\SDK.h" 91 Anhang B Hinweise zur Verwendung von GenMAD GenMAD wurde in Visual C++ 6.0 unter Windows XP entwickelt und auch unter Windows 2000 getestet. Der Code setzt dabei auf MFC und dem DirectX 9.0 SDK Update vom Sommer 2003 auf. Da die Änderungen des Updates die DirectShow-Komponente nicht betreffen, dürfte auch das Haupt-SDK zu DirectX 9.0 zu einer problemlosen Kompilierung führen. GenMAD setzt zur Laufzeit eine korrekte Installation von DirectX 9 voraus. Das SDK wird nicht benötigt. Eine Installation von GenMAD ist nicht nötig, GenMad.exe ist ein direkt ausführbares Programm. Wie alle DirectX-Filter müssen auch die GenMAD-Filter vor der Verwendung in GenMAD oder einem anderen auf DirectX aufsetzenden Programm einzeln im Zielsystem registriert werden. Dies kann durch direktes Verwenden der üblicherweise im System32Unterverzeichnis von Windows befindlichen regsvr32.exe oder darauf aufsetzenden Hilfsprogrammen geschehen und erfordert im einfachsten Fall den folgenden Befehl: regsvr32 MeinFilter.ax Siehe dazu auch die Hinweise in Anhang A, Abschnitt 7. Die bei der Kompilierung gelegentlich auftretende Warnung LNK4098 rührt aus der Verwendung von DirectShow her und kann ignoriert werden. 92 Anhang C Benutzerhandbuch GenMAD wird gestartet durch Aufruf von GenMAD.exe. Das Hauptfenster von GenMAD ist aufgebaut wie in Abbildung C.1 dargestellt. Toolbar Filter Zeitanzeige Pin Schieberegler Verbindung Skalierung Manipulationsbereich Abbildung C.1: GenMAD-Hauptfenster Manipulationsbereich Die im aktuellen Datenflussgraphen enthaltenen Filter sind als farbige Rechtecke im Manipulationsbereich dargestellt. Jedes Filter besitzt einen jeweils zentral angezeigten Namen und verfügt über einen oder mehrere Pins. Pins dienen entweder dem Eingang oder dem Ausgang von Daten zu einem Filter. Eingangs-Pins sind als kleine graue Quadrate an der linken Seite eines Filters mit nebenstehendem Namen abgebildet, Ausgangs-Pins an der rechten. Verbindungen zwischen Filtern bzw. Pins sind als schwarze Linien dargestellt, die sich zwischen Pins befinden. Über diese Verbindungen werden Daten von Filter zu Filter transportiert. Die im Rahmen der vorliegenden Diplomarbeit implementierten Filter werden in Abschnitt 5.3 vorgestellt. Ein Filter lässt sich markieren, in dem man es mit der linken Maus anklickt. Das aktuell selektierte Filter wird rot umrandet dargestellt. Drückt man die Taste „Entf“ bzw. „Del“, so werden das selektierte Filter aus dem Graphen und Verbindungen zu anderen Filtern entfernt. Darüber hinaus lassen sich Filter per Drag’n’Drop verschieben. Die meisten Filter verfügen über einen Konfigurationsdialog, der sich über einen Rechtsklick auf das Filter aufrufen lässt. Klickt man einen Pin mit der rechten Maustaste an, so erscheint ein Kontextmenü mit den Einträgen „Neue Verbindung“ oder „Verbindung lösen“ (je nachdem, ob bereits eine Verbindung besteht) und „Medien-Typen anzeigen“. Der Befehl „Neue Verbindung“ ruft einen Dialog auf, der in einer Baumstruktur alle Filter mit entsprechenden Pins enthält, mit denen der gewählte Pin 93 Anhang C. Benutzerhandbuch verbunden werden kann. Durch Anwahl und „OK“ wird versucht, eine Verbindung herzustellen. „Verbindung lösen“ zerstört die Verbindung des gewählten Pins. Durch Aufruf von „MedienTypen anzeigen“ wird eine dialogbasierte Liste aller unterstützter Dateiformate erfragt werden. Die Vielfalt der Informationen hängt dabei bei manchen Filtern von der Tatsache ab, ob der Pin verbunden ist oder nicht. Toolbar Die Toolbar umfasst eine Reihe von Buttons, die nachfolgend einzeln vorgestellt werden: Diese drei Buttons dient der Projektarbeit und erlauben das Erzeugen eines neuen Projekt, das Öffnen eines bestehenden Projektes und das Speichern des aktuellen Projektes. Mittels dieser Knöpfe können neue Filter zum Graphen hinzugefügt werden: Die ersten beiden Buttons erlauben das Hinzufügen einer lokalen bzw. einer per URL verfügbaren Mediendatei. Dabei wird automatisch eine zur Ausgabe des jeweiligen Dateityps benötigte Filterkette erzeugt. Der dritte Button, dessen Funktion auch durch Rechtsklick in den Manipulationsbereich erreicht werden kann, öffnet einen Dialog, der das manuelle Hinzufügen neuer Filter erlaubt. Dabei lassen sich mehrere Filter hintereinander hinzufügen, ohne dass der Dialog neu geöffnet werden muss. Dieser Button öffnet die das Visualisierungsfenster. Diese Funktion kann auch durch Doppelklicken eines Filters mit der linken Maustaste erreicht werden. In letzterem Fall wird dem Filter – falls möglich – der Audiofokus zugewiesen. Mittels dieses Buttons lässt sich die Synchronisation des Graphen zur Referenzuhr an- und abschalten. Standardmäßig ist sie aktiviert. Diese drei Buttons kontrollieren in gewohnter Weise den Datentransport. Tabelle C.2: Buttons der Toolbar Darüber hinaus befinden sich in der Toolbar drei weitere Steuerelemente: - Uhr, welche die aktuelle Medienzeit anzeigt - Schieberegler zum Vor- und Rücklauf, falls vom Graphen unterstützt - Kontrollfeld zur Eingabe eines Skalierungsfaktors. Standardwert ist 1,0. Visualisierungsfenster In der Toolbar lassen sich drei Dinge konfigurieren: - An- und Abschalten der Echtzeit-Darstellung (Standard ist „an“.) - Zuweisung des Audiofokus’ an ein Filter - Einstellen des Zoomfaktors von Audiosignal- und Event-Anzeige mit zugehörigem Feld zur Anzeige des gewählten Faktors. Der Wert definiert die Anzahl Millisekunden je Pixel. Eine Änderung des Zoomwerts wird durch einen blauen vertikalen Strick in den beiden horizontalen Anzeigen visualisiert. 94 Anhang C. Benutzerhandbuch Die Audiosignal-Anzeige stellt die Wellenform desjenigen Filters dar, dem der Audiofokus zugewiesen wurde. Diese Anzeige funktioniert nur in Echtzeit und wird ausgeblendet, falls sich die Echtzeit-Darstellung deaktiviert ist oder keinem Filter der Audiofokus zugewiesen ist. Die rot dargestellte Skala zeigt die Zeitachse an. In der Eventlisten-Anzeige werden eingehende Events in Echtzeit aufgelistet. Neue Event werden dabei oben angefügt. Die Farbe eines Events entspricht dabei der Farbe desjenigen Filters im Manipulationsbereich, das den Event visualisiert hat, üblicherweise als ein Filter vom Typ MonitoringEventVisualizer. Die Liste enthält alle zum jeweiligen Event verfügbaren Informationen in separaten, in der Größe veränderbaren Spalten. Auf entsprechende Weise und Farbigkeit werden in der Event-Anzeige Events in einer Art Piano-Roll angezeigt. Die Höhe eines als vertikaler Strich dargestellten Events hängt von seinem Score/Ranking ab. Zusammengehörige Events eines Filters werden nach einem in Abschnitt 5.1.9. beschriebenen Verfahren ermittelt und durch einen darüber liegenden horizontalen Balken dargestellt. Diese Anzeige lässt sich im abgeschalteten Echtzeit-Modus durch den darunter befindlichen Schieberegler zeitliche scrollen. Die Größenverhältnisse der drei Anzeigen können durch Drag’n’Drop der Splitter verändert werden. Toolbar Eventlisten-Anzeige Audiosignal-Anzeige Splitter Event-Anzeige Vor-/Rücklaufkontrolle Abbildung C.3: Das Visualisierungsfenster 95 Anhang C. Benutzerhandbuch Arbeitshinweise Es empfiehlt sich, zum Aufbau eines Datenflussgraphen in GenMAD analog zum Fluss des Graphen vorzugehen: Zunächst fügt man durch Anklicken der entsprechenden Buttons in der Toolbar eine oder mehrere neue Mediendateien zum Graphen hinzu. Dabei werden jeweils automatisch auch diejenigen Filter erzeugt und verbunden, die zur Transformation und Ausgabe des entsprechenden Dateityps nötig sind. Da manche Filtertypen erst bei korrekter Parametrisierung bestimmte Pins veröffentlichen, sollte jedes Filter sofort nach dem Einfügen konfiguriert werden. Diesen grundlegenden Graphen erweitert man nun durch zusätzliche Filter, die ebenfalls – wie oben erläutert – mittels der Toolbar hinzugefügt und manuell an geeigneter Stelle in den Signalfluss eingesetzt werden, indem eine existierende Verbindung zweier Filter entfernt wird und die Pins des einzubindenden Filters mit den nun freien Pins verbunden werden. Wenn der Graph komplett erstellt, konfiguriert und verbunden wurde, kann der Datenfluss durch Starten des Graphen initiiert werden. Der Aufruf des Visualisierungsfensters kann auch bei laufendem Graphen erfolgen. Das Hinzufügen neuer Filter zur Laufzeit wird allerdings nicht empfohlen – dazu sollte sich der Graph in gestopptem Zustand befinden. 96 Anhang D Technische Dokumentation von GenMAD Diese Dokumentation soll vor allem dazu dienen, eine effektive Weiterentwicklung des GenMAD-Systems zu ermöglichen und das Verständnis für die Funktionsweise von GenMAD zu vertiefen, vor allem in Verbindung mit dem Quellcode. Der Fokus liegt daher auf denjenigen Schnittstellen und Klassenelementen, die wesentliche Teile des Systems darstellen oder Möglichkeiten zur Erweiterung bieten. Triviale Klassen und Methoden mit eingeschränkter Funktionalität werden daher nicht bis ins letzte Detail, sondern nur rudimentär erläutert. Für eine umfassende Dokumentation auch dieser Elemente sei daher auf die im Quellcode enthaltene Dokumentation verwiesen. Ergänzende Hinweise zum Zusammenspiel der jeweiligen Klassen finden sich in den Kapiteln 4 und 5, zusammen mit mehreren Abbildungen. Es sei darauf hingewiesen, dass ein Rückgabewert vom Typ HRESULT einen Integerwert liefert, der den Erfolg der Operation bewertet. Dabei kennzeichnet generell ein Wert ungleich S_OK einen Fehler. Dieses Vorgehen ist in DirectShow üblich und in GenMAD soweit möglich und sinnvoll ebenfalls implementiert. Dieser Teil des Anhangs ist in vier Bereiche gegliedert: Zunächst folgt in D.1 ein Überblick über das Zusammenspiel der einzelnen Komponenten. In den nachfolgenden Kapiteln D.2 bis D.4 folgen Erläuterungen der in GenMAD enthalten Klassen, globalen Schnittstellen und Strukturen. D.1 Überblick In Abbildung D.1 sind alle GenMAD-Klassen in einem UML-Diagramm dargestellt. D.2 Klassen Nachfolgend werden alle Klassen von GenMAD dargestellt. D.2.1 CAboutDlg class CAboutDlg : public CDialog MFC-Standarddialog mit Copyright-Informationen, der bei Aufruf des einzigen Menüpunkts „Info über GenMAD“ im Hilfemenü angezeigt wird. 97 Anhang D. Technische Dokumentation von GenMAD CAvailFilterList CFilterCategory public char* szNam CLSID clsID public CFilterCategory() * protected CGraphController *pGraphCtrl; int cFavFilters; FavoriteFilters pFavFilters[]; HTREEITEM hSubRootFavs; CObList categories; public CAvailFilterList() DoDataExchange() class CGUID2String public ConvertGuidToString() : CComBSTR GUIDFromString() : HRESULT protected WideToAnsi() : int GetDigit() : int ConvertField() CAvailPinsDialog CAudioComboBox CAudioView protected CTypedPtrList *pFoundPins; CGraphController *pGraphCtrl; protected void *pVisualizer; public CAvailPinsDialog() DestroyWindow() : BOOL public: CAudioComboBox() ~CAudioComboBox() SetParent() protected bool bFollowTrack; bool bZoomChanged; CVisualizerFrame *pVFrame; int iBytesPerSample; int iChannels; double dRefTimePerSample; int iMilliSecTiming; REFERENCE_TIME rtTimePerPixel; REFERENCE_TIME rtPreviousTimestamp; REFERENCE_TIME rtPreviousActionTimestamp; double dPixels; ViewBuffer vBuf[]; int iCurBufReadIndex; int iCurBufWriteIndex; double fSamplesLeft; double fSamplesPerView; CDC bufDataDC; CDC bufScalaDC; bool bBufDCSet; CBitmap bmpData; CBitmap bmpScala; CRect origScreen; bool bResized; HANDLE mutex; protected OnOK() OnInitDialog() : BOOL DoDataExchange() protected LoadFilters() LoadFilterCategory() : HRESULT LoadFilterFavorites() : HRESULT CreateFilter() : IBaseFilter* CreateFavorite() : IBaseFilter* OnOK() OnCancel() OnCreate() : int OnInitDialog() : BOOL OnSelchangedTree1() OnDestroy() OnDblclkTree1() <<interface>> IMonitoringMaster public CallMaster() : HRESULT BroadcastParam() : HRESULT ShowAudio() : HRESULT ShowEvent() : HRESULT NotifyDiscontinuity() : HRESULT NotifyFilterChange() : HRESULT SetFilterName() : HRESULT CGraphController CAboutDlg public CAboutDlg() CMonitorApp CChildView private CGraphController * pGraphCtrl; protected CGraphController *pGraphCtrl; public CChildView() ~CChildView() PreCreateWindow() : BOOL WindowProc() : LRESULT SetGraphController() protected: OnPaint() public CMonitorApp() InitInstance() : BOOL ExitInstance() : int CMainFrame CURLDialog public: CURLDialog() protected DoDataExchange() CToolbarEdit protected char sNewText[]; int iModus; LONGLONG lParamValue; int iProperValue; bool bOverriding; public CToolbarEdit() ~CToolbarEdit() SetMode() protected WindowProc() : LRESULT OnCreate() : int 2 protected CStatusBar m_wndStatusBar; CSlideToolBar m_wndToolBar; CChildView m_wndView; CString sLastMediaDirectory; CString sLastArchiveDirectory; CGraphController *pGraphCtrl; public CMainFrame() ~CMainFrame() PreCreateWindow() : BOOL OnCmdMsg() : BOOL SetGraphController() protected WindowProc() : LRESULT OnCreate() : int OnSetFocus() OnToolbarAddfilter() OnPinmenuConnection() OnPinmenuMediatypes() OnToolbarPause() OnToolbarStart() OnDateiRenderfile() OnDateiRenderUrl() OnButtonSave() OnClose() OnButtonOpen() OnButtonStop() OnDateiSwitchReferenceClock() OnButtonAddURL() OnButtonAddFile() OnButtonVisualizer() OnButtonSetsync() OnButtonNeu() CSlideToolBar public CSliderCtrl m_wndSlider; CToolbarEdit m_wndEdit; CSpinButtonCtrl m_wndSpin; CToolbarEdit m_wndEdit_Rate; CSpinButtonCtrl m_wndSpin_Rate; CFont m_font; int iPos; int iRate; protected CGraphController *pGraphCtrl; <<static>> BOOL bStartOfScroll; UINT nTimerID; CWnd *pParent; LONGLONG lTotalPlayTime; public CSlideToolBar() ~CSlideToolBar() SetParent() SetPositions() SetEnabled() UpdateValues() StopTimer() StartTimer() SetPos() SetGraphCtrl() SetTotalPlayTime() protected: OnCreate() : int OnHScroll() OnVScroll() PreTranslateMessage() : BOOL <<interface>> IMonitoringSlave public SetIMonitoringMaster() : HRESULT CallSlave() : HRESULT SetBufferSize() GetBufferSize() : int FreeResources() Ready() : int SetFilterName() GetAllProperties() : int GetProperty() : HRESULT SetProperty() : HRESULT SetParam() : HRESULT SetShowAudioData() : HRESULT protected CVisualizerFrame* pVisualizerFrame; bool bUseVisualizer; IGraphBuilder *pGraph; IMediaControl *pControl; IMediaEventEx *pEvent; IMediaSeeking *pSeek; LONGLONG lTotalPlayLength; CTypedPtrList *pFilters; CWnd *pWnd; CWnd *pClientArea; bool bDirtyFlag; bool bLeftMouseDown; CFilterContainer *pSelectedFilter; CFilterContainer *pDraggedFilter; CPinInfo *pSelectedPin; CPinInfo *pDraggedPin; int xOff, yOff; RECT MinMax; CStatusBar *m_wndStatusBar; CSlideToolBar *m_wndSeekBar; CString sLastFileWriterDirectory; IReferenceClock *pRefClock; public CGraphController() SetClientArea() ~CGraphController() InitializeGraph() ReleaseInterfaces() Update() Recreate() ResetGraph() <<static>> CreateInstance() : CUnknown* Serialize() HandleGraphEvents() HandleMouse() HandleKeys() Paint() Start() Pause() Stop() GetState() : HRESULT SetPos() SetRate() ShowVisualizer() ActivateAudioFilter() RenderData() SwitchPinConnection() ShowMediaTypes() IsDirty() : bool SetStatus() SetStatusBar() SetSeekBar() HandleSeekTimer() SwitchReferenceClock() : HRESULT GetTime() : HRESULT GetFilter() : CFilterContainer* GetFilterByViewName() : CFilterContainer* GetFilter() : CFilterContainer* GetGraph() : IGraphBuilder* AddFilter() : HRESULT RemoveFilter() : HRESULT AddConnection() : HRESULT SetFilterPosition() GetSelectedFilter() : CFilterContainer* CallMaster() : HRESULT BroadcastParam() : HRESULT ShowAudio() : HRESULT ShowEvent() : HRESULT NotifyDiscontinuity() : HRESULT NotifyFilterChange() : HRESULT SetFilterName() : HRESULT NonDelegatingQueryInterface() : HRESULT CVisualizerFrame protected CList Filters; CList FiltersEV; CString sOldAudioFilter; CToolBar m_wndToolBar; CAudioComboBox m_comboAudioFilter; CSliderCtrl m_wndSlider; CEdit m_wndEdit; CSpinButtonCtrl m_wndSpin; CFont m_font; REFERENCE_TIME rtStart; REFERENCE_TIME rtCurrent; int iMilliSecTiming; CSplitterWnd wndSplitter; CSplitterWnd wndSplitter2; CAudioView *pWndAudioView; CEventView *pWndEventView; CEventListView *pWndEventListView; REFERENCE_TIME rtTimePerPixel; bool bPauseFlag; void *pGrCtrl; UINT nTimerID; REFERENCE_TIME rtStreamOffset; int iAudioPins; int iEventInPins; int iEventOutPins; public CVisualizerFrame() ~CVisualizerFrame() SetPins() ShowAudio() : HRESULT NotifyDiscontinuity() : HRESULT ShowEvent() : HRESULT Start() Pause() Stop() Action() Reset() SetFollow() NotifyFollow() ListAudioViewFilters() SetCurrentFilter() NotifyComboChanged() GetColor() : int GetFilterDesc() : FilterDesc GetFilterCount() : int UpdateFilterDesc() GetEventVisualizerCount() : int protected PreCreateWindow() : BOOL OnCreateClient() : BOOL OnCreate() : int OnTimer() OnClose() OnButtonFollow() OnHScroll() CFilterContainer protected CGraphController *pGraphCtrl; IBaseFilter* pFilter; CTypedPtrList* pConnections; int cPinsIn, cPinsOut; int iMaxPinInWidth; int iMaxPinOutWidth; int x, y; int width, height; int color; CString sName; CString sFilterName; int ID; CLSID clsID; IMonitoringSlave *pMonitoringSlave; bool bSuppressAutoRelease; byte szFileBuffer[]; bool bSupportsPersistance; int iFileSize; CString sWriterFilename; public CPinInfo() UpdateFilterName() Update() Clone() : CPinInfo* GetPin() : HRESULT ShowMediaTypes() Serialize() public CFilterContainer() ~CFilterContainer() Init() Release() SuppressAutoRelease() Recreate(); Serialize() GetFilter() : IBaseFilter* SetFilter() GetName() : CString GetFilterName() : CString GetID() : int SetName() SetFilterName() GetCLSID() : CLSID UpdateConnectedFilterName() UpdateName() UpdateNameExt() Draw() ContainsPos() : bool SetPos() GetX() : int GetY() : int GetWidth() : int GetHeight() : int GetRect() : RECT GetPinInfo : CPinInfo* GetPinInfo : CPinInfo* AddPinInfo() ResetPinInfos() GetPin() : HRESULT GetPinsOutCount() : int GetPinsInCount() : int GetPinCount() : int GetPinInfoNames() : int NotifyFilter() Disconnect() : HRESULT DisconnectPin() : HRESULT Reconnect() ShowPropertyPage() : HRESULT IsMonitoringSlave() : bool GetColor() : int SetColor() GetSlave() : IMonitoringSlave* protected Init() protected CheckMonitoringSlave() protected UpdateVisualizer() ChangeSourceFile() AddFilter() : HRESULT Init() NotifyFilters() SetDirtyFlag() CMediaTypeDialog protected AM_MEDIA_TYPE* types[]; AM_MEDIA_TYPE* pConnectedMT; int cTypes; public CMediaTypeDialog() AddMediaType() SetConnectedMediaType() protected DoDataExchange() OnInitDialog() : BOOL * * * CPinInfo public CString sName; CString sFilter; PIN_DIRECTION dir; CString sConnectedFilter; CString sConnectedPin; CSize size; int x, y; bool bUpdated; public CAudioView() ~CAudioView() SetParent() Action() ShowAudio() : HRESULT Reset() SetFollowTrack() GetMsTiming() : int SetMsTiming() PreCreateWindow() : bool WindowProc() : LRESULT protected OnPaint() OnSize() GetSampleValue() : short Lock() : bool UnLock() : bool CEventView protected bool bIsStillMode; bool bAlreadyScrolling; CSliderCtrl m_wndSlider; bool bScrollBarDrawn; bool bFollowTrack; bool bZoomChanged; CVisualizerFrame *pVFrame; REFERENCE_TIME rtTimePerPixel; REFERENCE_TIME rtPreviousTimestamp; REFERENCE_TIME rtPreviousActionTimestamp; double dPixels; CList *pEvents; POSITION posCurBufReadIndex; POSITION posPrevBufReadIndex; int iEventIndex; CDC bufDataDC; CDC bufScalaDC; bool bBufDCSet; CBitmap bmpData; CBitmap bmpScala; CRect origScreen; bool bResized; HANDLE mutex; public CEventView() ~CEventView() SetParent() Action() AddEvent() Reset() Reset() SetFollowTrack() GetMsTiming() SetMsTiming() PreCreateWindow() : BOOL WindowProc() : LRESULT protected OnPaint() OnSize() OnCreate() : int OnHScroll() DrawEvents() Lock() : bool UnLock() : bool CEventListView protected bool bResetListView; CVisualizerFrame *pVFrame; CList *pEvents; CListCtrl *ListCtrl; HANDLE mutex; public CEventListView() ~CEventListView() OnInitialUpdate() SetParent() AddEvent() Action() Reset() PreCreateWindow() : BOOL protected Lock() : bool UnLock() : bool OnSize() OnCustomDraw() Abbildung D.1: UML-Diagramm von GenMAD 98 Anhang D. Technische Dokumentation von GenMAD D.2.2 CAudioComboBox class CAudioComboBox : public CComboBox Simple ComboBox, die im Visualisierungsfenster das Filter mit dem aktuellen Audiofokus verwaltet. Bei Benutzer-Auswahl eines neuen Filters, angezeigt durch die Windows-Message CBN_SELENDOK wird CVisualizerFrame::NotifyComboChanged() aufgerufen. D.2.3 CAudioView class CAudioView : public CWnd Diese Klasse ermöglicht die Visualisierung von Audiodaten. Dazu werden aus eingehenden Audiodaten Extremwerte extrahiert und in einem ringförmigen Datenpuffer abgelegt: ViewBuffer vBuf[VBUFSIZE]; int iCurBufReadIndex; int iCurBufWriteIndex; //Puffer für extrahierte Audiodaten-Extrema //Lese-/Schreibindizes Das Zeichnen erfolgt über versteckte Zeichenpuffer: CBitmap bmpData, bmpScala; CDC bufDataDC, bufScalaDC; bool bBufDCSet; CRect origScreen; //versteckte Zeichenpuffer für Daten und Skala //Zeichenobjekte für den Zugriff darauf //Flag: Wurden die Puffer erzeugt? //Umfang des tatsächlichen Ausgabebereiches void OnPaint() Diese Methode erzeugt und initialisiert zunächst bei Bedarf neue versteckte Zeichenpuffer und übertragt im Anschluss deren Inhalt skaliert auf den sichtbaren Zeichenbereich des Fensters, um so Flackern zu vermeiden. void Action(REFERENCE_TIME rtNow) In dieser Methode werden anhand der Audiodaten-Extrema, des vorigen Zeitstempels und der übergebenen aktuellen Zeit die Puffer um einige Pixel verschoben und der entsprechende freie Bereich neu beschrieben. Der Aufruf erfolgt dabei Timer-gesteuert aus CVisualizerFrame heraus. HRESULT ShowAudio(AudioBuffer ab) Dieser Funktion werden anzuzeigende Audiodaten übergeben, aus denen anhand der aktuellen Zoomeinstellung Extremwerte extrahiert und diese im Datenpuffer abgelegt werden. short GetSampleValue(AudioBuffer ab, PBYTE pSample) Hilfsfunktion, liefert unter Verwendung von Informationen zum aktuellen Audiodatentyp ein Sample an übergebener Speicherstelle pSample. void Reset() Setzt Variablen und Audiodatenpuffer zurück und zerstört die Zeichenpuffer. HANDLE mutex; bool Lock() bool UnLock() Mittels des Handles und der beiden Funktionen wird der Zugriff innerhalb der Klasse serialisiert, vor allem bezüglich des Zugriffs auf den Datenpuffer durch mehrere asynchrone Threads. Das Handle selbst wird im Klassenkonstruktor erzeugt und im Destruktor zerstört. 99 Anhang D. Technische Dokumentation von GenMAD D.2.4 CAvailFilterList class CAvailFilterList : public CDialog Dieser Dialog beinhaltet ein Baum-Steuerelement, das bei Initialisierung mit den kategorisierten DirectX-Filtern gefüllt wird, die im System registriert sind. Durch Klicken auf einen Button wird in void OnOK() ein Filter des ausgewählten Typs instanziiert und dem Graphen hinzugefügt. Die Identifikationsinformationen jedes aufgeführten Filters werden zum Erzeugen dadurch ermittelt, dass der zum Füllen des Baums verwendete Algorithmus ein zweites Mal, und zwar bis zu dem Index, der zum gewählten Filter gespeichert wurde, durchlaufen wird. Das Erzeugen selbst erfolgt über eine DirectShow-Methode in CreateFavorite(). Die Kategorien sind dabei als CFilterCategory-Objekte einer CObList fix vordefiniert: CObList categories; Ebenso existiert ein Feld pFavFilters mit vordefinierten Filtern, das während des Auflistungsprozesses in LoadFilters() dynamisch um Filter mit dem Namenspräfix Monitoring ergänzt wird. int cFavFilters; FavoriteFilters pFavFilters[MAX_FAVS_COUNT]; Wesentliche Methoden sind: CAvailFilterList(CGraphController *pGraphController, CWnd* pParent) Definition von Favoriten und Kategorien. void OnOK() Aufruf der erzeugenden Methoden CreateFavorite() bzw. CreateFilter() unter Einbeziehung von Informationen des aktuell gewählten Baumknotens, falls ein Filter gewählt ist. void LoadFilters() Erzeugen des Baum-Steuerelementes, sukzessives Aufrufen von LoadFilterFavorites() bzw. LoadFilterCategory(). HRESULT LoadFilterFavorites(CFilterCategory *pCat, POSITION pos) Einfügen der in pFavFilters gespeicherten und als pCat übergebenen Filter in den Baum. Dabei wird der Zweig des Baumes mit dem Kategorie-Index pos markiert. HRESULT LoadFilterCategory(CFilterCategory *pCat, POSITION pos) Unter Verwendung eines COM-Objektes namens SystemDeviceEnumerator wird eine FilterKategorie pCat im System erfragt und in den Baum eingefügt. Der Zweig des Baumes wird mit dem Kategorie-Index pos markiert. Der Vorgang wird in 5.1.3 zusammengefasst. IBaseFilter* CreateFavorite(int iIndex) Erzeugung eines als Favorit definierten Filters an Stelle iIndex im vordefinierten Feld, das als IBaseFilter zurückgegeben wird. IBaseFilter* CreateFilter(CLSID categoryCLSID, int iIndex) Erzeugung eines durch Filters der Kategorie categoryCLSID an Stelle iIndex im vordefinierten Feld mittels des beschriebenen Vorgangs. Das Filter wird als IBaseFilter zurückgeliefert. 100 Anhang D. Technische Dokumentation von GenMAD D.2.5 CAvailPinsDialog Dialog, der zu einem gegebenen Pin in einer Baumstruktur alle Pins mit zugehörigem Filter anzeigt, die sich mit einander verbinden ließen. Auf Knopfdruck wird dies ausgeführt. Die verbindbaren Pins werden dem Dialog übergeben und in einer CList gespeichert: CTypedPtrList <CPtrList, CPinInfo*> *pFoundPins; void OnOK() Anhand des gewählten Eintrags im Baum-Steuerelement wird versucht eine Verbindung dazu herzustellen. Im Erfolgsfall wird der Dialog geschlossen. D.2.6 CChildView class CChildView : public CWnd Diese Klasse repräsentiert den Manipulationsbereich und dient einzig dem Zweck, von Windows versandte Zeichnen- und Benutzereingabe-Messages abzufangen und an CGraphController weiterzureichen. D.2.7 CEventListView class CEventListView : public CListView CListView-Klasse des Visualisierungsfensters, das eingehende Events in einer CList speichert und mittels eines CListCtrl-Steuerelements anzeigt: CList<EventSample, EventSample&> *pEvents; Dabei wird ebenfalls ein in D.2.3 besprochenes Mutex-Handle zur Serialisierung verwendet. void AddEvent(EventSample es) Fügt neue Events am Ende von pEvents an. void Action(REFERENCE_TIME rtNow) Einfügen aller in pEvents vorhandenen Events in das ListCtrl-Objekt unter Verwendung der übergebenen aktuellen Zeit. Abschließend wird pEvents geleert. void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) Jede Zeile wird entsprechend der Farbe des visualisierenden Filters mittels eines zweistufigen Prozesses koloriert. D.2.8 CEventView class CEventView : public CWnd In ähnlicher Weise wie CEventListView werden auch in dieser Klasse eingehende Events durch AddEvent() in einer CList gespeichert und separat angezeigt, hier in Form eines horizontalen Piano Roll. Allerdings wird bei der Speicherung jedem Events noch ein Flag hinzugefügt, das Auskunft darüber gibt, ob ein Event bereits angezeigt wurde: CList<EventSampleWrapper, EventSampleWrapper&> *pEvents; Das in D.2.3 erläuterte Konzept versteckter Zeichenpuffer wird hier ebenso identisch angewandt wie das der Zugriffsserialisierung. 101 Anhang D. Technische Dokumentation von GenMAD void DrawEvents(REFERENCE_TIME rtNow, bool bStillMode) Wie in 5.1.9 erläutert werden hier Events separat nach visualisierenden Filtern und in SubBahnen gleicher Eventbeschreibungen angezeigt. Die Parameter geben Auskunft über die aktuelle Zeit und den Status, ob die Anzeige in Echtzeit verwendet wird oder über den in der Klasse enthaltenen Schieberegler verändert wurde: CSliderCtrl m_wndSlider; Beim Anzeigen bedient sich die Funktion mehrerer Methoden der CVisualizerFrameKlasse, die Informationen zu den verschiedenen Filtern verwaltet und aktualisiert, z.B. zu Eventblocks und dem vorigen Event. void AddEvent(EventSample es) Die übergebenen Events werden im Gegensatz zu CEventListView in pEvents sortiert eingefügt, wobei ein Zeiger auf das nächste zu zeichnende Event ggf. aktualisiert wird. D.2.9 CFilterCategory class CFilterCategory : public CObject Hilfsklasse zu CAvailFilterList, die das Speichern vordefinierter Filterkategorien in einer CObList ermöglicht. Die einzigen Elemente sind zwei Variablen und ein diese parametrisierender Konstruktor: char* szNam; CLSID clsID; //Kategorie-Name //Kategorie-CLSID D.2.10 CFilterContainer class CFilterContainer : public CObject Repräsentantenklasse eines Filters, die über Methoden zur Host-Filter-Kommunikation, zur Übergabe von Informationen und zur Manipulation von Filter-Eigenschaften verfügt. Wichtige Eigenschaften: CTypedPtrList<CPtrList,CPinInfo*>* pConnections; //Pins IBaseFilter* pFilter; //das repräsentierte DirectX-Filter int cPinsIn, cPinsOut; //Anzahl Pins in / out CString sName; //interner name CString sFilterName; //angezeigter Name, z.b. nach manuellem Umbenennen CLSID clsID; //CLSID des Filters IMonitoringSlave *pMonitoringSlave; //Zeiger auf Interface, evtl. NULL Folgende Methoden sind wesentliche Bestandteile der Klasse: CFilterContainer(CGraphController *pGrCtrl, IBaseFilter *pFlt) Übergeben werden diesem Konstruktor Zeiger auf CGraphController und das dieser Instanz zugrunde liegende Filter. Nach Aufruf der in Init() zentral ausgeführten Initialisierung werden Informationen durch Abfrage des Filters eingeholt und gespeichert. void Draw(CClientDC *pDC) Anhand der Filtereigenschaften wird in dieser Methode der übergebene Zeichenbereich beschrieben. void NotifyFilter(CClientDC *pDC) Durch diese Methode wird die Klasse über Änderungen informiert, z.B. nach Herstellen einer neuen Verbindung. Dabei werden sämtliche Graph-bezogenen äußeren Informationen des Filters aktualisiert. Der übergebene Zeichenbereich wird dazu verwendet, die Ausdehnung von Beschriftungen zu ermitteln und für eine schnellere Ausführung von Draw() zu speichern. 102 Anhang D. Technische Dokumentation von GenMAD CPinInfo* GetPinInfo(CString szNam) Liefert zu einem Pin-Namen das entsprechende CPinInfo-Objekt zurück, also die GenMADRepräsentation eines Pins. HRESULT GetPin(CString szQueriedName, IPin** ppPin) Liefert zu einem Pin-Namen das entsprechende IPin-Objekt, also das DirectShow-Objekt, zurück. HRESULT Disconnect() Entfernt alle Verbindungen zu benachbarten Filtern. HRESULT DisconnectPin(CPinInfo *pPinInfo) Entfernt die Verbindung des übergebenen Pins. void Reconnect(bool bRecursive) Gemäß pConnections alle dort gespeicherten Verbindungen rekursiv wieder herstellen, z.B. nach Laden des Graphen aus einer Datei. void UpdateConnectedFilterName(CString sNameOld, CString sNameNew) void UpdateName(CString sNameOld, CString sNameNew) Diesen beiden Methoden dienen der automatischen Anpassung von Filternamen void UpdateNameExt(CString sNameOld, CString sNameNew) Entsprechend im Fall manueller Anpassung void Serialize(CArchive& archive) Wie in Abschnitt 5.1.4 beschrieben findet hier das Laden und Speichern mittels des CArchiveObjektes statt. void Recreate(CGraphController *pGrCtrl) Neu-Erzeugen des Filters unter Einbeziehen interner Eigenschaften, z.B. nach Ladevorgang HRESULT ShowPropertyPage() Konfigurationsdialog des Filters aufrufen D.2.11 CGraphController class CGraphController : public CObject, public CUnknown, public IMonitoringMaster Dies ist die zentrale Klasse des GenMAD-Systems. Wie in Kapitel 4 erläutert repräsentiert sie das GraphBuilder-Objekt, das in DirectShow den Datenflussgraphen kontrolliert. Zentrale Eigenschaften: CVisualizerFrame* pVisualizerFrame; //Visualisierungsfenster //zentrale DirectShow-Handles IGraphBuilder *pGraph; IMediaControl *pControl; IMediaEventEx *pEvent; IMediaSeeking *pSeek; //GraphBuilder //Abspielkontrolle //Ereignisbehandlung //Seeking LONGLONG lTotalPlayLength; //Gesamtspielzeit d. aktuellen Mediums CTypedPtrList<CPtrList,CFilterContainer*> *pFilters; //die Filter CWnd *pWnd; //Applikationsrahmen CWnd *pClientArea; //Manipulationsbereich IReferenceClock *pRefClock; //Referenz-Uhr 103 Anhang D. Technische Dokumentation von GenMAD Nachfolgend sind die wichtigen Methoden der Klasse aufgeführt: void ResetGraph() Zurücksetzen des Graphen: Entfernen aller Filter void InitializeGraph() Erzeugen des Graphen, Initialisieren der zentralen DirectShow-Objekte und deren Parameter void RenderData(CString sSource) Eine Mediendatei an übergebenem Pfad renderbereit zum Graphen hinzufügen, wie in 5.1.5 beschrieben. void HandleGraphEvents() DirectShow-Ereignisse behandeln, wie in 5.1.2 erläutert. void NotifyFilters() Alle Filter zum Überprüfen von Änderungen auffordern. void ReleaseInterfaces() Freigabe aller Interfaces und DirectShow-Objekte HRESULT HRESULT HRESULT HRESULT HRESULT HRESULT HRESULT CallMaster(int iCodeID, void* pParam, void** ppReturnValue); BroadcastParam(int iParamID, double dValue); ShowAudio(AudioBuffer ab); ShowEvent(EventSample es); NotifyDiscontinuity(REFERENCE_TIME rtTimestamp); NotifyFilterChange(int iParam); SetFilterName(char *sOldName, char *sNewName); Implementation des IMonitoringMaster-Interfaces, siehe dessen Beschreibung in D.3.1 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv) DirectShow-Methode zur Veröffentlichung implementierter Schnittstellen, damit dieser via COM verfügbar sind. void HandleMouse(int iEvent, WPARAM wParam, LPARAM lParam) Behandlung von Mausereignissen im Manipulationsbereich. void ShowVisualizer(CFilterContainer *pFlt) Anzeigen des Visualisierungsfenster, Übergabe von Filter-Informationen void HandleKeys(WPARAM wParam, LPARAM lParam) Behandlung von Tastatureingaben void Paint() Zeichnen des aktuellen Graphen durch Aufruf entsprechender Methoden aller Filter CFilterContainer* GetFilter(int ID) CFilterContainer* GetFilter(CString szName) CFilterContainer* GetFilterByViewName(CString szName) Filter anhand von ID, internem oder angezeigtem Namen finden HRESULT AddFilter(CFilterContainer *pFltContainer) HRESULT AddFilter(IBaseFilter *pFilter, CString sName) Hinzufügen eines Filters zum Graphen, entweder als Hilfsfunktion zur RenderData() oder nach Auswahl im CAvailsFiltersList-Dialog 104 Anhang D. Technische Dokumentation von GenMAD HRESULT RemoveFilter(CFilterContainer *pFltContainer) Komplettes Entfernen eines Filters aus dem Graphen void SwitchPinConnection() Umkehren des Verbindungszustandes des selektierten Pins, also verbunden und nicht verbunden. void ShowMediaTypes() Anzeige der Mediaformate eines Pins per CMediaTypeDialog. HRESULT AddConnection(IBaseFilter *pFilter) Verbindung zwischen selektiertem und übergebenem Filter herstellen. void Start() void Pause() void Stop() Abspielkontrolle, wie in 5.1.8 beschrieben. Dabei wird sowohl pControl verwendet als auch das Visualisierungsfenster synchronisiert. void Serialize(CArchive& archive) Wie in Abschnitt 5.1.4 beschrieben findet hier das Laden und Speichern mittels des CArchiveObjektes statt. void Update() Benachrichtigen aller Filter über mögliche Änderungen und anschließendes Zeichnen void Recreate(CString sOpenPath) Nach einem Ladevorgang ausgeführte Methode zur Verbindung aller Filter, wie in 5.1.4 erläutert. HRESULT SwitchReferenceClock(bool bUseReference) Referenz-Clock von NULL – wie per positivem Parameter angezeigt – auf normal & umgekehrt umschalten. Siehe 5.1.7 für eine Beschreibung des Konzeptes. void ChangeSourceFile(CFilterContainer *pFltContainer) Austausch einer Mediendatei eines FileSource-Filters. Wird erreicht durch Neu-Erzeugen und geeignetes Verbinden anstelle des bisherigen Filters. void ActivateAudioFilter(CString sName, bool bActive) Benachrichtigung des benannten Filters über Erhalt oder Abgabe des Audiofokus’ D.2.12 CGUID2String class CGUID2String Hilfsklasse zum Konvertieren von GUIDs aus/in Strings. D.2.13 CMainFrame class CMainFrame : public CFrameWnd Repräsentiert das Hauptfenster. Wichtige Eigenschaften: CStatusBar m_wndStatusBar; CSlideToolBar m_wndToolBar; CChildView m_wndView; //Statuszeile //Toolbar //Manipulationsbereich 105 Anhang D. Technische Dokumentation von GenMAD Darüber hinaus sind Handlermethoden für die Buttons der Toolbar vorhanden, die allerdings nur Vorarbeit leisten und auf in CGraphController implementierte Funktionen verweisen. D.2.14 CMediaTypeDialog class CMediaTypeDialog : public CDialog Dieser Dialog zeigt in einer Auflistung die separat übergebenen unterstützten Medienformate eines Pins. D.2.15 CMonitorApp class CMonitorApp : public CWinApp Dies ist die Windows-Applikationsklasse, deren einzige Aufgabe die Erzeugung und Anzeige der CMainFrame- und der CGraphController-Klasse ist. D.2.16 CPinInfo class CPinInfo : public CObject Dieser Klasse repräsentiert ein Pin und besitzt öffentliche Variablen für alle wichtigen PinEigenschaften: CString sName; CString sFilter; PIN_DIRECTION dir; CString sConnectedFilter; CString sConnectedPin; //Name //Name //Ein//Name //Name des Pins des Filters oder Ausgangspin? des verbundenen Filters des verbundenen Pins Im Konstruktor werden alle Eigenschaften durch Abfrage des Pins ermittelt. Wie auch in CGraphController und CFilterContainer wird hier das Laden und Speichern über CArchive bzw. Serialize() unterstützt. Da vorausgesetzt, ist CPinInfo daher von CObject abgeleitet und enthält wie diese zwei notwendige Makros. HRESULT GetPin (CGraphController *pGraphCtrl, IPin **ppPin) Liefert ein IPin-Objekt des repräsentierten Pins zurück. void ShowMediaTypes(CGraphController *pGraphCtrl) Ermittelt und zeigt unterstützte Mediaformate in einem CMediaTypeDialog an. D.2.17 CSlideToolBar class CSlideToolBar : public CToolBar Diese Toolbar-Klasse beinhaltet neben einigen Buttons auch einen Schieberegler mit zugehöriger Anzeige (genannt Seekbar), mittels der sich – falls vom aktuellen Graphen unterstützt – ein Vorund Rücklauf durchführen lässt. Dazu werden die folgenden drei Steuerelemente verwendet: CSliderCtrl m_wndSlider; CToolbarEdit m_wndEdit; CSpinButtonCtrl m_wndSpin; //Schieberegler //Anzeige //Editierung, unsichtbar Diese werden über einen Timer nTimerID in Millisekundenabständen aktualisiert. 106 Anhang D. Technische Dokumentation von GenMAD Darüber hinaus ist ein Element zur Kontrolle der Skalierung enthalten: CToolbarEdit m_wndEdit_Rate; CSpinButtonCtrl m_wndSpin_Rate; //Anzeigefeld //Editierung, sichtbar Bei Veränderung der Steuerelemente werden die neuen Werte ausgelesen und an CGraphController weitergereicht. D.2.18 CToolbarEdit class CToolbarEdit : public CEdit Dieses Steuerelement zeigt andere Werte an als intern gehalten werden und findet Verwendung in Unterstützung der Slider- & SpinCtrl in der Seekbar von CSlideToolBar. Die internen Werte werden anhand eines von z.Zt. zwei festgesetzten Modi auf andere Werte abgebildet, in dem Windows-Nachrichten abgefangen werden. Dies umfasst auch Benutzereingaben. //Zeit-Anzeige, generiert aus 100ns-Einheit Stunden:Minuten:Sekunden #define TOOLBAREDIT_MODE_TIME 0 //Skalierungs-Anzeige, zeigt ein Tausendstel des tatsächlichen Wertes an #define TOOLBAREDIT_MODE_1000 1 D.2.19 CURLDialog class CURLDialog : public CDialog Hierbei handelt es sich um einen simplen Dialog zur Eingabe einer URL. D.2.20 CVisualizerFrame class CVisualizerFrame : public CFrameWnd Diese Klasse repräsentiert das Visualisierungsfenster. Es enthält dazu Instanzen der drei Teilbereiche, die zusammen mit trennenden CSplitter-Steuerelementen erzeugt werden. CAudioView *pWndAudioView; //Audioanzeige CEventView *pWndEventView; //Event-Piano-Roll CEventListView *pWndEventListView; //Event-Liste Informationen über im Graph enthaltene Filter werden mit weiteren Angaben angereichert und als CList von FilterDesc-Objekten lokal gespeichert: CList<FilterDesc, FilterDesc&> Filters; //Liste aller Generatoren CList<FilterDesc, FilterDesc&> FiltersEV; //Liste der visualizerenden Filter Darüber hinaus verwendet die Klasse einen Timer, um in Millisekundenabständen die Teilbereiche zum Aktualisieren aufzufordern. HRESULT ShowAudio(AudioBuffer ab) HRESULT ShowEvent(EventSample es) Diese beiden Methoden erhalten zu visualisierende Daten und leiten sie an die entsprechenden Teilbereiche weiter. void Start(REFERENCE_TIME rtNow); void Pause(); void Stop(); Diese drei Abspielfunktionen werden von CGraphController synchronisiert und kontrollieren den Timer. Dieser wiederum ruft die folgende Methode auf: 107 Anhang D. Technische Dokumentation von GenMAD void Action() Diese Methode ruft gleichlautende Funktionen in allen drei Teilbereichen auf. void Reset() void Reset(bool bAudioOnly) Diese Funktionen setzen die Visualisierungs-Anzeige zurück, z.B. wenn der Graph gestoppt wird. Das bAudioOnly-Flag kontrolliert das Zurücksetzen der Filterinformationen und wird im Zusammenhang mit dem Umschalten zwischen Echtzeit- und Standbyanzeige eingesetzt. void ListAudioViewFilters(CList<FilterDesc,FilterDesc&>* pFilters, CList<FilterDesc,FilterDesc&>* pFiltersEV) Dieser Methode werden Informationen zu Generator- und visualisierenden Eventfiltern übergeben. Daraufhin werden die Bahnen der Piano-Roll-Anzeige ggf. neu vergeben und die Auswahlbox des Audiofokus überprüft. void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) Diese Methode zur Ereignisbehandlung korrespondiert mit dem Zoom-Schieberegler und übergibt den Zoomwert den entsprechenden Teilbereichen. FilterDesc GetFilterDesc(CString sName) int GetFilterCount() void UpdateFilterDesc(FilterDesc fd) Diese drei Methoden befassen sich mit der Bereitstellung von Filterinformationen an die Teilbereiche und liefern zu einem übergebenen Filternamen ein FilterDesc-Objekt, geben die Anzahl vorhandener Einträge zurück und aktualisieren vorhandene Einträge. D.2.21 DShowUtils Abschließend sei auf folgenden Namespace hingewiesen, der eine Reihe von DirectShow-nahen Funktionen enthält, die von verschiedenen GenMAD-Klassen aufgerufen werden. Diese Funktionen entstammen teilweise dem DirectX-SDK oder sind Erweiterungen davon, andere wurden vom Autor dieser Diplomarbeit implementiert. In der folgenden Auflistung wichtiger enthaltener Funktionen sind – durch (..) gekennzeichnet – die Parameter absichtlich weggelassen, um die Lesbarkeit zu erhöhen. Diese sind jedoch wie gewohnt im Quelltext dokumentiert: CString GetDirectXErrorMessage(HRESULT hr); Liefert zu einem Fehlercode die zugehörige Fehler-Meldung. char* GetMediaType(GUID mediatype); Liefert zum GUID eines DirectShow-Medienformates den zugehörigen Bezeichner. HRESULT CreateFilterByCLSID(..) Durch CLSID definiertes Filter erzeugen. HRESULT AddFilterByCLSID(..) Durch CLSID definiertes Filter zum Graphen hinzufügen. HRESULT ConnectFilters(..) Verbindet zwei Filter, einer davon gegeben durch einen Pin. HRESULT ConnectFilters(..) Verbindet zwei Filter. 108 Anhang D. Technische Dokumentation von GenMAD HRESULT GetPin(..) Liefert zu einem Filter einen enthaltenen Pin mit vorgegebener Orientierung. HRESULT FindInterfaceAnywhere(..) Liefert ein vorgegebenes Interface, falls im Graphen implementiert. void ListFilters(..) Liefert eine Collection aller Filter im Graphen. void FindMatchingPins(..) Liefert zu einem Pin sämtliche aufgrund des Media Formates passendes Pins als Collection. D.3 Globale Schnittstellen D.3.1 IMonitoringMaster DirectShow-Schnittstelle, die von GenMAD implementiert wird und Filtern den Aufruf von darin enthaltenen Funktionen ermöglicht DECLARE_INTERFACE_(IMonitoringMaster, IUnknown) { public: //erweiterbare Funktionalität //Parameter: //iCodeID: Codes für generische Unterfunktionen //pParam: Zeiger für beliebige Parameter //ppReturnValue: Zeiger auf Zeiger für beliebige Rückgabewerte virtual HRESULT STDMETHODCALLTYPE CallMaster(int iCodeID, void* pParam, void** ppReturnValue) = 0; //Inter-Filter-Kommunikation //dient der Abstimmung von Parameterwerten //Parameter: //iParamID: ID des Parameters //dValue: Wert des Parameters virtual HRESULT STDMETHODCALLTYPE BroadcastParam(int iParamID, double dValue) = 0; //Visualisierung von Audiodaten //Parameter: //anzuzeigender Audiodatenblock virtual HRESULT STDMETHODCALLTYPE ShowAudio(AudioBuffer ab) = 0; //Visualisierung von Eventdaten //Parameter: //anzuzeigender Event virtual HRESULT STDMETHODCALLTYPE ShowEvent(EventSample es) = 0; //Benachrichtigung über Unterbrechung im Stream //Parameter: //rtTimestamp: Zeitstempel virtual HRESULT STDMETHODCALLTYPE NotifyDiscontinuity(REFERENCE_TIME rtTimestamp) = 0; //Benachrichtigung über Filter-Veränderung //Parameter: //iParam: Parameter-ID 109 Anhang D. Technische Dokumentation von GenMAD virtual HRESULT STDMETHODCALLTYPE NotifyFilterChange(int iParam) = 0; //Übergabe des Filternamens, z.B. nach Laden eines Projektes //Parameter: //sOldName: alter Name //sNewName: neuer Name virtual HRESULT STDMETHODCALLTYPE SetFilterName(char *sOldName, char *sNewName) = 0; }; D.3.2 IMonitoringSlave DirectShow-Schnittstelle, deren Implementation Filtern die Kommunikation mit eigenen Erweiterungen, anderen Filtern und dem GenMAD-Host ermöglicht DECLARE_INTERFACE_(IMonitoringSlave, IUnknown) { public: //Übergabe eines Zeigers auf den Host //Parameter: //Zeiger auf COM-Objekt, das ImonitoringMaster implementiert virtual HRESULT STDMETHODCALLTYPE SetIMonitoringMaster( IMonitoringMaster *pam) = 0; //erweiterbare Funktionalität //Parameter: //iCodeID: Codes für generische Unterfunktionen //pParam: Zeiger für beliebige Parameter //ppReturnValue: Zeiger auf Zeiger für beliebige Rückgabewert virtual HRESULT STDMETHODCALLTYPE CallSlave(int iCodeID, void* pParam, void** ppReturnValue) = 0; //Festlegen und Abfrage der Puffergrösse in Bytes void STDMETHODCALLTYPE SetBufferSize(int iBytes); int STDMETHODCALLTYPE GetBufferSize(); //Eigene Resourcen wieder freigeben virtual void STDMETHODCALLTYPE FreeResources() = 0; //Statusabfrage, ob bereit zu starten. //Parameter: //szErrMsg: optionaler Fehlertext zur Rückgabe //Rückgabe: Ein Wert == 0 signalisiert Bereitschaft virtual int STDMETHODCALLTYPE Ready(char *szErrMsg) = 0; //Festsetzen des Namens //Parameter: //sNewName: Name virtual void STDMETHODCALLTYPE SetFilterName(char* sNewName) = 0; //Abfrage einer Liste aller Properties //Parameter: //ppPropertyVarType: Array mit Properties //Rückgabe: Anzahl der Properties virtual int STDMETHODCALLTYPE GetAllProperties(PropertyType **ppPropertyVarType) = 0; //Abfrage einer Property //Parameter: //iPropID: ID der Property 110 Anhang D. Technische Dokumentation von GenMAD //pProp: Zeiger für Rückgabe virtual HRESULT STDMETHODCALLTYPE GetProperty(int iPropID, PropertyType *pProp) = 0; //Festlegen einer Property //Parameter: //Prop: die Property virtual HRESULT STDMETHODCALLTYPE SetProperty(PropertyType Prop) = 0; //Festlegen von Parametern zur Abstimmung unter allen Filtern //Parameter: //iParamID: Parameter-ID //dValue: Wert des Parameters virtual HRESULT STDMETHODCALLTYPE SetParam(int iParamID, double dValue) = 0; //Zuweisen des Audiofokus’ //Parameter: //bShowData: Flag virtual HRESULT STDMETHODCALLTYPE SetShowAudioData(bool bShowData) = 0; }; D.4 Strukturen D.4.1 AudioBuffer Wrapper-Struktur für Audiodaten, dient dem Datenaustausch zwischen Host und Filtern struct AudioBuffer { PBYTE pData; REFERENCE_TIME rtTimestamp; int iLen; int iSampleRate; int iBytesPerSample; int iChannels; }; //Zeiger auf Datenblock //Zeitstempel //Länge des Blocks in Byte //Abtastrate //Anzahl Bytes je Sample (je Kanal) //Anzahl Kanäle je Sample D.4.2 EventSample Datenstruktur für die Verarbeitung von Events, auch von Filtern genutzt typedef struct tagEVENTSAMPLE { LONGLONG rtTimestamp; char sDescriptor[512]; long lScore; long lShift; //Zeitstempel //Eventbeschreibung //Score (Ranking) //zeitl. Offset gegenüber Datenbank char sGenerator[256]; int iSampleRate; int iBytesPerSample; int iChannels; //Name des erzeugenden Filters //Abtastrate //Bytes je Sample (je Kanal) //Kanäle je Sample long index; char sVisualizer[1024]; //fortlaufende Nummer // Name des visualisierenden Filters char sFutureUse[512]; } EventSample; //512 Byte, reserviert für Erweiterungen 111 Anhang D. Technische Dokumentation von GenMAD D.4.3 EventSampleWrapper Wrapper-Struktur für die Verwendung der EventSample-Struktur in der Visualisierung struct EventSampleWrapper { EventSample es; bool bDrawn; }; //Event-Objekt //Flag: Event bereits angezeigt? D.4.4 EventTrack Repräsentiert eine Sub-Bahn in CEventView struct EventTrack { char sDescription[1024]; int iLastIndex; }; //Eventbeschreibung //Track-Index D.4.5 FavouriteFilters Struktur zur Verwaltung von Favoriten im CavailFilterList-Dialog struct FavoriteFilters { CString sName; CLSID clsID; }; //Filterbezeichnung //Filter-CLSID D.4.6 FilterDesc Repräsentiert ein Event-visualisierendes Filter in CEventView struct FilterDesc { CString sName; int color; int index; POSITION pos; EventSample esPrevEvent; REFERENCE_TIME rtEventBlockBegin; EventTrack tracks[16]; int iTrackCount; }; //Filtername //Farbe (RGB) //aktueller Index //Speicher-Index in CList //voriges Event dieses Typs //Zeitstempel des Blockbeginns //Sub-Bahnen, max.16 Stück //deren tatsächliche Anzahl D.4.7 EVENTINFO Struktur zur Definition des Datentyps “Event” zur Inter-Filter-Kommunikation typedef struct tagEVENTINFO { int iVersion; //Versionsnummer } EVENTINFO; 112 Anhang D. Technische Dokumentation von GenMAD D.4.8 PropertyType Struktur zur Speicherung und Verarbeitung von Properties in Filtern //Variablentyp-Konstanten const PROPTYPE_INT = 1; const PROPTYPE_STRING = 2; const PROPTYPE_FLOAT = 3; const PROPTYPE_FILE = 4; typedef struct tagPROPERTYTYPE { char sName[64]; //anzuzeigender Name int iPropID; //ID int iPropType; //Variablentyp void* pValue; //Zeiger auf die Variable //Wertehalter, für Dialogkommunikation char sValue[255]; //Stringwert int iValue; //Integerwert double fValue; //Floatingwert } PropertyType; D.4.9 ViewBuffer Repräsentiert in der Audio-Visualisierung einen Bereich, der ein Pixel breit ist struct ViewBuffer { int iValueMax; //Maximalwert des repräsentierten Zeitintervalls int iValueMin; //Minimalwert des repräsentierten Zeitintervalls REFERENCE_TIME rtTimestamp; //Zeitstempel }; 113 Anhang E Technische Dokumentation des FilterSDK Da das SDK wegen des Basierens auf Präprozessoranweisungen weniger aus einer komplexen Anzahl von Klassen, sondern vielmehr einer vernetzten Struktur ineinander eingebundener Dateien besteht, soll nachfolgend zunächst eine Übersicht über diese Struktur gegeben werden. In darauffolgenden Abschnitten werden wichtige Klassen und Dateien erläutert, bevor abschließend die Pin-Klassen und die zentrale Klasse CMonitoringBaseFilter besprochen werden. Die im Rahmen dieser Diplomarbeit implementierten Filter folgen alle dem durch das SDK vorgegebenen Weg und unterscheiden sich nur durch den Code der einzelnen Funktionen. Da sie sowohl in Kapitel 5.3 als auch im Quellcode hinreichend dokumentiert sind und im Hinblick auf das zu Beginn des Anhangs D erläuterte Konzept des Fokus auf Erweiterbarkeit hier nur wenig Sinn ergäben, befasst sich dieses Kapitel des Anhangs ausschließlich mit Details des SDK und soll so dem interessierten Benutzer die Möglichkeit zu Anwendung und Erweiterung des SDK bieten. Dieses Kapitel ist unterteilt in vier Abschnitte: Zunächst wird in E.1 ein Überblick über die Vernetzung der im SDK enthaltenen Dateien gegeben. Es folgt eine Erläuterung der wichtigsten Elemente in E.2, bevor in E.3 und E.4 die zentralen Klassen der Pins und CMonitoringBaseFilter besprochen werden sollen. E.1 Überblick über die Vernetzung der eingebundenen Dateien Die Abbildung E.1 zeigt das Netz der Verbindungen der Headerdateien des Filter-SDK. Zusätzlich spielt die Stelle der jeweiligen Include-Anweisung, in diesem Fall äquivalent zum Zeitpunkt der Einbindung und der daraus resultierenden Kompilierung. FilterDefs.h GlobalMacros.h SDK.h GlobalDefs.h NewFilter.h PropertyPage.h PropertyType.h IMonitor.h AudioBuffer.h EventSample.h Abbildung E.1: Vernetzung der Headerdateien des Filter-SDK 114 Anhang E. Technische Dokumentation des Filter-SDK E.2 Wichtige Klassen, Strukturen und Dateien E.2.1 FilterDefs.h Diese Datei enthält die zentralen Angaben zum Filter: //Anzahl der verschiedenen Pintypen #define PINS_AUDIO_IO 0 #define PINS_EVENT_IN 1 #define PINS_EVENT_OUT 1 //================================================================== // *DER* GUID, hier die Filter-CLSID const GUID IID_MonitoringEventIncluder = { 0x4c03cfaa, 0xb667, 0x43ee, 0x96, 0xaa, 0xa1, 0xea, 0x66, 0xfa, 0x6e, 0xed }; //================================================================== //zentrale Definitionen des Filters für globale Makros: //CLSID des Filters #define FILTER_CLSID IID_MonitoringEventIncluder //Filter-Klasse, muss von CMonitoringBaseFilter erben #define FILTER_CLASS CmonitoringEventIncluder //Filtername, ASCII #define FILTER_NAME "MonitoringEventIncluder" //Filtername, Unicode #define FILTER_NAME_WIDE L"MonitoringEventIncluder" //Filter-Konfigurationsdialog-CLSID #define FILTERPROP_CLSID CLSID_MonitoringBaseFilter_PropertyPage //und -Klasse #define FILTERPROP_CLASS CMonitoringBaseFilterPropertyPage E.2.2 FilterUtils namespace FilterUtils Hierbei handelt es sich nicht um eine Klasse, sondern um einen Namespace, der nur zwei Funktionen enthält: bool FileExists(char* sPath); Überprüft, ob am angegebenen Pfad eine Datei existiert. Falls ja, wird TRUE zurückgeliefert. bool BrowseFileName(char* sFile, HWND hWnd, bool bFileMustExist); Öffnet einen Dialog zur Dateiauswahl. Wird eine Datei ausgewählt, liefert die Funktion TRUE zurück und enthält den gewählten Pfad in sFile. Der Parameter hWnd wird für das Erzeugen des Dialogs benötigt und stellt ein Fensterhandle dar. Das Flag bFileMustExist schließlich bestimmt, ob die zu wählende Datei existieren muss, um auswählbar zu sein. E.2.3 GlobalMacros.h In dieser SDK-internen Datei werden Medientypen definiert und die zur Registrierung benötigten globalen Variablen deklariert und anhand der Angaben in FilterDefs.h gefüllt. Benutzer sollten diese Datei nur in Ausnahmefällen editieren! 115 Anhang E. Technische Dokumentation des Filter-SDK E.2.4 IMonitor.h In dieser Datei sind sowohl grundlegende Medientypen wie MEDIATYPE_Event als auch die elementaren IMonitoringMaster und –Slave-Schnittstellen und deren GUIDs definiert. Diese werden in Anhang D.3 erläutert. IMonitoringSlave wird von CMonitoringBaseFilter implementiert. E.2.5 CMonitoringBaseFilterPropertyPage class CMonitoringBaseFilterPropertyPage : public CBasePropertyPage Diese Klasse stellt die im SDK standardmäßig verwendete Konfigurationsansicht dar und wird als solche in FilterDefs.h registriert. Basierend auf der DirectShow-Klasse CBasePropertyPage verwendet die Klasse den PropertyType-Datentyp zur Übergabe von Properties und überschreibt eine Reihe von Ereignisbehandlungsmethoden zum Umgang damit. Ein solches Vorgehen ist nötig, da es keine direkte Verbindung zwischen Filter und Konfigurationsseite gibt, sondern nur durch COM/DirectShow vermittelte Kommunikation. Prinzipiell werden – z.B. für dem Fall komplexer Filter – beliebig viele Konfigurationsseiten innerhalb des Dialogs unterstützt, hier wird jedoch nur eine Seite implementiert. Die Seite besteht aus acht Zeilen, die jeweils ein Label, ein Textfeld und einen Button beinhalten. In Abhängigkeit vorhandener Properties werden Zeilen mit Angaben, Namen gefüllt und teilweise oder komplett versteckt. Dadurch wird das Anzeigen dynamisch vorhandener Properties ermöglicht. Durch Verwenden zweier Felder von Properties ist auch ein Zurücknehmen von Änderungen möglich: PropertyType *pPropertyType; //bisherige Werte PropertyType *pPropertyTypeNewVal; //neue Werte int cPropertyCount; //Anzahl Properties //Hilfsfunktion, die Properties Feld-weise kopiert void CopyPropertyValue(PropertyType *to, PropertyType *from, int Count); CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) Diese Factory-Methode erzeugt eine CMonitoringBaseFilterPropertyPage-Instanz und liefert diese zurück. HRESULT OnConnect(IUnknown *pUnk) Dieser Handler wird beim Verbinden der Applikation mit dem Konfigurationsdialog aktiviert und ermittelt durch Verwenden des IMonitoringSlave-Interfaces die im vorliegenden Filter veröffentlichten Properties. HRESULT OnActivate(void) Dieser Handler wird aufgerufen, sobald die Seite aktiviert wird. Hier findet das Füllen und Verstecken der Steuerelemente der acht Zeilen statt. HRESULT OnApplyChanges(void) Wird aufgerufen, wenn der Benutzer Übernehmen wählt. Hier werden die neuen Feldwerte übernommen. BOOL OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) Diese Methode wird bei Veränderung von Steuerelementen der Konfigurationsseite aufgerufen und enthält Code zur Behandlung aller möglichen Elemente. Dabei werden unter Verwendung der SetNewValue()-Funktion die neuen Werte vermerkt. 116 Anhang E. Technische Dokumentation des Filter-SDK HRESULT OnDeactivate(void) Diese Methode wird sowohl beim Wechsel zu einer anderen (in diesem Fall nicht vorhandenen) Seite als auch beim Beenden des Dialogs aufgerufen. Falls der Benutzer neue Werte eingegeben hat, werden diese gespeichert. HRESULT OnDisconnect(void) Aufruf beim Verlassen des Dialogs. Auch hier werden die Änderungen übernommen. E.2.6 PropertyType Diese Datenstruktur wird in Anhang D.4.8 erläutert. E.2.7 SDK.h In dieser zentralen SDK-Datei befinden sich Präprozessorbefehle, die – basierend auf den Angaben aus FilterDefs.h – wichtige Methoden in den Code der Filterklasse einfügen, z.B. die Factory-Methode zum Erzeugen einer Instanz. Darüber hinaus werden Makros definiert, die PinFelder mit Pin-Instanzen füllen. Auf diese Weise wird ein ein Arbeiten in der zu erstellenden Filterklasse ermöglicht, als ob der Benutzer selbst diese Angaben manuell gemacht hätte. E.2.8 DXAudioBuffer Diese Stuktur wird in CMonitoringBaseFilter intern zum Datentransport verwendet. struct DXAudioBuffer { long cSamp; IMediaSample* pms; }; // Anzahl Samples im Buffer // das DirectX-IMediaSample für diesen Buffer E.2.9 GlobalDefs.h Diese Headerdatei beinhaltet die CLSIDs von CMonitoringBaseFilter_PropertyPage. CMonitoringBaseFilter und E.2.10 EventSample.h Diese Headerdatei enthält die in Anhang D.4.2 abgebildete EventSample-Datenstruktur. 117 Anhang E. Technische Dokumentation des Filter-SDK E.3 Die Pin-Klassen Im Folgenden sollen die wichtigen Methoden der Pin-Klassen erläutert werden. Dabei werden wichtige Operationen durch ein serialisierendes Streaming-Lock vom Typ CCritSec geschützt, das sich mittels Initialisierung durch die CAutoLock-Klasse automatisch selbst wieder öffnet. E.3.1 CMonitoringAudioInputPin class CMonitoringAudioInputPin : public CBaseInputPin Diese Klasse repräsentiert einen Eingangs-Audiopin. HRESULT CheckMediaType( const CMediaType* pmt ) In dieser Methode findet ein Teil der Kontrolle über Datenformate statt, die der Pin und somit das Filter für eingehende Daten akzeptieren. Wie in Abschnitt 5.2.1 erläutert findet hier nur ein prinzipielles Ablehnen von Nicht-Audioformaten des übergebenen Parameters statt; das eigentliche Überprüfen wird an das Filter deligiert. HRESULT Receive( IMediaSample* pms ) Hier werden eingehende IMediaSample-Datenblöcke in DXAudioBuffer-Objekte verpackt an das Filter zur Weiterverarbeitung in PreProcessAudio() weitergereicht und abschließend per DeliverOutputBuffer()-Funktion des Filters zu nachgeschalteten Filtern transportiert. Im Fall einer Stream-Unterbrechung wird dies hier zusätzlich mit einem Zeitstempel festgehalten. HRESULT EndOfStream() Am Ende des Datenstroms aufgerufen sorgt diese Methode dafür, dass sämtliche noch vorhandene Datenblöcke – wie in Receive() – verarbeitet und weitertransportiert werden. E.3.2 CMonitoringAudioOutputPin class CMonitoringAudioOutputPin : public CBaseOutputPin Diese Klasse repräsentiert einen Ausgangs-Audiopin. HRESULT CheckMediaType( const CMediaType* pmt ) Der Vorgang ist nahezu identisch mit dem in CMonitoringAudioInputPin, hier wird jedoch zusätzlich noch darauf geachtet, dass der Eingangs-Audiopin überhaupt verbunden ist. HRESULT DecideBufferSize( IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProp ) Um den Transport von Ausgangs-Pin zu Eingangs-Pin zweier Filter zu ermöglichen, verwenden diese im Push-Modus ein sogenanntes IMemAllocator-Objekt, das hier als Parameter übergeben wird. Dessen ebenfalls übergebene Eigenschaften bestimmen die Details des Transportes und werden an dieser Stelle abgestimmt. STDMETHODIMP EnumMediaTypes( IEnumMediaTypes** ppEnum ) Diese Methode liefert per übergebenem Parameter eine Liste aller präferierten Medientypen zurück, in dem versucht wird, diese Funktion auf denjenigen Pin anzuwenden, der mit dem Eingangs-AudioPin des Filters verbunden ist. Die Anfrage wird also nach Möglichkeit stromaufwärts weitergeleitet. 118 Anhang E. Technische Dokumentation des Filter-SDK STDMETHODIMP NonDelegatingQueryInterface( REFIID riid, void**ppv ) Die von dieser Klasse an vorgeschaltete Filter weitergeleiteten IMediaPosition- bzw. IMediaSeeking-Anfragen werden hier veröffentlicht. E.3.3 CMonitoringEventInputPin class CMonitoringEventInputPin : public CBaseInputPin Diese Klasse repräsentiert einen Eingangs-Eventpin. HRESULT CheckMediaType( const CMediaType* pmt ) Analog zum Vorgehen in den Audiopins werden hier nur Nicht-Eventformate abgelehnt, bevor die Anfrage an das Filter weitergereicht wird. HRESULT Receive( IMediaSample* pms ) Diese Methode reicht das unbearbeitete Eventobjekt, welches noch in ein von DirectShow zum Transport verwendetes IMediaSample-Objekt verpackt ist, an die Filter-Methode PreProcessEvent() weiter. E.3.4 CMonitoringEventOutputPin class CMonitoringEventOutputPin : public CBaseOutputPin Diese Klasse repäsentiert einen Ausgangs-Eventpin. STDMETHODIMP NonDelegatingQueryInterface( REFIID riid, void**ppv ) Die von dieser Klasse an vorgeschaltete Filter weitergeleiteten IMediaPosition- bzw. IMediaSeeking-Anfragen werden hier veröffentlicht. HRESULT CheckMediaType( const CMediaType* pmt ) Der Vorgang ist inhaltlich identisch mit dem in CMonitoringEventInputPin. HRESULT DecideBufferSize( IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProp ) Genau wie im Fall der Audiopins werden auch hier Eigenschaften des IMemAllocatorObjektes mit verbundenen Pins abgestimmt. Dazu wird zunächst versucht, die Eigenschaften eines Eingangs-Eventpins zu verwenden. Ist ein solcher nicht vorhanden, werden die wichtigsten Eigenschaft, Anzahl und Größe der verwendeten Puffer, auf zwei Puffer der Größe eines EventSample-Objektes festgesetzt. STDMETHODIMP EnumMediaTypes( IEnumMediaTypes** ppEnum ) Diese Methode liefert einen Enumerator zum Auflisten aller präferierten Medientypen zurück. HRESULT DeliverEvent( IMediaSample* pms ) Diese Methode liefert einen übergebenen Event an einen verbundenen Pin durch direkte Verwendung von DirectShow-Funktionalität. 119 Anhang E. Technische Dokumentation des Filter-SDK E.4 CMonitoringBaseFilter class CMonitoringBaseFilter : public CBaseFilter, public IspecifyPropertyPages, public CPersistStream, public IMonitoringSlave, public IMediaSeeking //DirectShow Filter //Property Pages //Speichern interner Variablen //"unser" Interface //Position setzen Diese Klasse beinhaltet Filter-spezifische Themen wie Datentransport, Format-Abgleich und andere. Ein neues, zu erstellendes Filter, das von dieser Klasse ableitet, kann dadurch auf einem festen Fundament aufbauen, das sämtliche Low-Level-Arbeit abdeckt und dem Entwickler die notwendige Verantwortung abnimmt. Dadurch kann dieser sich auf die wesentlich Bestandteile des neuen Filters konzentrieren und somit die Produktivität nachhaltig steigern. Alle im Rahmen dieser Diplomarbeit vorgestellten Filter leiten direkt von CMonitoringBaseFilter ab. CMonitoringBaseFilter ist eine Klasse, die zwischen DirectShow-Funktionalität und GenMADKommunikation vermittelt. Dazu bedient sie sich einer Reihe wichtiger Eigenschaften: char sFiltername[255]; //GraphController-Name des Filters PBYTE pShowAudioBuf; IMemAllocator* m_pAllocator; LONGLONG m_llSamplePosition; CCritSec m_Lock; //Datenpuffer für zu anzuzeigende Audiodaten //Allokator zur Übergabe der Daten //aktuelle Stream-Position //Lock: Zugriff wird serialisiert //die Pins, maximal je zwei Eventpins CMonitoringAudioInputPin *pAudioInputPin; CMonitoringAudioOutputPin *pAudioOutputPin; CMonitoringEventInputPin *pEventInputPin[2]; CMonitoringEventOutputPin *pEventOutputPin[2]; IMonitoringMaster *pMonitoringMaster; //Kommunication mit GenMAD //veröffentlichte Properties PropertyType *pPropertyType; int cPropertyCount; //Zeitstempel des aktuellen (evtl. noch offenen) Puffers REFERENCE_TIME ref_s; REFERENCE_TIME rtSeekOffset; //eigenes puffer management: int iBufferSize; int iDirectXBufferSize; bool bUseSpecificBuffer; BYTE *pSpecificBuffer; BYTE *pBuffer; //Puffergrösse in Byte //aktuelle DirectShow-Puffergrösse //eigenen Puffer verwenden? //der eigene Puffer //Zeiger auf aktuelle Puffer-Schreibestelle Nachfolgend werden die wesentlichen Methoden erläutert: void Init() In dieser Funktion, die unter anderem von den Konstruktoren aufgerufen wird, ist die zentrale Initialisierung aller Variablen enthalten. 120 Anhang E. Technische Dokumentation des Filter-SDK virtual virtual virtual virtual virtual virtual virtual virtual virtual virtual virtual virtual HRESULT CallSlave(int iCodeID, void* pParam, void** ppReturnValue); HRESULT SetIMonitoringMaster(IMonitoringMaster *pmm); int GetAllProperties(PropertyType **ppPropertyVarType); HRESULT GetProperty(int iPropID, PropertyType *pProp); HRESULT SetProperty(PropertyType Prop); HRESULT SetShowAudioData(bool bShowData); void FreeResources(); int Ready(char *szErrMsg); void SetBufferSize(int iBytes); int GetBufferSize() {return iBufferSize;}; HRESULT SetParam(int iParamID, double dValue); void SetFilterName(char* sNewName); Diese Methoden sind die Implementation des IMonitoringSlave-Interfaces, welches im Anhang D.3.2 erläutert ist. CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr) Factory-Methode zum Erzeugen des Filters. void SendNotify(long EventCode) Versenden von DirectShow-Ereignissen mit übergebenem Code. HRESULT SendEvent(EventSample* pes) Senden eines übergebenen Datensatzes vom Typ Event an alle nachgeschalteten Filter. Dazu wird der Event binär serialisiert und als Block an alle verbundenen Ausgangs-Eventpins versandt. HRESULT PreProcessEvent(IMediaSample *pSample, int iPinID) Hier findet der zu SendEvent() entgegengesetzte Prozess statt, in dem aus einem binären IMediaSample-Datenblock ein Event deserialisiert wird, das an ProcessEvent() weitergereicht wird. Der Parameter iPinID definiert dabei den Pin, der die Daten empfangen hat. HRESULT ProcessEvent(EventSample es, int iPinID) Von abgeleiteten Filterklassen zu implementierende Methode zur Behandlung eines übergebenen Events. Der Parameter iPinID definiert dabei den Pin, der die Daten empfangen hat. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) Bekanntgabe implementierter Schnittstellen: IMonitoringSlave, ISpecifyPropertyPages, IPersistStream und IMediaSeeking. HRESULT GetPeerSeeking(IMediaSeeking ** ppMS) Hilfsfunktion für Seeking-Funktionalität: Diese Methode versucht ein stromaufwärts implementiertes IMediaSeeking-Interface zurück zu liefern. HRESULT GetSeekingLongLong( HRESULT (__stdcall IMediaSeeking::*pMethod)(LONGLONG*), LONGLONG *pll) Eine zweite Hilfsfunktion für das Seeking: Diese liefert zu einem gegebenen IMediaSeeking die Adresse einer Funktionsimplementation der Schnittstelle und somit eine Sprungadresse für den Funktionsaufruf. virtual virtual virtual virtual virtual virtual virtual virtual GetCapabilities( DWORD *pCapabilities ); CheckCapabilities( DWORD *pCapabilities ); SetTimeFormat(const GUID *pFormat); GetTimeFormat(GUID *pFormat); IsUsingTimeFormat(const GUID *pFormat); IsFormatSupported( const GUID *pFormat); QueryPreferredFormat( GUID *pFormat); ConvertTimeFormat(LONGLONG *pTarget, const GUID *pTargetFormat, 121 Anhang E. Technische Dokumentation des Filter-SDK LONGLONG Source, const GUID *pSourceFormat); virtual SetPositions( LONGLONG *pCurrent, DWORD CurrentFlags, LONGLONG *pStop, DWORD StopFlags ); virtual GetPositions( LONGLONG *pCurrent, LONGLONG *pStop ); virtual GetCurrentPosition( LONGLONG *pCurrent ); virtual GetStopPosition( LONGLONG *pStop ); virtual SetRate( double dRate); virtual GetRate( double *pdRate); virtual GetDuration( LONGLONG *pDuration); virtual GetAvailable( LONGLONG *pEarliest, LONGLONG *pLatest ); virtual GetPreroll( LONGLONG *pllPreroll ); Diese Methoden stellen die Implementierung des IMediaSeeking-Interfaces dar. Allerdings leiten sämtliche Methoden die eingehenden Anfragen per GetPeerSeeking() oder GetSeekingLongLong() an stromaufwärts verbundene Filter weiter, falls möglich. Ansonsten wird ein Fehlercode zurück geliefert. HRESULT PreProcessAudio(IMediaSample *pSample) In dieser Methode findet die gesamte Vorverarbeitung eines übergebenen Audiodatenblocks statt: Dazu werden zunächst Block-Eigenschaften wie Größe, Zeitstempel und Adresse der eigentlichen Daten ermittelt. Falls das aktuelle Filter den Audiofokus zugewiesen hat, wird eine AudioBuffer-Objekt mit den Daten befüllt und an GenMAD übergeben. Im Anschluss findet, falls vorgegeben, die Anpassung auf eine benutzerdefinierte Puffergröße statt; dazu werden die Daten sukzessiv in einen anderen Puffer namens pSpecificBuffer kopiert und an ProcessAudio() übergeben. Falls am Ende der Routine Samples nicht verarbeitet wurden, bleiben diese in pSpecificBuffer bis zum nächsten Aufruf erhalten. HRESULT ProcessAudio(PBYTE pb, int cb, LONGLONG timestamp) Von abgeleiteten Filterklassen zu implementierende Methode zur Behandlung eines übergebenen Audioblocks pb der Länge cb. Der Parameter timestamp definiert dabei den Zeitstempel des Blocks. HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages) Die Schnittstelle ISpecifyPropertyPages implementierende Methode zur Übergabe von Anzahl und GUID der verwendeten Konfigurationsseiten. virtual virtual virtual virtual virtual HRESULT WriteToStream(IStream *pStream); HRESULT ReadFromStream(IStream *pStream); int SizeMax(); GetClassID(CLSID *pClsid); DWORD GetSoftwareVersion(void); Implementation des IPersistStream-Interfaces. Dazu werden Werte mittels eines IStream-Objektes serialisiert und zur Speicherung zurückgegeben bzw. aus einem IStreamObjekt deserialisiert und in die entsprechenden Variablen übertragen. Die anderen Methoden sind Hilfsfunktionen. void STDMETHODCALLTYPE SetBufferSize(int iBytes) Diese Methode wird zu Einstellen einer benutzerdefinierten Audio-Puffergröße iBytes aufgerufen und ändert diese je nach Abspielstatus entweder direkt oder setzt wegen der Verwendung der zu ändernden Puffer ein entsprechendes Flag, welches in PreProcessAudio() als Indikator zur verzögerten Änderung verstanden wird. void SetBufferSizeExec(int iBytes) Führt die Änderung der neuen Puffergröße iBytes durch. 122 Anhang E. Technische Dokumentation des Filter-SDK bool InTime(REFERENCE_TIME rfBlockTime) Diese Methode ermöglicht durch Überschreiben das Ausfiltern von Audioblöcken, deren Zeitstempel eine gewissene Latenz überschreitet, z.B. im Fall nicht echtzeitfähiger Algorithmen. Dazu wird die Methode mit dem zu untersuchenden Zeitstempel von PreProcessAudio() aufgerufen und zeigt das nötige Ausfiltern durch Zurückliefern von FALSE an. virtual STDMETHODIMP Stop(); virtual STDMETHODIMP Pause(); virtual STDMETHODIMP Run(REFERENCE_TIME tStart); Diese drei grundlegenden Funktionen rufen jeweils zunächst die entsprechende Methode der Basisklasse auf und behandeln anschließend ein eventuell auftretendes Ende des Datenstromes. HRESULT CheckMediaType( PIN_DIRECTION pinDir, const CMediaType* pmt ) HRESULT CheckTransform( const CMediaType* pmtIn, const CMediaType* pmtOut ) HRESULT SetMediaType( PIN_DIRECTION pindir, const CMediaType* pmt ) Unter Verwendung von Parametern zur Flussrichtung des betreffenden Pins und der zu untersuchenden Medienformatee bestimmen diese drei Methoden, welche Datentypen direkt bzw. nach Transformation akzeptiert werden können und erhalten eine Benachrichtigung über das vereinbarte, verbindliche Format. HRESULT GetOutputBuffer( CMonitoringAudioOutputPin* pOutputPin, DXAudioBuffer* pbufOut, REFERENCE_TIME* prtStart, BOOL bSyncPoint, BOOL bDiscontinuity, BOOL bPreroll ) HRESULT DeliverOutputBuffer( CMonitoringAudioOutputPin* pOutputPin, DXAudioBuffer* pbufOut, HRESULT hrProcess, BOOL bCleanup ) Diese beiden überschriebenen Methoden erzeugen unter Verwendung der Parameter einen neuen Audiopuffer und liefern diesen über den Ausgangs-Audiopin aus. HRESULT EndOfStream() Diese Methode garantiert im Fall einer benutzerdefinierten Puffergröße die Abarbeitung noch offener Samples per ProcessAudio(), falls das Ende des Datenstromes signalisiert wird. 123 Anhang F Bedienung des Klassifikationsfilters Das MonitoringClassifier-Filter operiert in sieben verschiedenen Modi: Modus 0: Erkennungsmodus, arbeitet auf im k-d-Baum abgelegten Trainingsdaten. Klassifikationen werden als Events an nachgeschaltete Filter versandt. Modus 1: Aus Trainingsdaten den k-d-Baum erstellen. Dies kann je nach Datenmenge einige Zeit in Anspruch nehmen, in der das Filter nicht reagiert. Modus 2: Laden des Baumes aus einer Datei Modus 3: Speichern des Baumes in eine Datei Modus 4: Trainingsdaten für Klasse Musik Modus 5: Trainingsdaten für Klasse Sprache Modus 6: Reset aller Baumdaten Um Audiosignale zu klassifizieren, muss entweder ein bereits trainierter Baum aus den in einer Datei abgelegten Daten geladen (Modus 2) oder selbst eine Menge von Trainingsdaten zur Konstruktion verwendet werden (Modi 4/5 zum Training, danach Modus 1 für die Erzeugung des Baumes). Wird ein Klassifikatorfilter durch Laden eines Projektes aufgerufen, so wird versucht, die entsprechenden Baumdaten automatisch zu laden. Entsprechend umfasst der Konfigurationsdialog folgende Parameter: Index-Dateiname: Datei für das Laden und Speichern des Baumes k: Parameter des k-NN-Klassifikators Modus: aktueller Operationsmodus Stille_Schwellwert: Schwellwert der Stille-Erkennungsstufe 124 Anhang G Inhalt der beiliegenden CD Auf der beiliegenden CD befindet sich die folgende Verzeichnisstruktur: \AudentifyFilter \BaseFilter \Classifier \DirectX \EventExcluder \EventIncluder \EventMerger \EventNullRenderer \EventSplitter \EventVisualizer \Interfaces \Monitor \SDK \WaveDest \XmlReader \XmlWriter GenMAD.exe MonitoringAudentifyFilter.ax MonitoringClassifier.ax MonitoringEventExcluder.ax MonitoringEventIncluder.ax MonitoringEventMerger.ax MonitoringEventNullRenderer.ax MonitoringEventSplitter.ax MonitoringEventVisualizer.ax MonitoringXMLReader.ax MonitoringXMLWriter.ax pcmIndexDLL.dll wavdest.ax Dabei handelt es sich um die Verzeichnisse mit den Quelltexten und den Projektdateien der einzelnen Filter und von GenMAD, welches sich im Verzeichnis Monitor befindet. Hinzu kommen Verzeichnisse mit gemeinsamen Elementen. Im Wurzelverzeichnis befinden sich die kompilierten Versionen aller Komponenten, die nach der Registrierung (siehe Anhang B) direkt lauffähig sind. 125 Literaturverzeichnis [1] P. Ackermann, “Developing Object-Oriented Multimedia Software - Based on MET++ Application Framework”, dpunkt Verlag, Heidelberg, 1996. [2] E. Allamanche, J. Herre, O. Helmuth, B. Fröba, T. Kasten and M. Cremer, “Contentbased identication of audio material using mpeg-7 low level description”, in Proc.of the Int. Symp. of Music Information Retrieval (ISMIR), Indiana, USA, Oct.2002. [3] M. Alonso, B. David and G. Richard, “Tempo and beat estimation of music signals”, Proc. of ISMIR 2004, Barcelona, Spain, Oct. 2004. [4] ALSA, Advanced Linux Sound Architecture Projekt Homepage http://www.alsa-project.org [5] Apple iTunes http://www.itunes.de [6] Apple Logic Pro http://www.apple.com/logic [7] Apple Quicktime http://developer.apple.com/quicktime [8] J.-J. Aucouturier and M. Sandler, “Segmentation of Musical Signals Using Hidden Markov Models”, Proceedings of the Audio Engineering Society 110th Convention, May 2001. [9] Audioble Magic http://www.audiblemagic.com [10] AudibleMagic Press, "Indies Join Major Labels In Fingerprinting Songs For Copyright Protection With Audible Magic's RepliCheck Service", 25.10.2004. http://www.clango.com/news&press/press_20041025.html [11] R. Baeza-Yates and B. Ribiero-Neto, „Modern Information Retrieval“, Addison Wesley, 1999. [12] B. Bailey, J. A. Konstan, R. Cooley and M. Dejong, “Nsync – A toolkit for building interactive multimedia presentations”, Proceedings of the 6th ACM International Conference on Multimedia'98, ACM Press, 257-266, 1998. [13] R.Bardeli, „Effiziente Algorithmen zur deformationstoleranten Suche in Audiodaten“, Diplomarbeit, Universität Bonn, 2003. 126 Literaturverzeichnis [14] E. Batlle, J. Masip, E. Guaus, “Amadeus: A Scalable HMM-based Audio Information Retrieval System”, Proceedings of First International Symposium on Control, Communications and Signal Processing, Hammamet, Tunisia, 2004. [15] Bay TSP – Tracking, Security & Protection http://www.baytsp.com [16] R. Bellman, “Adaptive Control Processes: A Guided Tour”, Princeton University Press, 1961. [17] C. M. Bishop, “Neural Networks for Pattern Recognition”, Oxford University Press, Oxford, 1995. [18] G. Booch, “Object Oriented Design with Applications”, Benjamin/Cummings, Redwood City, 2. Auflage, 1994. [19] Brand Detector http://www.detect-tv.com [20] C. J. C. Burges, J. C. Platt, S. Jana, “Extracting Noise-Robust Features from Audio Data”, Microsoft Res., Redmond, WA; ICASSP, p. 1021-1024, 2002. [21] P. Cano, E. Batlle, T. Kalker, and J. Haitsma, “Review of Audio Fingerprinting Algorithms”, in MMSP, 2002. [22] P. Cano, E. Batlle, H. Mayer, and H. Neuschmied, “Robust sound modeling for song detection in broadcast audio”, in Proc. AES 112th Int. Conv., Munich, Germany, May 2002. [23] P. Cano, M. Koppenberger, S. Le Groux, J. Ricard, P. Herrera, N. Wack, “Nearestneighbor generic sound classification with a wordnet-based taxonomy”, Proceedings of AES 116th Convention, Berlin, Germany, 2004. [24] Cedega http://www.transgaming.com [25] E. Chavez, G. Navarro, R. A. Baeza-Yates and J. L. Marroquin, “Searching in metric spaces”, ACM Computing Surveys, vol.33, no.3, pp.273-321, 2001. [26] Cycling 74 Max/MSP – a graphical environment for music, audio, and multimedia. http://www.cycling74.com/products/maxmsp.html [27] M. Davy and S. G. Godsill, „Audio information retrieval: a bibliographical study“, Technical Report CUED/F-INFENG/TR.429, Cambridge University Engineering Department, 2002. [28] L. deCarmo, “A new architecture for multimedia”, PC Magazine, 6, 1998. [29] D. Dingeldein, “Modeling multimedia objects with MME”, Proceedings of the EUROGRAPHICS Workshop on Object-Oriented Graphics (EOOG'94), 1994. [30] DirectX Files http://www.directxfiles.com 127 Literaturverzeichnis [31] C. Djeraba, H. Saadane, “Automatic Discrimination in Audio Documents”, IRIN, Nantes University, o. J. [32] P. J. O. Doets and R. L. Lagendijk, “Theoretical Modeling Of A Robust Audio Fingerprinting System”, Fourth IEEE Benelux Signal Processing Symposium, 2004. [33] M. Duarte and Y. H. Hu, “Vehicle classification in distributed sensor networks”, Journal of Parallel and Distributed Computing, 2004. [34] K. El-Maleh, M. Klein, G. Petrucci, and P. Kabal, “Speech music discrimination for multimedia applications”, In ICASSP, vol. IV, pp. 2445-2448, 2000. [35] G. Engels, S. Sauer, „Object-oriented modeling of multimedia applications”, In S.-K. Chang (ed.), Handbook of multimedia applications, pp.21-53, World Scientific, 2002. [36] M. E. Fayad and D. C. Schmidt, “Special issue on object oriented application frameworks”, Comm. of the ACM, 40, October 1997. [37] R. Ferber, „Data Mining und Information Retrieval“, Kap. 1.3.7, dpunkt Verlag, 2003. [38] J. Foote, „An overview of audio information retrieval“, Multimedia Systems, vol.7 no.1, p.210, Jan. 1999. [39] J. H. Friedman, J. L. Bentley and R. A. Finkel, “An algorithm for finding best matches in logarithmic expected time”, ACM Trans. Math. Software 3, no. 3, 209-226, 1977. [40] F. Fünfstück, R. Liskowsky, K. Meißner, „Softwarewerkzeuge zur Entwicklung multimedialer Anwendungen. Eine Übersicht“, Informatik Spektrum, 23:1, 11-25, 2000. [41] J. Garcia, V. Tarasov, E. Batlle, E. Guaus, J. Masip, “Industrial audio fingerprinting distributed system with CORBA and Web Services”, Proceedings of Fifth International Conference on Music Information Retrieval, Barcelona, 2004. [42] D. Gerhard, “Audio Signal Classification: History and Current Techniques”, Technical Report TR-CS 2003-7, University of Regina Department of Computer Science, November 2003. [43] Gesellschaft für deutsche Sprache (GfdS) – Wörter des Jahres http://www.gfds.de/woerter.html [44] GStreamer Projekt Homepage http://gstreamer.freedesktop.org [45] J. Haitsma and T. Kalker, “A highly robust audio fingerprinting system”, International Symposium on Musical Information Retrieval (ISMIR), 2002. [46] Helix Player https://helixcommunity.org [47] P. Herrera-Boyer, G. Peeters, and S. Dubnov, “Automatic classification of musical instrument sounds”, Mosart Deliverabel D22, Evaluation report of Timbre modeling, 2002. 128 Literaturverzeichnis [48] T. Hoeren, „Einführung in das Multimedia-Recht“, Symposium „Internet zwischen Kunst und Kommerz“, Wiesbaden, 1996. [49] D. Hubbard, "A simple STL based XML parser" http://www.codeproject.com/cpp/stlxmlparser.asp [50] O. Izmirli, “Using a Spectral Flatness Based Feature for Audio Segmentation and Retrieval”, Proceedings of the International Symposium on Music Information Retrieval (ISMIR2000), Plymouth, Massachusetts, USA, October 2000. [51] JACK Projekt Homepage http://jackit.sourceforge.net [52] A. K. Jain, R. P. W. Duin and J. Mao, “Statistical pattern recognition: a review”, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 22, no. 1, pp. 4-37, 2000. [53] Java Media Framework http://java.sun.com/products/java-media/jmf [54] R. E. Johnson and B. Foote, “Designing Reusable Classes”, Journal of Object-Oriented Programming (JOOP), June/July 1988. [55] E. R. Kandel, J. H. Schwartz, T. M. Jessell, “Principles of Neural Science”, 4th Edition, McGrawHill, 2000. [56] D. Kimber and L. Wilcox, “Acoustic Segmentation for Audio Browsers”, Proc. Interface Conference, Sydney, Australia, July, 1996. [57] F. Kurth, „Beiträge zum effizienten Multimediaretrieval“, Habilitationsschrift, Universität Bonn, 2004. [58] F. Kurth, R. Scherzer, ”Robust Real-Time-Identification of PCM Audio Sources”, In: Proc. 114th AES Convention, Amsterdam, NL, 2003. [59] A. T. K. Leong, “A Music Identification System Based on Audio Content Similarity”, work for the degree for Bachelor of Engineering, Univ. of Queensland, Oct. 2003. [60] Linux New Media Award 2004 http://www.linuxnewmedia.de/Award_2004/award2004 [61] Linux Simple DirectMedia Layer Projekt Homepage http://www.libsdl.org [62] Z. Liu, Q. Huang, “Classification of Audio Events for Broadcast News”, IEEE Workshop on Multimedia Signal Processing, Los Angeles, 1998. [63] B. Logan, “Mel Frequency Cepstral Coefficients for music modeling”, International Symposium on Music Information Retrieval (ISMIR), 2000. [64] MARSYAS – a software framework for computer audition. http://opihi.cs.uvic.ca/marsyas 129 Literaturverzeichnis [65] M.F. McKinney and J. Breebaart, “Features for Audio and Music Classification”, in 4th International Conference on Music Information, 2003. [66] Media Transfer Protocol Specification, MTP http://msdn.microsoft.com/library/default.asp?url=/library /en-us/dnwmt/html/mtp_spec.asp [67] Microsoft DirectX http://msdn.microsoft.com/directx [68] MIDI-Spezifikation http://www.midi.org/about-midi/specinfo.shtml [69] A. Moore, “K-means and Hierarchical Clustering”, Carnegie Mellon Univ., 2001. [70] MPEG-7 Overview (version 9), 2003. http://www.chiariglione.org/MPEG/standards/mpeg-7/mpeg7.htm [71] MPEG-21 Overview 5, Oktober 2002. http://www.chiariglione.org/MPEG/standards/mpeg-21/mpeg21.htm [72] MSN Music http://beta.music.msn.com [73] Music Reporter http://www.musicreporter.net [74] MusicBrainz http://www.musicbrainz.org [75] MusicMatch Jukebox http://www.musicmatch.com [76] MusicTrace, "Broadcast Monitoring and Internet Tracing for Music and Advertising" http://www.musictrace.de [77] Napster http://www.napster.com [78] Native Instruments Reaktor http://www.nativeinstruments.de [79] Nielsen Broadcast Data System http://www.bdsonline.com [80] A. Y. Nooralahiyan, L. Lopez, D. McKewon and M. Ahmadi, “Time-delay neural network for audio monitoring of road traffic and vehicle classification“, Proc. SPIE Vol. 2902, pp. 191-198, 1997. 130 Literaturverzeichnis [81] A. V. Oppenheim, R. W. Schafer and J. R. Buck, “Discrete-Time Signal Processing”, 2nd edition, Prentice-Hall, Inc., 1999. [82] C. Panagiotakis and G. Tziritas, “A Speech/Music Discriminator Based on RMS and Zero-Crossings”, IEEE Transactions on Multimedia, 2003. [83] K. Pearson, “On lines and planes of closest fit to systems of points in space”, The London, Edinburgh and Dublin Philosophical Magazine and Journal of Science, 1901. [84] V. Peltonen, “Computational auditory scene recognition”, M.Sc. thesis, Tampere University of Technology, Finland, 2001. [85] Philips - Gracenote Joint Venture http://www.research.philips.com/initiatives/contentid [86] Real Networks http://www.real.com [87] Relatable http://www.relatable.com [88] RFC 1889, "RTP, real time transport protocol & RTCP, RTP control protocol" [89] RFC 2326, "RTSP, Real Time Streaming Protocol" [90] RIAA-IFPI, "Request for information on audio fingerprinting technologies", 2001. http://www.ifpi.org/site-content/press/20010615.html [91] A. Ribbrock, F. Kurth, “A Full-Text Retrieval Approach to Content-Based Audio Identification”, International Workshop on Multimedia Signal Processing, St. Thomas, US Virgin Islands, December 2002. [92] E. Scheirer, “Tempo and Beat Analysis of Acoustic Musical Signals”, in J. Acoust. Soc. Am. 103(1), pp 588-601, Jan 1998. [93] E. Scheirer and M. Slaney, “Construction and evaluation of a robust multifeature speech music discriminator”, In ICASSP, 1997. [94] C. E. Shannon, “Communication in the presence of noise”, Proc. Institute of Radio Engineers, vol. 37, no.1, pp. 10-21, Jan. 1949. [95] J. O. Smith and J. S. Abel, “The Bark and ERB bilinear transforms”, IEEE Trans. Speech and Audio Processing, vol. 76, pp. 697-708, Nov. 1999. [96] J. O. Smith and P. Gossett, “A flexible sampling-rate conversion method”, in Proceedings of the International Conference on Acoustics, Speech, and Signal Processing, San Diego, vol. 2, (New York), pp. 19.4.1-19.4.2, March 1984. [97] B. C. Smith, L. A. Rowe, J. A. Konstan and K. D. Patel, “The Berkeley Continuous Media Toolkit”, Proceedings of the 4th ACM International Conference on Multimedia'96, ACM Press, pp. 451-452, 1996. 131 Literaturverzeichnis [98] Snocap http://www.snocap.com [99] Spiegel Online, "Rot-Grün setzt sich für Radioquote ein", 15.12.2004 http://www.spiegel.de/kultur/gesellschaft/0,1518,333030,00 .html [100] R. Steinmetz, „Multimedia-Technologie: Grundlagen, Komponenten und Systeme“, Springer Verlag 1999. [101] N. Stiel, “Multimedia: the new frontier”, Encyclopaedia Universalis, pp.144-149, 1995. [102] C. Sun, S. G. Ritchie and S. Oh, “Inductive Classifying Artificial Network for Vehicle Type Categorization”, Computer-Aided Civil and Infrastructure Engineering 18 (3), pp. 161-172, 2003. [103] Taligent, “Building Object-Oriented Frameworks, A Taligent White Paper”, Technical report, Taligent Inc., 1994. [104] Technology Review, "LABOR: Forschung und Entwicklung: Der Sinn der Musik". http://www.heise.de/tr/artikel/44683/0 [105] G. Tzanetakis, “Manipulation, Analysis and Retrieval Systems for Audio Signals”, Princeton Computer Science Technical Report TR-651-02 , June 2002. [106] G. Tzanetakis and P. Cook, “MARSYAS: A Framework for Audio Analysis”, Organized Sound, Cambridge University Press 4(3), 2000. [107] G. Tzanetakis and P. Cook, “Multi-Feature Audio Segmentation for Browsing and Annotation”, In Proc. IEEE Workshop on Applications of Signal Processing to Audio and Acoustics (WASPAA), New Paltz, NY, 1999. [108] G. Tzanetakis, G. Essl and P. Cook, “Automatic Musical Genre Classification Of Audio Signals”, presented at International Symposium on Music Information Retrieval, Bloomington, Indiana, USA, 2001. [109] G. Tzanetakis, J. Gao and P. Steenkiste, “A scalable peer-to-peer system for music content and information retrieval”, Computer Music Journal (Special Issue on Music Information Retrieval), 2004. [110] M. Vacher, D. Istrate, L. Besacier, J. F. Serignat and E. Castelli, “Sound Detection and Classification for Medical Telesurvey”, Proc. Of the 2nd Intern. Conf. Biomedical Engineering, Innsbruck, Austria, 2004. [111] C. J. Van Rijsbergen, “Information Retrieval”, Butterworths, Boston, 1980. [112] A. Viterbi, "Error bounds for convolutional codes and an asymptotically optimum decoding algorithm", IEEE Transactions on Information Theory, vol. 13, no2, pp.260-269, 2001. [113] Vorlesungsskript Medientechnik, Universität Hamburg, WS 2001 132 Literaturverzeichnis [114] A. Wang. “An Industrial Strength Audio Search Algorithm”. Proc.of the Int. Symp. of Music Information Retrieval 2003, Baltimore, 2003. [115] H. Wessels, “Audio Information Retrieval: Überblick”, Proseminar “Robuste Signalidentifikation”, Universität Bonn, 2003/04. [116] Wikipedia, Discrete cosine transform http://en.wikipedia.org/wiki/Discrete_cosine_transform [117] E. Wold, T. Blum, D. Keislar and J. Wheaton, “Content-based classification, search and retrieval of audio”, IEEE Multimedia Mag., vol. 3, pp. 27-36, July 1996. [118] H. J. Wolfson and I. Rigoutsos, “Geometric hashing: An overview”, IEEE Computational Science and Engineering, pp. 10-21, October-December 1997. [119] W3C, "Semantic Web" Homepage http://www.w3.org/2001/sw [120] Yacast http://www.yacast.com [121] A. Zell, „Simulation neuronaler Netze“, Addison-Wesley Verlag, Bonn, 1994. [122] T. Zhang and C.-C. J. Kuo, “Hierarchical System for Content-based Audio Classification and Retrieval”, SPIE's Conference on Multimedia Storage and Archiving Systems III, Boston, Nov. 1998. [123] Steinberg Cubase http://www.steinberg.de [124] MET++ www.ifi.unizh.ch/groups/mml/projects/met++/met++.html Die Gültigkeit aller angegebenen URLs wurde zuletzt am 26.2.2005 überprüft. 133 Erklärung Hiermit erkläre ich, die vorliegende Arbeit selbständig verfasst und unter ausschließlicher Verwendung der angegebenen Literatur angefertigt zu haben.