Lesen von Dateien mit dem synchronen Reader

[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.]

Sie können den synchronen Reader verwenden, um eine ASF-Datei mithilfe synchroner Aufrufe anstelle der asynchronen Methoden im Reader-Objekt zu lesen. Die Verwendung synchroner Aufrufe reduziert die Anzahl von Threads, die zum Lesen einer Datei erforderlich sind. Der asynchrone Reader verwendet mehrere Threads für die Verarbeitung von Streams. Bei Dateien mit mehreren Streams kann die Anzahl der verwendeten Threads sehr groß werden. Der synchrone Reader verwendet nur einen Thread.

Der synchrone Reader wurde entwickelt, um die Anforderungen von Anwendungen zur Inhaltserstellung und Dateibearbeitung zu erfüllen. Sie können den synchronen Reader für andere Anwendungen verwenden, seine Funktionalität ist jedoch eingeschränkt.

Der synchrone Reader kann lokale Dateien oder Dateien in einem Netzwerk mithilfe des UNC-Pfadnamens öffnen (z. B. "\\someshare\somedirectory\somefile.wmv"). Sie können Dateien nicht an den synchronen Reader streamen oder Dateien von einem Internetspeicherort aus öffnen. Der synchrone Reader bietet auch Unterstützung für die Verwendung der IStream-COM-Schnittstelle als Quelle.

Der synchrone Reader bietet mehr Flexibilität beim Abrufen von Beispielen aus einer ASF-Datei als der asynchrone Reader. Der synchrone Reader kann Beispiele sowohl nach Streamnummer als auch nach Ausgabe übermitteln. Beispiele, die nach Streamnummer übermittelt werden, können komprimiert oder unkomprimiert werden. Der synchrone Reader kann auch während der Wiedergabe zwischen komprimierter und nicht komprimierter Übermittlung wechseln. dieses Feature wird als "schnelle Bearbeitung" bezeichnet. Mit diesem Feature kann eine Bearbeitungsanwendung Windows Media-basierte Inhalte lesen und direkt an den Writer übergeben, bis ein gewünschter Frame erreicht ist. An diesem Punkt kann die Anwendung den Leser anweisen, mit der Bereitstellung von unkomprimierten Inhalten zu beginnen, die die Anwendung dann ändern und zur erneuten Komprimierung an den Writer übergeben kann. Wenn die Anwendung das Ändern der angegebenen Frames abgeschlossen hat, kann sie den Leser anweisen, erneut komprimierte Frames bereitzustellen.

Die grundlegendsten Funktionen des synchronen Reader-Objekts können in die folgenden Schritte unterteilt werden. In diesen Schritten bezieht sich "die Anwendung" auf das Programm, das Sie mit dem Windows Media Format SDK schreiben.

  1. Die Anwendung übergibt den Namen einer zu lesenden Datei an den synchronen Reader. Wenn der synchrone Reader die Datei öffnet, weist er jedem Stream eine Ausgabenummer zu. Wenn die Datei den gegenseitigen Ausschluss verwendet, weist der Leser eine einzelne Ausgabe für alle sich gegenseitig ausschließenden Streams zu.
  2. Die Anwendung ruft Informationen zur Konfiguration der verschiedenen Ausgaben vom Reader ab. Die gesammelten Informationen ermöglichen es der Anwendung, Medienbeispiele ordnungsgemäß zu rendern.
  3. Die Anwendung beginnt mit der Anforderung von Beispielen vom synchronen Reader. Der synchrone Reader übermittelt jedes Beispiel in einem Pufferobjekt, für das er die INSSBuffer-Schnittstelle bereitstellt.
  4. Die Anwendung ist für das Rendern von Daten verantwortlich, nachdem sie vom Leser übermittelt wurden. Das Windows Media Format SDK stellt keine Renderingroutinen bereit. In der Regel verwenden Anwendungen andere SDKs zum Rendern von Daten, z. B. das Microsoft Direct X SDK oder die Multimediafunktionen des Microsoft Windows-Plattform-SDK.

Diese Schritte werden in der Beispielanwendung WMSyncReader veranschaulicht. Weitere Informationen finden Sie unter Beispielanwendungen.

Der synchrone Reader unterstützt auch erweiterte Funktionen. Mit dem synchronen Reader können Sie folgende Aktionen ausführen:

  • Geben Sie einen Bereich von Beispielen an, die nach Zeit oder Framenummer abgerufen werden sollen.
  • Steuern der Streamauswahl für sich gegenseitig ausschließende Datenströme.
  • Öffnen Sie eine Datei mithilfe der COM-Standardschnittstelle IStream.
  • Liest Profildaten aus dem Dateiheader.
  • Liest Metadaten aus dem Dateiheader.
  • Wechseln zwischen Stream- und Ausgabebeispielen während der Wiedergabe.
  • Wechseln Zwischen komprimierten und unkomprimierten Streambeispielen während der Wiedergabe.

In den folgenden Abschnitten wird die Verwendung des Synchronleseobjekts ausführlich beschrieben.

Beispielcode

Der folgende Beispielcode zeigt, wie Sie Beispiele aus einer ASF-Datei mit dem synchronen Reader lesen. Sie gibt anhand der Framenummer einen Bereich von zu liefernden Beispielen an.

IWMSyncReader* pSyncReader = NULL;
INSSBuffer*    pMyBuffer   = NULL;

QWORD cnsSampleTime = 0;
QWORD cnsSampleDuration = 0;
DWORD dwFlags = 0;
DWORD dwOutputNumber;
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a synchronous reader.
hr = WMCreateSyncReader(NULL, WMT_RIGHT_PLAYBACK, &pSyncReader);

// Open an ASF file.
hr = pSyncReader->Open(L"c:\\somefile.wmv");

// TODO: Identify the properties for each output. This works 
// exactly as it does with the asynchronous reader.

// Specify a playback range from frame number 100 of the video 
// stream to the end of the file. Assume that the video stream 
// is stream number 2.
hr = pSyncReader->SetRangeByFrame(2, 100, 0);

// Loop through all the samples in the specified range.
do
{
   // Get the next sample, regardless of its stream number.
   hr = pSyncReader->GetNextSample(0,
                                   &pMyBuffer,
                                   &cnsSampleTime,
                                   &cnsSampleDuration,
                                   &dwFlags,
                                   &dwOutputNumber,
                                   NULL);

   if(SUCCEEDED(hr))
   {
      // TODO: Process the sample in whatever way is appropriate 
      // to your application. When finished, clean up.
      pMyBuffer->Release();
      pMyBuffer = NULL;
      cnsSampleTime     = 0;
      cnsSampleDuration = 0;
      dwFlags           = 0;
      dwOutputNumber    = 0;
   }
} 
while (SUCCEEDED(hr));

pSyncReader->Release();
pSyncReader = NULL;

IWMSyncReader-Schnittstelle

Lesen von ASF-Dateien

Synchrones Reader-Objekt