Konfigurieren von Profilen und anderen Dateieigenschaften (QASF)

In den folgenden Elementen wird beschrieben, wie verschiedene Aufgaben im Zusammenhang mit der Erstellung von ASF-Dateien ausgeführt werden.

Erstellen eines Profils (QASF)

Um ein benutzerdefiniertes Profil zu erstellen, verwenden Sie das Windows Media Format SDK direkt, um mithilfe der FUNKTION WMCreateProfileManager ein Profil-Manager-Objekt zu erstellen. Erstellen Sie als Nächstes das Profil, und übergeben Sie es mithilfe der IConfigASFWriter::ConfigureFilterUsingProfile-Methode an den WM ASF Writer. Dies ist die einzige Möglichkeit, den Filter mit einem Profil zu konfigurieren, das die Codecs der Windows Media Audio- und Video9-Serie verwendet. Systemprofile für frühere Versionen dieser Codecs können mithilfe der IConfigASFWriter::ConfigureFilterUsingProfileGuid-Methode hinzugefügt werden.

Hinzufügen von Metadaten (QASF)

Um Metadaten zu einer Datei hinzuzufügen, rufen Sie QueryInterface über die IBaseFilter-Schnittstelle auf dem WM ASF Writer auf, um die IWMHeaderInfo-Schnittstelle abzurufen. Nachdem dem Filter ein Profil zugewiesen wurde, verwenden Sie die IWMHeaderInfo-Schnittstellenmethoden , um die Metadaten zu schreiben.

Indizieren einer Datei (QASF)

Der WM ASF Writer erstellt standardmäßig zeitlich indizierte Dateien. Um eine Frameindizierungsdatei zu erstellen, verwenden Sie die IConfigAsfWriter::SetIndexMode-Methode , um die gesamte Indizierung zu deaktivieren, und erstellen Sie dann die Datei. Verwenden Sie nach Abschluss des Vorgangs direkt das Windows Media Format SDK, um einen framebasierten Index für die Datei zu erstellen.

Ausführen Two-Pass Codierung (QASF)

Die Codierung mit zwei Durchgängen wird nur für Windows Media-Codecs ab Version 8 unterstützt. Versetzen Sie den WM ASF Writer in den Vorverarbeitungsmodus, indem Sie IConfigAsfWriter2::SetParam aufrufen und AM_CONFIGASFWRITER_PARAM_MULTIPASS im dwParam-Parameter und TRUE im dwParam1-Parameter angeben.

Führen Sie dann das Filterdiagramm aus. Wenn alle Vorverarbeitungsdurchläufe abgeschlossen sind (normalerweise wird nur ein Vorverarbeitungsdurchlauf ausgeführt), erhält die Anwendung ein EC_PREPROCESS_COMPLETE-Ereignis vom Filter. Wenn dieses Ereignis empfangen wird, verwenden Sie IMediaSeeking::SetPositions , um den Streamzeiger zurück auf den Anfang zurückzusetzen und das Filterdiagramm erneut auszuführen. Nach dem letzten Durchlauf (in der Regel der zweite Durchlauf) empfängt die Anwendung ein EC_COMPLETE-Ereignis , um zu signalisieren, dass der Codierungsprozess abgeschlossen ist. Wenn ein Vorverarbeitungsdurchlauf abgebrochen wird, bevor das EC_PREPROCESS_COMPLETE-Ereignis empfangen wird, rufen Sie IConfigAsfWriter2::ResetMultiPassState auf, um den Filter zurückzusetzen, bevor Sie eine weitere Vorverarbeitungsausführung versuchen.

Es ist nur erforderlich, IConfigAsfWriter::SetParam(AM_CONFIGASFWRITER_PARAM_MULTIPASS, FALSE) aufzurufen, wenn Sie den Filter vollständig aus dem Vorverarbeitungsmodus entfernen möchten.

Wichtig

Es liegt in der Verantwortung der Anwendung, den Vorverarbeitungsmodus basierend auf dem Profil zu aktivieren, das für die Codierung verwendet wird. Einige Profile erfordern die Codierung mit zwei Durchläufen. Wenn Sie versuchen, eine Datei mit einem solchen Profil zu codieren und AM_CONFIGASFWRITER_PARAM_MULTIPASS nicht auf TRUE festlegen, tritt ein EC_USERABORT Fehler auf. Weitere Informationen zum Ermitteln, ob ein bestimmtes Profil eine Codierung mit zwei Durchläufen erfordert, finden Sie unter Verwenden Two-Pass Codierung oder Schreiben von Streams mit variabler Bitrate.

 

Abrufen und Festlegen von Puffereigenschaften zur Laufzeit (QASF)

In einigen Szenarien, z. B. wenn Sie das Einfügen eines Schlüsselrahmens beim Schreiben einer Datei erzwingen möchten, muss eine Anwendung möglicherweise Informationen zu einem Windows Media-Puffer zur Laufzeit abrufen oder festlegen. Die Filter WM ASF Reader und WM ASF Writer unterstützen beide einen Rückrufmechanismus, der es einer Anwendung ermöglicht, während des Lesens oder Schreibens von Dateien auf die INSSBuffer3-Schnittstelle auf jeden einzelnen Medienpuffer zuzugreifen. Anwendungen können diese Schnittstelle verwenden, um bestimmte Beispiele als Keyframes oder Cleanpoints festzulegen, SMPTE-Zeitcodes festzulegen, Interlace-Einstellungen anzugeben oder einem Stream einen beliebigen Typ von privaten Daten hinzuzufügen.

Verwenden Sie die IAMWMBufferPass-Schnittstelle , um Rückrufe von der Pin zu registrieren, die den Videostream verarbeitet. Wenn der Pin Ihre IAMWMBufferPassCallback::Notify-Methode aufruft, untersuchen Sie die Zeitstempel auf dem Puffer, und rufen Sie ggf . INSSBuffer3::SetProperty auf, um die WM_SampleExtensionGUID_OutputCleanPoint-Eigenschaft für den Puffer auf TRUE festzulegen.

Unterstützung nicht quadratischer Pixel (QASF)

Der WM ASF Writer stellt eine Verbindung mit einem Upstream-Filter her, z. B. dem DV-Decoder, der Informationen zum Pixelseitenverhältnis ausgibt. Der WM ASF Writer schreibt diese Informationen als Dateneinheitenerweiterungen für jedes Beispiel in der Datei.

Wenn der WM ASF Reader Informationen zum Pixelseitenverhältnis im Dateiheader oder in Dateneinheitenerweiterungen für die Beispiele findet, bietet er einen VIDEOINFOHEADER2-Medientyp als erste Wahl an seinem Ausgabenadel. Die Elemente dwPictAspectRatioX und dwPictAspectRatioY der Struktur, die das Seitenverhältnis des Videorechtecks beschreiben, werden ordnungsgemäß angepasst, um das Pixelseitenverhältnis zu berücksichtigen.

Verwalten von Interlaced Format

Wenn Sie interlaced Video von einem Fernseher oder einer DV-Kamera aufnehmen, sollten Sie das originale Video als unabhängige Felder beibehalten, wenn Sie erwarten, dass die codierte Datei auf einem Fernseher oder einem anderen interlaced Display-Gerät wiedergegeben wird. (Computermonitore sind Geräte mit progressiver Überprüfung.) Wenn Sie ein Video deinterlacieren und es dann für die Wiedergabe auf einem Fernseher erneut interlacieren, kommt es zu einem Datenverlust. In einer ASF-Datei werden Interlacing-Informationen als Dateneinheitserweiterungen gespeichert, die die Anwendung mit der zuvor beschriebenen IAMWMBufferPassCallback-Methode auf jedes Beispiel anwendet. Führen Sie die folgenden Schritte aus, um eine Datei zu codieren, die die ursprünglichen Interlace-Einstellungen beibehalten:

  • Implementieren Sie eine Klasse, die IAMWMBufferPassCallback unterstützt, und schreiben Sie eine Notify-Funktion, die die Interlace-Flags für jedes Beispiel festlegt. Diese Funktion wird vom WM ASF Writer aufgerufen, bevor die einzelnen Beispiele verarbeitet werden.
// Set to WM_CT_TOP_FIELD_FIRST if that is your format.
BYTE flag = WM_CT_INTERLACED | WM_CT_BOTTOM_FIELD_FIRST;
            HRESULT hr = pNSSBuffer3->SetProperty(WM_SampleExtensionGUID_ContentType, (void*) &flag, WM_SampleExtension_ContentType_Size);
           
  • Legen Sie die Dateneinheitserweiterungen für das Profil fest, bevor Sie das Profil an den Filter übergeben.
hr = pWMStreamConfig2->AddDataUnitExtension( WM_SampleExtensionGUID_ContentType, WM_SampleExtension_ContentType_Size, NULL, 0 );
  • Nachdem Sie den Filter mit dem Profil konfiguriert haben, rufen Sie die IWMWriterAdvanced2-Schnittstelle vom WM ASF Writer ab, und rufen Sie die SetInputSettings-Methode auf.

// Must do this first.

hr = pConfigAsfWriter2->ConfigureFilterUsingProfile(pProfile);

  
CComPtr<IServiceProvider> pProvider;
  CComPtr<IWMWriterAdvanced2> pWMWA2;
  hr = pConfigAsfWriter2->QueryInterface( __uuidof(IServiceProvider),
                                         (void**)&pProvider);
  if (SUCCEEDED(hr))
  {
      hr = pProvider->QueryService(IID_IWMWriterAdvanced2,
                    IID_IWMWriterAdvanced2,
                    (void**)&pWMWA2);
  }
  BOOL pValue = TRUE;
 // Set the first parameter to your actual input number.
 hr = pWMWA2->SetInputSetting(0, g_wszInterlacedCoding,
              WMT_TYPE_BOOL, (BYTE*) &pValue, sizeof(WMT_TYPE_BOOL));