ASF-Medienquelle

Media Foundation stellt die ASF-Medienquelle bereit, die eine Anwendung verwenden kann, um eine ASF-Datei in der Pipelineebene der Architektur darzustellen.

Um eine ASF-Datei wiederzugeben, kann eine Anwendung die ASF-Medienquelle verwenden, um Daten in eine Wiedergabepipeline zu feeden. In einem Codierungsszenario kann die Anwendung die ASF-Medienquelle als Quelle verwenden, um in ein anderes Format zu konvertieren oder eine höhere Bitrate-Datei in eine niedrigere Bitrate-Datei zu konvertieren, ohne Formate zu ändern. Die ASF-Medienquelle muss auf der Pipelineebene verwendet werden, d. h. eine Anwendung muss die Mediensitzung verwenden, um den Vorgang zu steuern. Diese Zugriffsebene ermöglicht es den Anwendungen, Ereignisse abzurufen, während die Mediensitzung ausgeführt wird. Um zugriff auf den ASF-Inhalt auf niedrigerer Ebene zu erhalten, muss eine Anwendung die WMContainer Layer ASF-Komponenten verwenden.

Die ASF-Medienquelle implementiert die IMFMediaSource-Schnittstelle , die generische Schnittstelle für Medienquellen in Media Foundation. Wie jede andere Medienquelle stellt die ASF-Medienquelle einen Präsentationsdeskriptor bereit, der in erster Linie das ASF Header-Objekt beschreibt. Darüber hinaus stellt die ASF-Medienquelle Streamdeskriptoren bereit, die jeden Datenstrom im Medieninhalt darstellen. Weitere Informationen finden Sie unter ASF-Dateistruktur.

Erstellen der ASF-Medienquelle

Um die ASF-Medienquelle zu erstellen, muss die Anwendung den Source Resolver verwenden. Um die ASF-Medienquelle zu erstellen, muss die Anwendung die Quelle bereitstellen, für die der Quelllöser die ASF-Medienquelle erstellt. Die Quellinformationen müssen entweder durch Angeben der URL der Quelldatei oder des Bytedatenstroms bereitgestellt werden, der die Medien enthält. Wenn die Anwendung die ASF-Medienquelle durch Angeben der URL erstellen möchte, muss sie entweder IMFSourceResolver::CreateObjectFromURL für synchronen Vorgang oder IMFSourceResolver::Begin aufrufen... EndCreateObjectFromURL für asynchronen Vorgang. Der Prozess zum Erstellen der Medienquelle aus einem Bytedatenstrom ist ähnlich. Die Anwendung muss entweder IMFSourceResolver::CreateObjectFromByteStream für synchronen Vorgang oder IMFSourceResolver::Begin... EndCreateObjectFromBytestream für asynchronen Vorgang. Diese Aufrufe müssen MF_RESOLUTION_MEDIASOURCE im dwFlags-Parameter angeben. Weitere Informationen zur Verwendung dieses Flags finden Sie unter Verwenden des Quelllösers.

Wenn die Anwendung eine URL für eine lokale Datei angibt, kann die URL-Zeichenfolge den Pfad der Mediendatei enthalten oder mit dem Präfix "file: "scheme. Die Dateinamenerweiterung muss ".asf", ".wm", "L".wma" oder ".wmv" sein. Für eine ASF-Datei im Netzwerk erstellt der Quelllöser die Netzwerkquelle, die die ASF-Medienquelle verwendet.

Während des Objekterstellungsprozesses sucht der Quelllöser nach der Liste der Schemahandler und der Bytedatenstromhandler in der Systemregistrierung und lädt den nächstgelegenen übereinstimmenden Handler, der den Medieninhalt analysieren und auch das Medienquellobjekt darunter erstellen kann. Unabhängig von der Methode zum Erstellen der Medienquelle (URL und Bytestream) erstellt der Quelllöser einen Bytestream und liest den Inhalt der Quellmedien in den Bytestream. Weitere Informationen finden Sie unter Schemahandler und Byte-Stream-Handler.

Codebeispiel zum Erstellen einer Medienquelle finden Sie unter Using the Source Resolver.

Konfigurationseinstellungen für die ASF-Medienquelle

Die Quelllöserabfragen abfragen die Funktionen des zugrunde liegenden Bytedatenstroms und bestimmen, dass die Vorgänge für die neu erstellte Medienquelle zulässig sind. Eine dieser Funktionen ist die Suche. Wenn ein Suchvorgang zulässig ist, kann die Anwendung den Suchmodus angeben, den die Medienquelle verwendet, während Sie einen bestimmten Punkt in der Präsentation suchen.

Eine Anwendung kann den Suchmodus für die zu verwendende Medienquelle während der Objekterstellung festlegen. Nachdem die ASF-Medienquelle mit dem angegebenen Suchmodus erstellt wurde, kann sie nicht in der Medienquelle geändert oder während einer Präsentation dynamisch geändert werden. Sucheinstellungen werden als Eigenschaften im Aufruf der Anwendung an die relevanten Quelllösermethoden angegeben, die zum Erstellen der Medienquelle verwendet werden. Diese Eigenschaften werden in einem Eigenschaftenspeicher festgelegt und an den pProps-Parameter übergeben. Wenn diese Eigenschaften nicht übergeben werden, funktioniert die Medienquelle mit den Standardeinstellungen. Weitere Informationen zum Festlegen dieser Eigenschaften finden Sie unter Konfigurieren einer Medienquelle.

Wenn die Suche zulässig ist, unterstützt die ASF-Medienquelle die folgenden Suchmodi:

  • Genaue Suche: In diesem Modus basiert die ASF-Medienquelle auf dem ASF Index-Objekt der ASF-Datei. Wenn die Datei nicht über das Indexobjekt verfügt, ist die genaue Suche deaktiviert, und eines der anderen Modi werden abhängig von den anwendungsspezifischen Eigenschaften verwendet, die für die Medienquelle festgelegt sind.
  • Ungefähre Suche: Dieser Modus wird von der Anwendung angefordert, indem MFPKEY_ASFMediaSource_ApproxSeek im Eigenschaftenspeicher an die relevanten Quelllösermethoden übergeben werden. Die ungefähre Suche wird jedoch nur verwendet, wenn der Bytedatenstrom die zeitbasierte Suche nicht unterstützt. In diesem Modus bestimmt die Medienquelle eine Startzeit, die relativ näher an der Suchzeit liegt. Wenn die ASF-Datei ein ASF Index-Objekt enthält, wird sie verwendet, um die Startzeit zu berechnen. Die ungefähre Suche ist weniger genau, aber schneller als die genaue Suche, da die Zeit, die zum Rendern des ersten Beispiels bei der vorher festgelegten Startzeit durchgeführt wurde, schneller ist.
  • Iterative Suche: Um diesen Modus festzulegen, muss die Anwendung die MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex-Eigenschaft festlegen. Iterative Suche ist ein Algorithmus, um eine Position in einer ASF-Datei zu finden, die kein ASF Index-Objekt enthält. In diesem Modus bestimmt die Medienquelle eine grobe Schätzung des Suchpunkts durch Lesen des Bytestrom-Offsets. Es verwendet eine Reihe von Annäherungen basierend auf der durchschnittlichen Bitrate, um sich schrittweise näher an die Zielsuchezeit zu gelangen. (Der Algorithmus ähnelt einer binären Suche.) Iterative Suche kann länger dauern als die Suche mithilfe des Index-Objekts, sodass sie standardmäßig deaktiviert ist. Wenn Sie diese Eigenschaft festlegen, verwenden Sie die folgenden Eigenschaften, um die Suchparameter festzulegen: MFPKEY_ASFMediaSource_IterativeSeek_Max_Count MFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Diese Eigenschaften legen die maximale Anzahl von Iterationen bzw. die Toleranz fest. Der Algorithmus hält an, wenn er die maximale Anzahl von Iterationen erreicht oder ein Paket findet, dessen Entfernung von der Suchzeit innerhalb der angegebenen Toleranz liegt.

Kurz gesagt, die Anwendung hat die Möglichkeit, ungefähre oder iterative Suche zu wählen, wenn die ASF-Datei kein ASF Index-Objekt enthält.

ASF-Medienquellenobjektmodell

Die ASF-Medienquelle implementiert die IMFMediaSource-Schnittstelle und macht die folgenden Schnittstellen verfügbar. Eine Anwendung kann einen Verweis auf diese Schnittstellen abrufen, indem SIE IMFMediaSource::QueryInterface für die ASF-Medienquelle aufrufen.

Schnittstelle Beschreibung
IMFMediaSource Erforderlich für alle Medienquellen.
IMFMediaEventGenerator Erforderlich für alle Medienquellen. Ermöglicht Anwendungen das Abrufen von Ereignissen aus der Medienquelle über die Mediensitzung.
IMFGetService Fragt die Medienquelle für die angegebene Dienstschnittstelle ab.
IPropertyStore Legt Eigenschaften für die Medienquelle fest und ruft diese ab. Jede Eigenschaft enthält einen beschreibenden Namen und einen Wert.
IMFMetadata Beschreibt die Metadaten für die ASF-Datei.
IMFMetadataProvider Ruft eine Sammlung von Metadaten ab, entweder für eine gesamte Präsentation oder für einen Datenstrom in der Präsentation.
IMFRateSupport Fragt den Bereich der unterstützten Wiedergaberaten ab, einschließlich umgekehrter Wiedergabe.
IMFRateControl Ruft die Wiedergaberate ab oder legt sie fest.
IMFTrustedInput Ruft die ITA für jeden der ASF-Datenströme ab, die in der Quelle enthalten sind.
IMFPMPClient Ermöglicht es einer Medienquelle, einen Zeiger auf die IMFPMPHost-Schnittstelle zu empfangen, die zum Erstellen von Objekten im PMP-Prozess verwendet wird.
IMFTimecodeTranslate Wandelt zwischen Society of Motion Picture and Television Engineers (SMPTE) Zeitcodes und 100-Nanosekunden-Zeiteinheiten um.

 

ASF-Medienquellendienste

Die ASF-Medienquelle stellt verschiedene Dienste bereit, die für die ASF-Datei gelten. Um einen Zeiger auf einen bestimmten Dienst abzurufen, muss die Anwendung einen der folgenden Dienstbezeichner im Aufruf von MFGetService verwenden. Weitere Informationen finden Sie unter Dienstschnittstellen.

Dienstbezeichner Beschreibung
MF_RATE_CONTROL_SERVICE Mithilfe dieses Bezeichners kann eine Anwendung einen Zeiger auf IMFRateSupport- oder IMFRateControl-Schnittstellen abrufen. Mithilfe des von der Medienquelle implementierten Zinsunterstützungsobjekts kann die Anwendung überprüfen, ob eine bestimmte Rate von der zugrunde liegenden ASF-Mediendatei unterstützt wird, auch die schnellste und langsamste Rate erhalten. Mithilfe des Rate-Steuerelementobjekts kann die Anwendung die Wiedergaberate abrufen und festlegen. Wenn die Anwendung eine bestimmte Wiedergaberate angibt, überprüft die ASF-Medienquelle zunächst, ob die angeforderte Rate innerhalb der Rategrenzwerte liegt (bestimmt durch schnelle und langsamste Raten), und legt dann die Rate fest. Dadurch wird nicht auf variable Bedingungen überprüft, da sich die Bitrate je nach Netzwerkbandbreite möglicherweise jederzeit ändern kann. Weitere Informationen: Rate Control.
MF_METADATA_PROVIDER_SERVICE Mithilfe dieses Bezeichners kann die Anwendung einen Zeiger auf die IMFMetadataProvider-Schnittstelle der ASF-Medienquelle abrufen. Diese Schnittstelle bietet Zugriff auf Informationen über ASF-Datei speziell die ASF Header Objects und die Datenströme, die in den Medieninhalten enthalten sind. Kopfzeileninformationen werden über Darstellungsdeskriptorattribute verfügbar gemacht, und Datenstrominformationen werden über Streamdeskriptorattribute bereitgestellt. Weitere Informationen zu diesen Attributen finden Sie unter Media Foundation Attributes for ASF Header Objects. Neben Informationen, die über Attribute verfügbar gemacht werden, gibt es auch beschreibende Metadaten, die als Eigenschaften festgelegt werden.
MF_PROPERTY_HANDLER_SERVICE Mithilfe dieses Bezeichners kann die Anwendung einen Zeiger auf die IPropertyStore-Schnittstelle der ASF-Medienquelle abrufen. Der Eigenschaftenspeicher enthält alle Metadaten im Zusammenhang mit der ASF-Datei. Dieser Bezeichner ist neu in Windows 7 und ersetzt MF_METADATA_PROVIDER_SERVICE zum Abrufen von Metadateneigenschaften.
MFNETSOURCE_STATISTICS_SERVICE Weitere Informationen finden Sie unter Abrufen von Netzwerkstatistiken in der Clientprotokollierung.
MF_TIMECODE_SERVICE Mithilfe dieses Bezeichners kann die Anwendung einen Zeiger auf die IMFTimecodeTranslate-Schnittstelle der Medienquelle abrufen. Diese Implementierung kann verwendet werden, um Zeitcodeübersetzungen auszuführen, z. B. das Konvertieren von SMPTE-Zeitcode in 100-Nano-Sekunden-Einheiten und zurück.

 

Zeitcodeübersetzung

Die ASF-Medienquelle bietet einen Zeitcodeübersetzungsdienst, mit dem Ihre Anwendung SMPTE-Zeitcode in die nächste Präsentationszeit konvertieren kann (in 100-Nanosekundeneinheit). Umgekehrt kann die Anwendung auch den Zeitcode für eine angeforderte Präsentationszeit abrufen. Der Dienst ist über die IMFTimecodeTranslate-Schnittstelle verfügbar, die von der ASF-Medienquelle implementiert wird. Die Methodenaufrufe für diesen Schnittstellenzeiger sind asynchron, die vom Hauptanwendungsthread ausgeführt werden können, ohne die Benutzeroberfläche Ihrer Anwendung zu blockieren.

Die folgenden Schritte fassen das Verfahren für die Zeitcodeübersetzung zusammen:

  1. Rufen Sie den Zeiger auf die IMFTimecodeTranslate-Schnittstelle der ASF-Medienquelle ab, indem Sie MFGetService aufrufen und den MF_TIMECODE_SERVICE Bezeichner angeben.
  2. Rufen Sie IMFTimecodeTranslate::BeginConvertTimecodeToHNS oder IMFTimecodeTranslate::BeginConvertHNSToTimecode auf, und geben Sie die Zeit an, die übersetzt werden soll.. Für BeginConvertTimecodeToHNS muss der Zeitcode als PROPVARIANT-Variable mit VT_I8 Datentyp angegeben werden. Die BeginConvertHNSToTimecode-Methode erfordert die Zeit in 100-Nanosekundeneinheiten als MFTIME-Typ .
  3. Schließen Sie den asynchronen Vorgang ab, indem Sie IMFTimecodeTranslate::EndConvertTimecodeToHNS oder IMFTimecodeTranslate::EndConvertTimecodeToHNS entsprechend aufrufen.

Während der Erstellung der Medienquelle erstellt der Quelllöser einen Bytestream für die Datei, aus der die Medienquelle den ASF-Inhalt liest. Damit die Konvertierungen erfolgreich sind, muss der byte-Datenstrom, der der ASF-Datei zugeordnet ist, über Suchfunktionen verfügen; andernfalls ruft die Anwendung den MF_E_BYTESTREAM_NOT_SEEKABLE Fehler aus dem Begin...- Aufruf ab. Eine weitere Anforderung für Zeitkonvertierungen besteht darin, dass die ASF-Datei, dargestellt durch die ASF-Medienquelle, ÜBER ASF-Indexobjekte verfügen muss. Die Präsentationszeiten und die Zeitcodes werden aus den ASF-Indexobjekten extrahiert, die alle Indizes und die entsprechenden Suchpunkte für die ASF-Datei verwalten. Für die Zeit-zu-Zeit-Codeübersetzung der Präsentation muss die ASF-Datei ein einfaches Indexobjekt enthalten; für die Zeitübersetzung von Zeitcode-zu-Präsentationen muss die ASF-Datei über ein Index-Objekt verfügen. Die Konvertierungsvorgänge basieren auf der zugrunde liegenden Indexerkomponente (WMContainer-Komponente), um das Indexobjekt zu analysieren und zu lesen, das der ASF-Datei zugeordnet ist. Wenn die Datei kein Indexobjekt enthält, empfängt die Anwendung asynchron den MF_E_NO_INDEX Fehlercode.

Um die von der Anwendung angeforderte Zeit zu übersetzen, listet die Medienquelle die Datenströme in der Datei auf und findet den Datenstrom, der das entsprechende ASF Index-Objekt enthält. Wenn ein solcher Datenstrom gefunden wird, analysiert die Medienquelle die ASF-Pakete des Datenstroms, bis der richtige Zeitcode erreicht ist. Nachdem es das richtige Beispiel gefunden hat, ruft es die entsprechende Präsentationszeit oder den Zeitcode aus dem Beispiel ab und gibt es an den Aufrufer zurück.

Skriptbefehlsunterstützung

Wenn Sie eine ASF-Topologie erstellen, die einen Skriptstream enthält, wird der Topologie ein Skriptstream-Knoten hinzugefügt. Dieser Knoten sendet IMFSamples zur entsprechenden Zeit. Das vom Skriptquellknoten bereitgestellte IMFSample speichert die Daten im IMFMediaBuffer, die dem Beispiel zugeordnet sind. Sie können CopyToBuffer für das Beispiel aufrufen, um einen IMFMediaBuffer abzurufen, und dann Lock für den Puffer aufrufen, um die Daten abzurufen.

Skriptstreamnutzlasten werden als Typzeichenfolge in den Puffer gepackt, gefolgt von NULL, gefolgt von der Befehlszeichenfolge, gefolgt von NULL. Zeichenfolgen sind Unicode im ASF-Format.

Eine Nutzlast könnte z. B. wie folgt aussehen (wobei \0 ein NULL-Zeichen angibt):

URL\0http://contoso.com\0

Text\0Dies ist eine Beschriftung\0

ASF-Komponenten der Pipelineschicht

ASF-Unterstützung in Media Foundation