Hi,
ich benutze zum Abspielen von MP3s den WMASF Reader. Das funktioniert auch alles soweit ganz gut, wenn man die mp3 direkt aus einer Datei (über IFileSourceFilter) lädt.
Allerdings würde ich sie lieber direkt aus dem Speicher abspielen und steh da etwas auf dem Schlauch. Eigentlich dachte ich, dass das ja nicht die Welt sein kann, es ändert sich ja quasi nur die Quelle; die Daten sind ja identisch.
Allerdings scheint es nicht ganz so trivial zu sein.
Also bisher läuft es ca so ab, was, wie gesagt, für Dateien auch funktioniert.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IFilterGraph, (void**)&pGraph);
CoCreateInstance(CLSID_WMAsfReader, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pReader);
pGraph->QueryInterface(IID_IGraphBuilder, (void **)&pBuilder);
pBuilder->AddFilter(pReader, L"ASF Reader");
pReader->QueryInterface(IID_IFileSourceFilter, (void **)&pFS);
// Load and retrieve pin
pBuilder->Render(pin)
|
Also ich weiß, dass das selbe quasi mit Renderfile zu erreichen ist, aber ich hatte gleich Render benutzt, da ich ja wie gesagt, keine Files rendern wollte.
Das das nun mit dem IFileSourceFilter aus dem Speicher nicht mehr geht, liegt ja irgendwie auf der Hand.
Ich kann mir auch vorstellen, dass Musik aus dem Speicher laden bestimmt irgendwie anders (ggf mit anderen Bibliotheken) besser und eleganter geht, aber mittlerweile ist das eine prinzipielle Frage geworden. Es muss ja irgendwie gehen, dass man als Quelle statt einer Datei einen Speicherbereich angeben kann. Das das bei mir hier nicht funktioniert, wurmt mich halt irgendwie.
Ich suche also keine andere Lösung für das Musik-aus-Speicher-Problem, sondern Rat, wie man das in DShow direkt selbst umsetzen könnte. Ich bin für jede Hilfe/Anregung dankbar.
Im Netz hatte ich noch den Hinweis gefunden, dass man sich ein IServiceProvider aus dem Reader querien kann und über denen einen WMDRMReader und dann über QI einen WMAdvancedReader2 zurückgeben lassen kann. Dieser kann direkt IStreams laden.
Das scheiterte allerdings daran, dass ich bei mir hier keinen DRMReader erzeugen konnte.
Da ich mich allerdings erst seit kurzem mit DShow beschäftige, kann das (also auch das oben) natürlich alles mist sein und bevor ich mich nun weiter in irgendwelchen Sackgassen verrenne, wollte ich einfach mal nachfragen, ob hier jemand mehr Erfahrung damit hat und mir bei dem Problem vielleicht helfen könnte.
Vielen Dank schonmal!