Lesen von ASF-Dateien in DirectShow (Windows Media Format 11 SDK)
[Das dieser Seite zugeordnete Feature Windows Media Format 11 SDK ist ein Legacyfeature. Es wurde von Source Reader und Sink Writer abgelöst. Source Reader und Sink Writer wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit quellleser und Senkenschreiber anstelle des Windows Media Format 11 SDK verwendet. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
Die Wiedergabe von ASF-Dateien erfolgt über den WM ASF Reader-Filter . Wenn der WM-ASF-Leser eine Datei liest, erstellt er automatisch einen Ausgabepin für jeden Stream, einschließlich Webstreams, Skriptbefehlsstreams und beliebiger Datenströme. Bei Dateien mit mehreren Bitraten werden Nur für die aktuell ausgewählten Streams Pins erstellt.
Der WM ASF-Reader unterstützt die DirectShow IMediaSeeking-Schnittstelle , mit der Anwendungen temporale Suchvorgänge innerhalb der Datei ausführen können. Die Wiedergabe mit anderen Geschwindigkeiten als 1.0 (wie in IMediaSeeking::SetRate angegeben) wird jedoch nicht unterstützt.
Der Filter macht auch mehrere Windows Media Format SDK-Schnittstellen verfügbar, wie in der folgenden Tabelle beschrieben.
Schnittstelle | Verfügbar gemacht | Kommentare |
---|---|---|
IWMDRMReader | Über IServiceProvider auf Filter | Wird für Anwendungen bereitgestellt, die inhalte wiedergeben müssen, die durch Digital Rights Management (DRM) geschützt sind. Diese Schnittstelle kann auch verwendet werden, um andere Schnittstellen für das Reader-Objekt direkt abzurufen. |
IWMHeaderInfo | QueryInterface für Filter | Wird bereitgestellt, damit Anwendungen Datei- und Inhaltsattribute sowie Marker- und Skriptinformationen und Metadaten lesen können. |
IWMReaderAdvanced | QueryInterface für Filter | Teilweise für den Filter implementiert, damit Anwendungen auf die Informationsmethoden des WM Reader-Objekts zugreifen können. |
IWMReaderAdvanced2 | QueryInterface für Filter | Teilweise für den Filter implementiert, damit Anwendungen auf die Informationsmethoden für das Reader-Objekt zugreifen können. |
Der WM ASF Reader-Filter wurde erstmals in DirectShow 8.0 verfügbar gemacht. Die Version des Filters, der in DirectShow 8.1 und 9.0 enthalten ist, unterstützt Version 7. x des Windows Media Format SDK. Die neueste Version des Filters wird zusammen mit den anderen QASF-Komponenten im Lieferumfang des Windows Media Format 9 Series SDK und höheren Versionen enthalten und unterstützt und ersetzt den Filter in DirectX 9.0. Wenn Sie das Windows Media Format SDK nach der Installation von DirectX 8 installieren. x oder 9. x SDK überschreiben Sie die DirectX-Version von qasf.dll mit der Version der 9-Serie. Dies sollte keine Probleme verursachen, außer in einem Szenario, in dem es zu einem anderen Verhalten in der DirectShow IGraphBuilder::RenderFile-Methode führt. Die Sdk-Version der Windows Media Format 9-Serie des WM ASF-Readers ist der Standardquellfilter für die Dateinamenerweiterungen .asf, .wmv und .wma. Dies bedeutet, dass der WM ASF-Reader automatisch erstellt und dem Filterdiagramm vom Filtergraph-Manager in Methoden wie IGraphBuilder::RenderFile oder IGraphBuilder::AddSourceFilter hinzugefügt wird, wenn eine Datei dieses Typs angegeben wird. In DirectX 9.0 und früher sowie Windows XP Service Pack 1 und früher verwendet die RenderFile-Methode den älteren Windows Media-Quellfilter. Dieses Verhalten wurde beibehalten, um die Abwärtskompatibilität mit Anwendungen sicherzustellen, die die Windows Medienwiedergabe 6.4 verwendet haben. Weitere Informationen zum älteren Windows Media-Quellfilter finden Sie in der DirectShow SDK-Dokumentation.
Um eine ASF-Datei mit Windows Media-basierten Inhalten mit dem WM ASF-Reader wiederzugeben, besteht die drei Hauptschritte darin, eine instance des Graphfilter-Managers zu erstellen, IGraphBuilder::RenderFile aufzurufen, um den Graphen zu erstellen, und dann IMediaControl::Run aufrufen, um die Datei wiederzugeben. Das folgende Codebeispiel ist ein vollständiges Programm, das eine ASF-Datei mithilfe von DirectShow wiedergibt. Zum Ausführen dieses Beispiels muss das DirectX SDK installiert sein, und Ihre Buildumgebung muss gemäß den Anweisungen im DirectShow SDK-Dokumentationsthema "Einrichten der Buildumgebung" konfiguriert sein. Außerdem müssen Sie im Aufruf von RenderFile eine Datei auf Ihrem Computer angeben.
#include <dshow.h>
#include <stdio.h>
void main(void)
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
// Initialize the COM library.
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return;
}
// Create the Filter Graph Manager and query for interfaces.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// Build the graph. IMPORTANT: Change this string to a file
// on your system.
hr = pGraph->RenderFile(L"test.wmv", NULL);
if (SUCCEEDED(hr))
{
// Run the graph.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
// Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// Note: Do not use INFINITE in a real application, because it
// can block indefinitely.
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}
Beachten Sie, dass der Anwendungscode für dieses einfache Beispiel niemals speziell auf den WM-ASF-Reader verweist. Dieser Filter wird vom Filter Graph-Manager erstellt, verbunden, ausgeführt und schließlich freigegeben. In vielen Szenarien sollten Sie jedoch den WM ASF-Reader konfigurieren, bevor Sie mit der Wiedergabe beginnen.