Audio-API und Codecs

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Audio-API und Codecs

Beitrag von Krishty »

Hi,

Ich möchte Audiodateien abspielen, die in WAV vorliegen – aber mit einem sehr exotischen Codec (für den auch kein Quelltext verfügbar ist).

Welche Audio-API könnte ich dafür verwenden? Geht das mit allen? Können die automatisch alles abspielen, wofür auf dem System ein Codec installiert ist, oder muss ich auf ein bestimmtes Feature achten?

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Audio-API und Codecs

Beitrag von eXile »

Kann denn der VLC-Media-Player die Datei abspielen? Dann wäre vielleicht libavcodec für dich interessant.

(Ich habe übrigens immer noch kein Internet.)
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Nein, kann er leider nicht. Läuft nur per Windows Media Player :/

(Mein Beileid. Ist ja glatt sensorische Deprivation.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Ich glaube dann muss es sich um einen DirectX Media Objects basierten Codec handeln. Wenn die API DirectShow unterstützt sollte es auf jeden Fall gehen, ob das mit DirectSound auch geht bzw. dort automatisch entsprechende Filter gesetzt werden weiß ich leider nicht. Konvertieren ist keine Option?
BTW Probier mal bei VLC "--codec dmo" als Parameter aus, kannst du das Ding dann abspielen?
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Audio-API und Codecs

Beitrag von eXile »

Dann tippe ich mal auf die MS Media Foundation. Klappt es mit diesem Sample?
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Urks hab ich lange nichts mehr mit Microsoft Kram gemacht :) Der MS Media Foundation Kram ist komplett an mir vorbeigegangen ^^
Mit Bass.dll könntest du es mal probieren, die haben auch eine Erweiterung für WMA und Ähnliches.
Zuletzt geändert von Chromanoid am 12.04.2011, 11:22, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Chromanoid hat geschrieben:Konvertieren ist keine Option?
Nein; entweder würde die Datenmenge explodieren oder die Qualität abstürzen.
Chromanoid hat geschrieben:BTW Probier mal bei VLC "--codec dmo" als Parameter aus, kannst du das Ding dann abspielen?
Nein; er gibt zwar keine „Kein Dekodierungsmodul gefunden“-Warnung mehr aus, spielt aber auch nichts ab.

eXile hat geschrieben:Dann tippe ich mal auf die MS Media Foundation. Klappt es mit diesem Sample?
wat
wat
Nein, irgendwo tief drinnen schlägt was mit MF_E_TOPO_CODEC_NOT_FOUND fehl. Ich weiß aber gerade nicht, ob das nur bedeutet, dass er das Container nicht kennt (das Sample will von Haus aus nur MP3 und WMV öffnen, nicht WAV) oder ob er tatsächlich den Daten-Codec meint.

Der Codec wurde 1997–2001 eingesetzt; was für APIs hatte man denn damals so benutzt?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

http://msdn.microsoft.com/en-us/library ... s.85).aspx mal ausprobieren? Vielleicht muckt ja VLC. Kann winamp die Datei abspielen?
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Das Sample funktioniert! Perfekt. Winamp habe ich garnicht installiert.
Okay, dann lese ich mich jetzt mal ein. Danke schonmal.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Aramis »

Der Codec wurde 1997–2001 eingesetzt; was für APIs hatte man denn damals so benutzt?
Wie heisst er denn? Hat er einen FourCC?
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

DSP Group TrueSpeech. Zur Sprachkompression bei Telefon-, VoIP- und Funkaufnahmen optimiert.

Die Kompressionsrate ist mit 15:1 zwar nicht bedeutend besser als MP3 mit 11:1, aber weil MP3 bei niedrigen Bitraten blechern klingt (TrueSpeech dagegen nach Telefonhörer) müsste ich die mit deutlich höherer Bitrate kodieren und würde irgendwo bei der vier- bis achtfachen Größe landen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Naja mp3 mit einem speziell für Sprachkompression ausgelegten Codec zu vergleichen ist ja auch irgendwie sinnlos. Du könntest dir mal Speex oder andere offene Codecs für Sprachkompression anschauen. Falls du doch etwas unabhängiger sein möchtest.
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Speex klingt (im wahrsten Sinne) gut und dürfte ähnlich hoch komprimieren; zuerst muss ich aber mit den Originaldateien zurechtkommen.

Mir ist aufgefallen, dass das DirectShow-Sample zum Abspielen von zwei Dateien ganze zwölf Threads erzeugt und wieder zerstört … legt sich das, wenn ich die Filter nicht mehr automatisch per RenderFile() bestimmen lasse, sondern selber setze? Ich bin hier zeitkritisch und brauche bestenfalls null Pause zwischen dem Abspielen von zwei Dateien …

Kennt generell jemand ein DirectShow-Tutorial zum Abspielen von Audiodaten? Alle, die ich finde, befassen sich nur mit Capturing … ich muss mir deshalb schon wieder alles selber häppchenweise aus der MSDN zusammenschaben …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Ich könnte mir vorstellen, dass die Threads dem Pipeline Filtergraph Aufbau entspringen. Vielleicht kannst du den Graph behalten und nicht jedes mal neu aufbauen, wenn du eine Datei öffnest. Ist aber vielleicht auch Blödsinn. Ich habe lediglich vor Urzeiten mal ein bisschen mit Musik abspielen rumprobiert. Tutorials habe ich damals glaube ich auch keine/kaum (?) gefunden, ich hab damals nur mit den MSDN Samples rumgebastelt, ich glaube es gab einfach noch gar keine so immense Tutorialkultur wie heute :).
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Das mit dem Graph ist auch meine Vermutung. Selbst, wenn ich die Dateien nicht rendere, sondern je nur den Graph erzeuge und zerstöre, ich die Dateien nur öffne und den Graph behalte, braucht er 2 s für 20 Dateien und erzeugt ca. 390 Threads – das ist um den Faktor 100 zu langsam.

Ich habe dieses Tutorial auf Flipcode gefunden:
Now let's say now that we have used GraphEdit to build a graph for a .WAV file, so we've seen the completed graph and know exactly which filters we need and how they are to be connected.
Das ist genau, was ich will! Mal weiterlesen …
Now how do we find a CLSID for the 'Wave Parser' filter that decodes the stream? Easiest way is to search through the registry for the string "Wave Parser" and use the CLSID that you find. There are other ways, like using IFilterMapper and IEnumRegFilters to get a list of registered filters, but for this I've just looked it up.
… WTF das meint der doch nicht ernst m[

Zumindest habe ich jetzt mit IFilterMapper() und IEnumRegFilters() Stichwörter, bei denen ich weitersuchen kann.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Vielleicht kannst du auch die erste Datei automatisch öffnen lassen und den FilterGraph irgendwie aus dem Abspiel-Kontext holen.

Das schöne wäre, wenn du Speex benutzen würdest, dass du wahrscheinlich beim Abspielen ohne DirectShow auskommen würdest. Bei einem Batch Konvertierer sollte das mit den Threads doch auch nicht so problematisch sein. Mit http://msdn.microsoft.com/en-us/library ... s.85).aspx sollte es relativ leicht möglich sein, einen Speex Konvertierer zu basteln. Hier http://www.xiph.org/dshow/ würde es den Speex DirectShow Filter geben. Mit dem kannst du dann einen batch-Konvertierer bauen. In der richtigen Anwendung musst du dann glaube ich nur noch libspeex.dll benutzen und kannst auf den DirectShow Scheiß verzichten.
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Ja ich würde Speex auch furchtbar gern benutzen und mir dann einfach rohe Frames extrahieren, die ich dann XAudio 2 in den Popo schieben kann … nur habe ich hier 4.500 Dateien mit einer Abspieldauer von teils keiner Zehntelsekunde und darf die nach der Konvertierung alle darauf testen, ob auch nichts verändert worden ist. Und wenn ich als DShow-Noob den Konvertierer selber schreibe, wird das passieren. Aber andererseits finde ich auch keinen WAV-to-WAV-Konvertierer, der nicht tausend Toolbars installieren will oder unter Windows 7 überhaupt noch lauffähig ist. Das kotzt mich gerade so unglaublich an, dass ich hier schon wieder im absoluten Bodensatz der Programme (noch unter dem Scheiß, der Digitalkameras beiliegt) rumstochern muss, bloß, weil deren verkackter Codec nicht mit was anderem kompatibel ist als mit dem kompostierenden Direct Show. Das Schlimmste ist dann noch, dass der Codec zwar antiquiert, aber saugut ist und ich schon jetzt weiß, dass das Endergebnis der Konvertierung entweder in Größe oder Qualität suboptimal sein wird.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Evt. kann das Winamp jedenfalls mal für einen Test. Das will zwar auch Toolbars installieren, aber vielleicht nicht ganz so viele.
Als kleine Frucht meiner Prokrastination, vielleicht kennst du es ja nocht nicht :):
http://v3.juhara.com/en/articles/multim ... -converter
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Nein, Winamp kann die nicht lesen. Das Tutorial kenne ich noch nicht … aber in letzter Konsequenz wird mir ja eh nichts anderes übrig bleiben. Wird zwar lustig, die Filter aufzutreiben, die nicht x64-kompatibel und deren Homepages seit zehn Jahren offline sind, aber ich habe ja keine Wahl.
To convert WAV file into MP3, we are goin to use following filter construction:
  • File Source (Async).
  • Wave Parser.
  • MPEG Layer-3 Decoder.
  • MPEG Layer-3
  • WAV Dest
  • File Writer.
Wenn man WAV zu MP3 konvertieren will, muss man MP3 dekodieren und WAV schreiben? Häh?


Nachtrag: Oh Freude! dbpoweramp Music Converter. Den habe ich schon 2002 benutzt, um meine ersten zarten Urheberrechtsverstöße zu begehen ~<3
Der kriegt’s konvertiert. Jetzt hoffe ich nur, dass er nichts abschneidet oder kaputtmacht … dauert aber noch 20 min, bis ich das feststellen kann.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Die Konvertierung klappt, und XAudio 2 scheint eine handzahme API zu sein. Ich hadere allerdings mit Speex … für mich gibt es jetzt zwei Möglichkeiten: Entweder, alle Audiodateien per Speex zu komprimieren und direkt in die Exe hardzucoden, oder alle Dateien als rohes PCM in eine Extradatei zu packen.

Speex komprimiert die Audiodaten auf ca. 4 MiB. Roh sind sie um die 55 MiB groß.

Dafür dauert die Dekompression beim Programmstart selbst mit Parallelisierung geschätzt um die drei Sekunden. Das ist eine lange Zeit. Die Rohdaten sind in höchstens zwei Sekunden im Speicher – falls sie schon im Datei-Cache oder in SuperFetch liegen (beim Debugging also immer), in Nullzeit.

Einerseits würde mir die Verwaltung bei hardgecodeten Daten leichter fallen als bei externen Daten – und Hardcoding geht nur mit komprimierten Daten; eine 55-MiB-Exe würde jeden Virenscanner in die Verzweiflung treiben. Andererseits würde das Einbinden von Speex und die Parallelisierung der Dekompression schon einen gewissen Aufwand bedeuten, den ich nicht hätte, wenn ich XAudio unmittelbar die Rohdaten zusteckte.

Da muss ich wohl nochmal in mich gehen. Aber auf jeden Fall schonmal danke für die Hilfe!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Brauchst du denn alle Daten sofort? Könntest du sie nicht auch onDemand dekodieren/streamen? Schließlich sollte Speex für sowas optimiert sein...
Irgendwie so http://www.codeproject.com/KB/audio-vid ... tream.aspx (Edit: bzw. so http://msdn.microsoft.com/en-us/library ... s.85).aspx, kann ja auch aus dem Arbeitsspeicher kommen) ? Nach dem ersten streamen kannst du es ja im Speicher lassen...
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Jein – ich brauche sie nicht sofort. Ich brauche aber einige der zahlreichen Dateien sofort und weiß nicht, welche.
Es geht darüber hinaus um so viele so kleine Dateien, dass eine Einzelabspeicherung dem Dateisystem und der Leistung nicht gerade zuträglich ist (>80 % Verschnitt und unzählige Dateizugriffe, die auch in die katastrophale Leistung der DirectShow-Lösung reinspielen dürften).
Ich muss also bündeln und da ich nicht weiß, welches Einzelfragment ich als erstes brauche, muss ich alle vorhalten. Ich habe auch schon über träges On-Demand-Laden mit Cache nachgedacht, aber das ist mir nicht … sauber und deterministisch genug. Ich glaube, dass ich die 50 MiB RAM und Speicherplatz bedenkenlos opfern kann und Speex weglasse.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Wie wäre es wenn du alle Audiodateien als einen langen Speex-Track zusammenfasst und du dann nur noch einen Index auf den Stream pro Dateiname merkst. So ähnlich haben die das z.B. bei Black & White mit mp3 gemacht. Der Aufwand in den Speex-Stream zu springen müsste ja konstant sein. Oder machst du das schon so?
Den Speex-Track lädst du dann am Anfang in den RAM. Wenn du dazu noch irgendwie an einen Index für die Rohdaten kommen würdest könntest du die Rohdaten sozusagen lazy loaden.
Benutzeravatar
Krishty
Establishment
Beiträge: 8295
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Audio-API und Codecs

Beitrag von Krishty »

Das ist zu kompliziert – XAudio 2 erwartet von mir, dass ich den Puffer mit den (extrahierten!) Frames so lange gültig halte, bis das Abspielen vollendet ist. Das heißt, dass ich nach Allokation, Sprung zum Anfang im Stream und Extraktion auch noch einen Event-Handler registrieren muss, der beim Beenden des Abspielens (asynchron) dafür sorgt, dass der temporäre Puffer zerstört wird. Oder direkt eine Datenbank anlegen muss, wo alle bereits abgespielten Fragmente hinterlegt werden, damit sie nicht nochmal geladen werden müssen.

Ich habe jetzt alle rohen Frames zu einer riesigen Datei zusammengebacken und eine 20 KiB große Tabelle kompiliert, die für jedes Fragment angibt, wo sich dessen erster Frame befindet und wie viele folgen. Die beiden Dateien werden beim Start in ein globales Array gemappt und nun habe ich zwar 50 MiB Mehrverbrauch für Sound, aber dafür steht zur Laufzeit alles sofort zur Verfügung – keine Allokationen, keine Drittbibliothek, kein garnichts. Ich schlage nur einen Zeiger in meiner Tabelle nach und sage XAudio 2: „Render!“.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4270
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Audio-API und Codecs

Beitrag von Chromanoid »

Hört sich doch gut an :) vielleicht kannst du die Konvertierung ja sonst in einem Installer oder beim ersten Start machen lassen. Ggf. musst du ja auch Shader oder sowas vorbereiten - vielleicht dann...
Antworten