Bearbeiten von „RoarAudio/Vorlage Vortrag (1h)“
Aus UUGRN
Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden.
Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und speichere dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.
Aktuelle Version | Dein Text | ||
Zeile 1: | Zeile 1: | ||
<div style="background:#fee846;text-align:left; color: #000;font-weight:bold;font-size:125%;margin: 0px 5px 0px 0; padding: 4px 4px 4px 14px;">Was ist RoarAudio?</div> | <div style="background:#fee846;text-align:left; color: #000;font-weight:bold;font-size:125%;margin: 0px 5px 0px 0; padding: 4px 4px 4px 14px;">Was ist RoarAudio?</div> | ||
<div style="margin: 0 5px 5px 0; padding: 1em 1em 1em 1em; border: 1px solid #fee846; background-color:#fffdf5;"> | <div style="margin: 0 5px 5px 0; padding: 1em 1em 1em 1em; border: 1px solid #fee846; background-color:#fffdf5;"> | ||
− | ; Ziel : ein Vortrag über [[RoarAudio]] vor einem Unixpublikum mit keinen oder kaum Vorwissen zum Thema. | + | ; Ziel : ein Vortrag über [[RoarAudio]] und die Realtime Audio mixing Problematik vor einem Unixpublikum mit keinen oder kaum Vorwissen zum Thema. |
</div> | </div> | ||
Zeile 10: | Zeile 10: | ||
== Abstrakt == | == Abstrakt == | ||
− | RoarAudio ist ein Sound-Server für POSIX konformen Betriebssysteme (GNU/Linux, *BSD, Mac OS X und andere) unter aktiver Entwicklung. Er bietet gegenüber anderen Sound-Servern zusätzliche Funktionen für den Betrieb in kleinen Radio und TV Studios, aber auch | + | RoarAudio ist ein Sound-Server für POSIX konformen Betriebssysteme (GNU/Linux, *BSD, Mac OS X und andere) unter aktiver Entwicklung. Er bietet gegenüber anderen Sound-Servern zusätzliche Funktionen für den Betrieb in kleinen Radio und TV Studios, aber auch den Heimgebrauch. Dieser Vortrag soll einen Einblick in RoarAudio, seine Funktionalität und Funktionsweise sowie damit verbunden Problemstellungen auf einfachem Niveau bieten. Den Abschluss bildet eine Demonstration. |
== Vortrag == | == Vortrag == | ||
=== Was ist RoarAudio? === | === Was ist RoarAudio? === | ||
− | |||
− | |||
RoarAudio ist ein Soundserver. | RoarAudio ist ein Soundserver. | ||
Zeile 42: | Zeile 40: | ||
* Verzerrungen im Frequenzgang | * Verzerrungen im Frequenzgang | ||
* Klirren | * Klirren | ||
− | * | + | * Quantisierungsrauchen |
+ | * Effekte durch asynchrone Abtastung | ||
Eine Alternative wäre in einigen Fällen sicherlich ein Digital-Mischpult. Diese sind aber meist sehr teuer. | Eine Alternative wäre in einigen Fällen sicherlich ein Digital-Mischpult. Diese sind aber meist sehr teuer. | ||
RoarAudio kommt hier als erst einmal reine Software-basierende Lösung. Natürlich ist es möglich über die Steuerschnittstellen auch externe Hardware anzuschließen. Hier gibt es auch Planungen, ein Hardware Frontend zu entwerfen das dann kostengünstig zu haben ist. | RoarAudio kommt hier als erst einmal reine Software-basierende Lösung. Natürlich ist es möglich über die Steuerschnittstellen auch externe Hardware anzuschließen. Hier gibt es auch Planungen, ein Hardware Frontend zu entwerfen das dann kostengünstig zu haben ist. | ||
+ | |||
+ | <s> | ||
+ | |||
+ | === Exkurs: Codecs und Container === | ||
+ | Ein Codec ist eine Spezifikation (meist werden auch die Implementierungen Codec genannt) wie Rohdaten, im Falle von Audio meist PCM Daten, als Datenstrom oder -block repräsentiert werden. Hierzu zählt meist als primäres Kriterium die Kompression. Weitere Informationen wie Synchronisationsdaten können ebenfalls durch den Codec spezifiziert sein, werden aber meist im Container abgelegt. | ||
+ | |||
+ | Ein Container ist im Gegensatz zu einem Codec eine Spezifikation wie Daten die mittels Codecs in eine Datei codiert wurden in oder einen Stream verpackt werden. Hierzu zählen Dinge wie globale File-Magic, Angabe des Codecs, Meta Daten, Angaben über rate/bps/channels und Ähnliches. | ||
+ | |||
+ | ==== Verschiedene Arten von Codecs ==== | ||
+ | * Verlustfreie | ||
+ | * Verlustbehaftete | ||
+ | * Musik Codecs | ||
+ | * Sprach Codecs | ||
+ | * Niederlatenz Codecs | ||
+ | </s> | ||
=== Was hebt RoarAudio hervor? === | === Was hebt RoarAudio hervor? === | ||
Zeile 52: | Zeile 66: | ||
==== Codecs ==== | ==== Codecs ==== | ||
− | + | RoarAudio zeichnet sich dadurch aus daß er zusätzlich zu PCM Rohdaten auch höher Codecs versteht. Dies hat mehre Vorteile: | |
− | |||
− | RoarAudio zeichnet sich dadurch aus daß er zusätzlich zu | ||
* Der Server kann Streams in höheren Codecs selbstständig verarbeiten. Dies ist zum Beispiel wichtig um Webradio als Background Stream abzuspielen. | * Der Server kann Streams in höheren Codecs selbstständig verarbeiten. Dies ist zum Beispiel wichtig um Webradio als Background Stream abzuspielen. | ||
− | * Es ist dem Server möglich direkt Streaming-Server wie [[icecast]] zu bedienen. Es ist keine weitere ''lange | + | * Es ist dem Server möglich direkt Streaming-Server wie [[icecast]] zu bedienen. Es ist keine weitere ''lange pipe'' nötig um Webradio zu senden. Dies verringert die Störanfälligkeit erheblich und verringert die Latenz, da pipe-Puffer entfallen. |
* Auch ist es nur mit stark komprimierenden Codecs möglich über die dem Heim-Anwender zur Verfügung stehenden Schmalband-Anschlüsse Audio entweder von Client zu Server oder zwischen zwei Servern auszutauschen. Auch eine Kopplung über ISDN Kanäle ist so möglich. | * Auch ist es nur mit stark komprimierenden Codecs möglich über die dem Heim-Anwender zur Verfügung stehenden Schmalband-Anschlüsse Audio entweder von Client zu Server oder zwischen zwei Servern auszutauschen. Auch eine Kopplung über ISDN Kanäle ist so möglich. | ||
==== Netzwerk-Transparenz ==== | ==== Netzwerk-Transparenz ==== | ||
− | + | RoarAudio ist Netzwerks-transparent, das heißt das Applikationen keinen Unterschied sehen zwischen Verbindungen mit einer lokalen Instanz oder einer auf einem anderen Rechner. | |
− | + | Zu diesem Zweck werden mehre Protokolle unterstützt: UNIX Domain Sockets für lokale Verbindungen sowie TCP/IP und DECnet für Verbindungen mit entfernten Rechnern. Auch existiert Support für verschiedene Proxy Typen. | |
− | + | ==== Background Streams ==== | |
+ | Background Streams sind Streams die vom Server selbst bearbeitet werden und keinen Player benötigen um abgespielt zu werden. Dies kann zum Beispiel genutzt werden um Hintergrundmusik einzuspielen wie beispielsweise in einem Kaufhaus. Auch Webradio Streams werden hier unterstützt. | ||
==== Meta Daten ==== | ==== Meta Daten ==== | ||
− | + | RoarAudio hat die Fähigkeit auf per Stream Basis Meta Daten ab zu legen. Die Mechanismen sind denen von Vorbis Comments nachempfunden und können prinzipiell mehr. Einiges davon ist allerdings noch nicht vollständig implementiert. | |
− | |||
− | RoarAudio hat die Fähigkeit auf per Stream Basis | ||
Es besteht neben dem manuellen Setzen die Möglichkeit daß ein Player sie setzt und das ''roard'' sie selbstständig setzt. Im letzteren Falle werden diese von verschiedenen anderen Streams zusammen gesetzt. Dies kann nützlich sein um automatisch beim Streaming die Metadaten von einem Player zu übernehmen um die Titel-Informationen weiter zu führen. Manuelles setzen mag als Beispiel interessant sein um den Sendernamen zu setzen. | Es besteht neben dem manuellen Setzen die Möglichkeit daß ein Player sie setzt und das ''roard'' sie selbstständig setzt. Im letzteren Falle werden diese von verschiedenen anderen Streams zusammen gesetzt. Dies kann nützlich sein um automatisch beim Streaming die Metadaten von einem Player zu übernehmen um die Titel-Informationen weiter zu führen. Manuelles setzen mag als Beispiel interessant sein um den Sendernamen zu setzen. | ||
− | ==== | + | ==== Virtual IO ==== |
− | + | ''(gestrichen)'' | |
+ | ==== Kompatibilitäts Bibliotheken ==== | ||
''Viele Programme haben keine Unterstützung für RoarAudio, was nun?'' | ''Viele Programme haben keine Unterstützung für RoarAudio, was nun?'' | ||
− | Um dieses Problem zu lösen gibt es diverse Kompatibilitäts-Bibliotheken | + | Um dieses Problem zu lösen gibt es diverse Kompatibilitäts-Bibliotheken. |
− | + | Diese stellen Bibliotheken dar welche binär-kompatibel andere Audio Systeme emulieren. | |
Dazu müssen sie schlichtweg einfach anstelle der Bibliothek des entsprechen Systems installiert werden und leiten dann alle Anfragen an RoarAudio weiter. Dies geschieht natürlich nur im Rahmen des Funktionsumfang der entsprechenden Bibliothek. | Dazu müssen sie schlichtweg einfach anstelle der Bibliothek des entsprechen Systems installiert werden und leiten dann alle Anfragen an RoarAudio weiter. Dies geschieht natürlich nur im Rahmen des Funktionsumfang der entsprechenden Bibliothek. | ||
− | Die mit Abstand wohl wichtigste ist '''libroaresd''', welche das [[EsounD]] Interface emuliert. | + | Die mit Abstand wohl wichtigste ist '''libroaresd''', welche das [[EsounD]] Interface emuliert. das EsounD Interface wird von den allermeisten Applikationen unterstützt da es das wohl älteste Soundserver Interface ist. Es existiert seit 1998. |
− | |||
− | |||
− | |||
− | |||
− | + | Weitere Kompatibilitäts Bibliotheken gibt es für das YIFF Sound System, KDEs aRtsc und PulseAudio. Zusammen mit den existierenden Plugins deckt dies nahezu den vollständigen Player Markt fuer GNU/Linux und BSD ab. | |
− | |||
===== Welche Schnittstelle für was? ===== | ===== Welche Schnittstelle für was? ===== | ||
− | + | {| class="wikitable" | |
+ | ! Interface | ||
+ | ! Beispiel Applikationen | ||
+ | |- | ||
+ | | libroar | ||
+ | | roaraudio-tools, XMMS, mplayer, (xine) | ||
+ | |- | ||
+ | | EsounD | ||
+ | | GNOME, KDE, XMMS, xine, Amarok, wine,... (177 weitere unter Debian Stable) | ||
+ | |- | ||
+ | | libao | ||
+ | | vorbis-tools, FLAC tools, mpd, mpg321, gnomoradio, somaplayer | ||
+ | |- | ||
+ | | aRts(c) (KDE) | ||
+ | | Player mit aRts support: mplayer, xine; kwave, kaudiocreator,... | ||
+ | |- | ||
+ | | PulseAudio | ||
+ | | Ein paar Programme, die meisten über Plugins. (nicht viel unter Debian Stable) | ||
+ | |- | ||
+ | | YIFF | ||
+ | | y-tools | ||
+ | |- | ||
+ | | gstreamer | ||
+ | | GNOME, Alle GNOME Player. Dieverse andere. | ||
+ | |- | ||
+ | |} | ||
=== Konzepte und Architektur === | === Konzepte und Architektur === | ||
− | + | RoarAudio ist zwar in C geschrieben aber größtenteils Objekt-orientiert. Er umfasst im Moment etwa 37 tausend Zeilen C. (EsounD kommt auf rund 15 tausend, PulseAudio 74 tausend und aRts auf 130 tausend). | |
− | |||
− | RoarAudio ist zwar in C geschrieben aber größtenteils Objekt-orientiert. Er umfasst im Moment etwa | ||
==== Clients und Streams ==== | ==== Clients und Streams ==== | ||
− | |||
Vor allem wichtig und nach Außen hin sichtbar sind die Client und Stream Objekte. | Vor allem wichtig und nach Außen hin sichtbar sind die Client und Stream Objekte. | ||
Ein Client Objekt verkörpert einen (Netzwerk) Client, zum Beispiel einen Player oder ein Steuerprogramm wie roarctl. Es kann auch Stream Objekte assoziiert haben (Beispielsweise im Falle von Abspielen von Musik). | Ein Client Objekt verkörpert einen (Netzwerk) Client, zum Beispiel einen Player oder ein Steuerprogramm wie roarctl. Es kann auch Stream Objekte assoziiert haben (Beispielsweise im Falle von Abspielen von Musik). | ||
− | Ein Stream Objekt stellt einen eigentlichen Audio Datenstrom dar. Dieses Objekt beinhaltet diverse Informationen über den Datenstrom: Informationen wie roard ihn auslesen kann, Sample Rate/Bits/Channels, Meta Daten und vieles mehr. Ein Stream gehört immer zu einem Client, wobei der Client auch roard selbst sein kann. Er lässt sich durch ''attachen'' wechseln. Dies kommt zum Einsatz um Hintergrund-Streams zu ermöglichen. | + | Ein Stream Objekt stellt einen eigentlichen Audio Datenstrom dar. Dieses Objekt beinhaltet diverse Informationen über den Datenstrom: Informationen wie der roard ihn auslesen kann, Sample Rate/Bits/Channels, Meta Daten und vieles mehr. Ein Stream gehört immer zu einem Client, wobei der Client auch der roard selbst sein kann. Er lässt sich durch ''attachen'' wechseln. Dies kommt zum Einsatz um Hintergrund-Streams zu ermöglichen. |
− | Bei jedem Audio Datenstrom der in den roard hinein oder heraus fließt handelt es sich um einen Stream. Dies schließt Datenströme zu Geräten wie Soundcards mit ein. | + | Bei jedem Audio Datenstrom der in den roard hinein oder heraus fließt handelt es sich um einen Stream. Dies schließt Datenströme zu Geräten wie Soundcards mit ein. Hierdurch ist eine maximale Flexibilität gegeben. |
==== Driver ==== | ==== Driver ==== | ||
− | |||
− | |||
Ein Driver ist ein Objekt das eine Schnittstelle zur Verfügung stellt um externe Ressourcen anzusprechen, die sich nicht der UNIX IO Philosophie entsprechend verhalten (Erweiterte Handshake zum Beispiel). Dies können Soundcards oder auch Streaming Server sein. Hierzu zählen als Beispiel der OSS (Open Sound System) und der libshout (Icecast) Treiber. | Ein Driver ist ein Objekt das eine Schnittstelle zur Verfügung stellt um externe Ressourcen anzusprechen, die sich nicht der UNIX IO Philosophie entsprechend verhalten (Erweiterte Handshake zum Beispiel). Dies können Soundcards oder auch Streaming Server sein. Hierzu zählen als Beispiel der OSS (Open Sound System) und der libshout (Icecast) Treiber. | ||
==== Codecfilter ==== | ==== Codecfilter ==== | ||
− | {{Vortrags Zeit| | + | Bei den Codecfiltern handelt es sich um ein Abstraktions Layer welches roard die Möglichkeit gibt höhere Codecs zu sprechen wie etwa Ogg Vorbis. Einige Codecfilter können nur Lesen andere auch Schreiben. Wird ein Stream mit einem unterstützen Codec aufgebaut so wird automatisch eine Instanz eines passenden Codecfilters erzeugt. Sie verhalten sich somit weitgehend transparent. |
+ | |||
+ | === Probleme des Realtime Audio Mischens === | ||
+ | Beim Mischen in Realtime kommen zu den Problemen, die beim normalen Mischen von Audio auftreten, noch weitere hinzu. | ||
+ | |||
+ | |||
+ | ==== Problem: Lokale Synchronität ==== | ||
+ | Die wichtigsten Störfaktoren sind: | ||
+ | |||
+ | * Wie jede Hardware besitzen Soundkarten eine Verzögerung. Das heißt daß sie eine gewisse Zeit brauchen zwischen Erhalt von Daten und deren Ausgabe. Diese Zeit liegt im Bereich von wenigen Millisekunden (z.B. Studio Karten) und kann bis in den Bereich von mehren hundert Millisekunden gehen (z.B. 2.5 Euro USB Karten von $SUPERMARKT), je nach Karte. Die meisten Karten bieten aber eine Möglichkeit abzufragen wo sie gerade in ihrem Puffer sind. Wie dies genau funktioniert ist von Karte zu Karte unterschiedlich. Der Treiber der Karte ist dafür zuständig diese Funktionen an höhere Interfaces (OSS, alsa, sndio,...) weiterzureichen und den Applikationen zur Verfügung zu stellen. | ||
+ | * Neben dem Delay in der Hardware erzeugen selbstverständlich auch der Kernel und die Treiber eine weitere Verzögerung. Dies passiert aus vielen Gründen: Der Programmcode muss natürlich erst einmal ausgeführt werden. Auch werden Interupts nicht unbedingt sofort bearbeitet (zum Beispiel weil gerade ein anderer, höherwertiger bearbeitet wird). | ||
+ | * Die nächste Schicht, die Sound APIs, erzeugen auf ähnliche Weise weitere Delays. Hier kommt dazu das viele mit relativ großen Puffern arbeiten (Beispielsweise EsounD mit 0.28sec - im Vergleich zu roard mit Standard Puffer von 0.01sec). Die Puffergröße ist in dem meisten Fällen die kleinste Einheit in der Synchronität gewährleistet werden kann. | ||
+ | * Da die meisten Systeme (alle auf denen RoarAudio läuft) Multitasking betreiben stellt sich ein weiteres Problem: Der entsprechende Prozess muss eine Zeitscheibe bekommen bevor er reagieren kann. Läuft ein anderer Prozess gerade so muss er potentiell warten. Auf den meisten POSIX kompatiblem Systemen basiert das Multitasking zwar auf Ereignissen, sprich ein Prozess läuft so lange bis ein anderer ein Ereignis zu bearbeiten hat (keine feste Zeitscheiben-Länge), was dazu führt das dieses Problem ist nicht all zu groß ist. Aber es kann natürlich gerade ein anderer Prozess mit höherer Priorität laufen der ein anderes Ereignis bearbeitet und somit nicht vom Kernel unterbrochen wird. | ||
+ | |||
+ | ==== Problem: Netzwerk Synchronität ==== | ||
+ | Es kommen Probleme auf dem Netzwerk hinzu. | ||
+ | |||
+ | ==== Lösungsansätze ==== | ||
+ | {{Vortrags Zeit|10}} | ||
− | + | * '''Ignorieren''' - Diverse Probleme lassen sich schlichtweg einfach ignorieren. Dies sind vor allem Probleme die sich statistisch über die Zeit aufheben. Ist diese Strategie möglich so sollte sie verfolgt werden im Sinne von KISS (Keep It Small and Simple). Sie kann natürlich auch extrem daneben liegen und man sollte sich um eine echte Lösung bemühen. | |
+ | * '''Geschickte Auswahl von Algorithmen und Protokollen''' - Die Auswahl der Algorithmen und Protokolle ist entscheidend. Für die meisten Aufgaben gibt es mehre mögliche Lösungen (''Viele Wege führen nach Rom''). Aber nicht alle sind gleich gut geeignet. Deswegen sollte hier eine sinnvolle Auswahl getroffen werden. | ||
+ | * '''Künstlicher Delay''' - Es besteht die Möglichkeit einzelne Streams oder Ereignisse künstlich leicht zu verzögern. Hierdurch kann ein Abgleich der Latenzen gemacht werden was dazu dient Synchronität herzustellen. Normalerweise werden alle Streams so lange verzögert bis sie eine ''künstliche'' Latenz gleich dem Stream haben der die höchste Latenz aufweist. | ||
=== Sonstiges === | === Sonstiges === | ||
− | + | ... | |
+ | ==== Win32 Port ==== | ||
+ | Ein Win32 Port existiert zum jetzigen Zeitpunkt nicht. Dies liegt an mehren Faktoren: Zum einen ist Win32, was den nahe-realtime Betrieb angeht, nicht zuverlässig genug. Zum anderen ist bei Win32 das Networking kein Teil des Kernels wie auf UNIX und POSIX Systemen: Es ist viel mehr teilweise im Userland. Dies hat zur Folge das zu jedem Zeitpunkt eine Applikation wissen muss von welchem Type ein Filehandle ist, da man Basis Funktionen wie read(), write(), close() nicht auf alle Filehandles anwenden kann. Vielmehr hat jeder Type von Filehandles seinen eigenen Satz Funtionen. RoarAudio verfolgt die UNIX Philosophie: ''Alles ist eine Datei''. Große Patches wären nötig. | ||
− | + | Ein Weiteres ist das ein solcher Port viel Zeit in Anspruch nimmt und weder das Projekt noch die Freie Software Bewegung voranbringt. | |
− | |||
− | + | Im Moment existieren kleinere Patches die vielleicht irgendwann mal Basis Funktionalität mit sich bringen könnten. An ein roard für Win32 ist in absehbarer Zeit nicht zu denken. | |
− | + | Allerdings laufen Teile von RoarAudio in Cygwin mehr oder minder gut. Viele Probleme treten hier auf aber es ist prinzipiell möglich es unter Cygwin zum Laufen zu bringen (außerhalb des nahe-realtime Betriebs). | |
− | + | Es besteht aber die Möglichkeit einige Win32 Applikationen mittels pseudo Web Radio Streams anzubinden. | |
==== MP3 ==== | ==== MP3 ==== | ||
Zeile 139: | Zeile 187: | ||
=== Querverweise === | === Querverweise === | ||
− | |||
− | |||
; [http://raum.keep-cool.org/ RAUM Media Container] | ; [http://raum.keep-cool.org/ RAUM Media Container] | ||
: Für RoarAudio entwickelter Container, vor allem für Speex und CELT. | : Für RoarAudio entwickelter Container, vor allem für Speex und CELT. | ||
Zeile 151: | Zeile 197: | ||
=== Vorführung === | === Vorführung === | ||
− | {{Vortrags Zeit| | + | {{Vortrags Zeit|30}} |
* Allgemeiner Betrieb | * Allgemeiner Betrieb | ||
Zeile 157: | Zeile 203: | ||
** roarvorbis/roarcatplay? | ** roarvorbis/roarcatplay? | ||
** roarctl | ** roarctl | ||
− | ** | + | ** xmms |
+ | * Background Streams | ||
+ | ** roarradio | ||
* Kompatibilitäts Bibliotheken | * Kompatibilitäts Bibliotheken | ||
** libroaresd: | ** libroaresd: | ||
− | *** | + | *** <s>xmms</s> |
+ | *** <s>mplayer</s> | ||
+ | *** Amarok | ||
== Fragen == | == Fragen == | ||
* ''immer gerne'' | * ''immer gerne'' | ||
− | |||
[[Kategorie:Vortrag]] | [[Kategorie:Vortrag]] | ||
[[Kategorie:Software]] | [[Kategorie:Software]] | ||
[[Kategorie:Sound]] | [[Kategorie:Sound]] |