Konfigurieren von Profilen und anderen ASF-Dateieigenschaften
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
In den folgenden Elementen wird beschrieben, wie verschiedene Aufgaben im Zusammenhang mit der Erstellung von ASF-Dateien ausgeführt werden. Einige der in diesem Thema erwähnten Schnittstellen sind in der Dokumentation zum Windows Media Format SDK dokumentiert.
Erstellen eines Profils
ASF-Profile werden im Windows Media Format SDK ausführlich erläutert. Im Wesentlichen beschreiben sie Attribute einer Windows Media Format-Datei, z. B. Bitrate, Anzahl und Typ der Datenströme und Komprimierungsqualität. Der Filter verwendet das Profil, um zu bestimmen, welche Art von Windows Media Format-Datei geschrieben werden soll, wie viele Eingabenadeln eingerichtet werden müssen und welche Medientypen sie akzeptieren können.
Verwenden Sie zum Erstellen eines benutzerdefinierten Profils direkt das Windows Media Format SDK, um mithilfe der WMCreateProfileManager-Funktion 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 Windows Media Audio- und Video-Codecs der 9-Serie verwendet. Systemprofile für frühere Versionen dieser Codecs können mithilfe der IConfigASFWriter::ConfigureFilterUsingProfileGuid-Methode hinzugefügt werden.
Sie können das Profil zurücksetzen, während die Eingabestifte des Filters verbunden sind, solange für das neue Profil keine zusätzlichen Eingabestifte erforderlich sind. Wenn Sie z. B. das Profil von einem Reineingabe-Audioprofil in ein Audio- und Videoprofil mit zwei Eingaben ändern, wird nur der Audio-Pin wiederhergestellt, und es wird keine neue Pin für den Videostream erstellt.
Hinzufügen von Metadaten
Um einer Datei Metadaten hinzuzufügen, fragen Sie den WM ASF Writer-Filter für die IWMHeaderInfo-Schnittstelle ab. Nachdem dem Filter ein Profil zugewiesen wurde, verwenden Sie die IWMHeaderInfo-Schnittstellenmethoden , um die Metadaten zu schreiben.
Indizieren einer Datei
Der WM ASF Writer erstellt standardmäßig zeitlich indizierte Dateien. Verwenden Sie zum Erstellen einer frameindizierten Datei die IConfigAsfWriter::SetIndexMode-Methode , um die gesamte Indizierung zu deaktivieren, und erstellen Sie dann die Datei. Wenn dies abgeschlossen ist, verwenden Sie direkt das Windows Media Format SDK, um einen framebasierten Index für die Datei zu erstellen.
Two-Pass-Codierung
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 (in der Regel wird nur ein Vorverarbeitungsdurchlauf ausgeführt), empfängt die Anwendung ein EC_PREPROCESS_COMPLETE Ereignis vom Filter. Wenn dieses Ereignis empfangen wird, verwenden Sie IMediaSeeking::SetPositions , um den Streamzeiger wieder auf den Anfang zurückzusetzen, und führen Sie das Filterdiagramm erneut aus. Nach dem letzten Durchlauf (in der Regel der zweite Durchlauf) empfängt die Anwendung ein EC_COMPLETE-Ereignis , um anzugeben, 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 versuchen, eine weitere Vorverarbeitung auszuführen.
Es ist nur erforderlich, den parameter AM_CONFIGASFWRITER_PARAM_MULTIPASS auf FALSE festzulegen, 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 eine Zwei-Pass-Codierung. Wenn Sie versuchen, eine Datei mit einem solchen Profil zu codieren und AM_CONFIGASFWRITER_PARAM_MULTIPASS nicht auf TRUE festzulegen, tritt ein EC_USERABORT Fehler auf. Weitere Informationen finden Sie in der Dokumentation zum Windows Media Format SDK.
Abrufen und Festlegen von Puffereigenschaften zur Laufzeit
In einigen Szenarien, z. B. wenn Sie das Einfügen eines Keyframes beim Schreiben einer Datei erzwingen möchten, muss eine Anwendung möglicherweise Zur Laufzeit Informationen zu einem Windows Media-Puffer abrufen oder festlegen. Die Filter WM ASF Reader und WM ASF Writer unterstützen beide einen Rückrufmechanismus, der es einer Anwendung ermöglicht, beim Lesen von Dateien oder beim Schreiben von Dateien auf die INSSBuffer3-Schnittstelle auf jedem einzelnen Medienpuffer zuzugreifen. Anwendungen können diese Schnittstelle verwenden, um bestimmte Beispiele als Keyframes festzulegen, SMPTE-Zeitcodes festzulegen, Interlace-Einstellungen anzugeben oder einem Stream einen beliebigen Typ von privaten Daten hinzuzufügen.
Verwenden Sie die IAMWMBufferPass-Schnittstelle , um sich für Rückrufe von der Pin zu registrieren, die den Videodatenstrom verarbeitet. Der Pin ruft Ihre IAMWMBufferPassCallback::Notify-Methode für jeden Puffer auf.
Nicht quadratische Pixel
Der WM ASF Writer stellt eine Verbindung mit einem Upstream-Filter wie dem DV-Decoder her, der Informationen zum Pixelseitenverhältnis ausgibt. Der WM ASF Writer schreibt diese Informationen als Dateneinheitserweiterungen für jedes Beispiel in der Datei.
Wenn der WM ASF-Reader Informationen zum Pixelseitenverhältnis im Dateiheader oder in Dateneinheitserweiterungen für die Beispiele findet, bietet er ein VIDEOINFOHEADER2-Format als erste Wahl an seinem Ausgabepin. Die Elemente dwPictAspectRatioX und dwPictAspectRatioY der Struktur, die das Seitenverhältnis des Videorechtecks beschreiben, werden ordnungsgemäß angepasst, um das Pixelseitenverhältnis zu berücksichtigen.
Beibehalten des Interlaced-Formats
Wenn Sie Interlaced-Video von einem Fernseher oder einer DV-Kamera aufnehmen, möchten Sie das Originalvideo möglicherweise 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 für die progressive Überprüfung.) Wenn Sie ein Video deinterlacen und es dann für die Wiedergabe auf einem Fernseher erneut erstellen, kommt es zu einem gewissen Datenverlust. In einer ASF-Datei werden Interlacinginformationen als Dateneinheitserweiterungen gespeichert, die die Anwendung mithilfe 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 Interlaceflags für jedes Beispiel festlegt. Diese Funktion wird vom WM ASF Writer aufgerufen, bevor jedes Beispiel verarbeitet wird.
// Set to WM_CT_TOP_FIELD_FIRST if that is your format. BYTE flag = WM_CT_INTERLACED | WM_CT_BOTTOM_FIELD_FIRST; HRESULT hr = S_OK; 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 aus dem 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));
Zugehörige Themen