ASF-Medienquelle

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

Um eine ASF-Datei wiederzugeben, kann eine Anwendung die ASF-Medienquelle verwenden, um Daten in eine Wiedergabepipeline einzuspeisen. In einem Codierungsszenario kann die Anwendung die ASF-Medienquelle als Quelle verwenden, um in ein anderes Format zu konvertieren oder eine Datei mit höherer Bitrate in eine Datei mit niedrigerer Bitrate zu konvertieren, ohne das Format zu ändern. Die ASF-Medienquelle muss in der Pipelineschicht 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 die generische Schnittstelle für Medienquellen in Media Foundation ist. Wie jede andere Medienquelle stellt die ASF-Medienquelle einen Präsentationsdeskriptor bereit, der in erster Linie das ASF-Headerobjekt beschreibt. Darüber hinaus stellt die ASF-Medienquelle Streamdeskriptoren bereit, die jeden Stream im Medieninhalt darstellen. Weitere Informationen finden Sie unter ASF-Dateistruktur.

Erstellen der ASF-Medienquelle

Um die ASF-Medienquelle zu erstellen, muss die Anwendung den Quellkonfliktlöser 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 Angabe der URL der Quelldatei oder des Bytedatenstroms bereitgestellt werden, der die Medien enthält. Wenn die Anwendung die ASF-Medienquelle durch Angabe der URL erstellt, muss sie entweder IMFSourceResolver::CreateObjectFromURL für synchronen Vorgang oder IMFSourceResolver::Begin... aufrufen. EndCreateObjectFromURL für asynchrone Vorgänge. Der Prozess zum Erstellen der Medienquelle aus einem Bytedatenstrom ist ähnlich. Die Anwendung muss entweder IMFSourceResolver::CreateObjectFromByteStream für den synchronen Betrieb oder IMFSourceResolver::Begin... aufrufen. 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 Quellre resolvers.

Wenn die Anwendung eine URL angibt, kann die URL-Zeichenfolge für eine lokale Datei 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 Quellrelöser die Liste der Schemahandler und der Bytestreamhandler in der Systemregistrierung und lädt den nächstgelegenen übereinstimmenden Handler, der den Medieninhalt analysieren und auch das darunter liegende Medienquellobjekt erstellen kann. Unabhängig von der Methode zum Erstellen der Medienquelle (URL und Bytestream) erstellt der Quelllöser einen Bytedatenstrom und liest den Inhalt der Quellmedien in den Bytedatenstrom. Weitere Informationen finden Sie unter Schemahandler und Byte-Stream Handler.

Codebeispiele zum Erstellen einer Medienquelle finden Sie unter Verwenden des Quelllösers.

Konfigurationseinstellungen für die ASF-Medienquelle

Der Quelllöser fragt die Funktionen des zugrunde liegenden Bytedatenstroms ab und bestimmt, ob 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 bei der Suche zu einem bestimmten Punkt in der Präsentation verwendet.

Eine Anwendung kann den Suchmodus festlegen, der von der Medienquelle während der Objekterstellung verwendet werden soll. Nachdem die ASF-Medienquelle mit dem angegebenen Suchmodus erstellt wurde, kann sie nicht auf der Medienquelle geändert oder während einer Präsentation dynamisch geändert werden. Sucheinstellungen werden als Eigenschaften im Aufruf der Anwendung für die relevanten Quellrelö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 suchen zulässig ist, unterstützt die ASF-Medienquelle die folgenden Suchmodi:

  • Genaue Suche: In diesem Modus basiert die ASF-Medienquelle auf dem ASF-Indexobjekt der ASF-Datei. Wenn die Datei nicht über das Index-Objekt verfügt, wird die genaue Suche deaktiviert, und einer der anderen Modi wird 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 entsprechenden Quellrelösermethoden übergeben wird. Die ungefähre Suche wird jedoch nur verwendet, wenn der Bytestream 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-Indexobjekt enthält, wird es verwendet, um die Startzeit zu berechnen. Die ungefähre Suche ist weniger genau, aber schneller als die genaue Suche, da die Zeit, die das Rendern der ersten Stichprobe bei der vordefinierten Startzeit dauert, schneller ist.
  • Iterative Suche: Um diesen Modus festzulegen, muss die Anwendung die MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex-Eigenschaft festlegen. Iterative Suche ist ein Algorithmus zum Suchen einer Position in einer ASF-Datei, die kein ASF-Indexobjekt enthält. In diesem Modus bestimmt die Medienquelle eine grobe Schätzung des Suchpunkts, indem sie den Bytestromoffset liest. Es verwendet eine Reihe von Näherungen, die auf der durchschnittlichen Bitrate basieren, um der Zielsuchezeit schrittweise näher zu kommen. (Der Algorithmus ähnelt einer binären Suche.) Die iterative Suche kann länger dauern als die Suche mithilfe des Index-Objekts, daher ist sie standardmäßig deaktiviert. Wenn Sie diese Eigenschaft festlegen, verwenden Sie die folgenden Eigenschaften, um die Suchparameter festzulegen: MFPKEY_ASFMediaSource_IterativeSeek_Max_CountMFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Diese Eigenschaften legen die maximale Anzahl von Iterationen bzw. die Toleranz fest. Der Algorithmus wird angehalten, wenn er die maximale Anzahl von Iterationen erreicht oder ein Paket findet, dessen Abstand zur Suchzeit innerhalb der angegebenen Toleranz liegt.

Kurz gesagt, die Anwendung hat die Möglichkeit, eine ungefähre oder iterative Suche zu wählen, wenn die ASF-Datei kein ASF-Indexobjekt 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 aufruft.

Schnittstelle Beschreibung
IMFMediaSource Erforderlich für alle Medienquellen.
IMFMediaEventGenerator Erforderlich für alle Medienquellen. Ermöglicht Anwendungen das Abrufen von Ereignissen von 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 sie 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 Stream in der Präsentation.
IMFRateSupport Fragt den Bereich der unterstützten Wiedergaberaten ab, einschließlich der umgekehrten Wiedergabe.
IMFRateControl Ruft die Wiedergaberate ab oder legt sie fest.
IMFTrustedInput Ruft den ITA für jeden der in der Quelle enthaltenen ASF-Streams ab.
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 Konvertiert zwischen Zeitcodes der Society of Motion Picture and Television Engineers (SMPTE) und Zeiteinheiten von 100 Nanosekunden.

 

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 in ihrem 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 die SCHNITTSTELLEN IMFRateSupport oder IMFRateControl abrufen. Mithilfe des von der Medienquelle implementierten Ratenunterstü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 erzielen. Mithilfe des Ratensteuerungsobjekts kann die Anwendung die Wiedergaberate abrufen und festlegen. Wenn die Anwendung eine bestimmte Rate für die Wiedergabe angibt, überprüft die ASF-Medienquelle zunächst, ob die angeforderte Rate innerhalb der Ratengrenzwerte liegt (bestimmt durch die geschwindigkeitsreichsten und langsamsten Raten), und legt dann die Rate fest. Dadurch wird nicht auf variable Bedingungen überprüft, da sich die Bitrate je nach Netzwerkbandbreite jederzeit ändern kann. Weitere Informationen findest du unter Ratensteuerung.
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 zur ASF-Datei, insbesondere zu den ASF-Headerobjekten und den Streams, die im Medieninhalt enthalten sind. Headerinformationen werden über Präsentationsdeskriptorattribute verfügbar gemacht, und Streaminformationen werden über Streamdeskriptorattribute bereitgestellt. Weitere Informationen zu diesen Attributen finden Sie unter Media Foundation-Attribute für ASF-Headerobjekte. Neben Informationen, die über Attribute verfügbar gemacht werden, gibt es auch beschreibende Metadaten, die als Eigenschaften festgelegt sind.
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 durchzuführen, z. B. die Konvertierung von SMPTE-Zeitcode in Einheiten mit 100 Nano-Sekunden und zurück.

 

Timecodeübersetzung

Die ASF-Medienquelle bietet einen Zeitcodeübersetzungsdienst, mit dem Ihre Anwendung SMPTE-Zeitcode in die nächste Präsentationszeit (in einer Einheit von 100 Nanosekunden) konvertieren kann. 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 und können von Ihrem Standard Anwendungsthread ausgeführt werden, ohne die Benutzeroberfläche Ihrer Anwendung zu blockieren.

In den folgenden Schritten wird das Verfahren für die Zeitcodeübersetzung zusammengefasst:

  1. Rufen Sie den Zeiger auf die IMFTimecodeTranslate-Schnittstelle der ASF-Medienquelle ab, indem Sie MFGetService aufrufen und den bezeichner MF_TIMECODE_SERVICE 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 Einheiten von 100 Nanosekunden als MFTIME-Typ .
  3. Schließen Sie den asynchronen Vorgang ab, indem Sie IMFTimecodeTranslate::EndConvertTimecodeToHNS oder IMFTimecodeTranslate::EndConvertTimecodeToHNS ordnungsgemäß aufrufen.

Während der Erstellung der Medienquelle erstellt der Quellrelöser einen Bytedatenstrom für die Datei, aus der die Medienquelle den ASF-Inhalt liest. Damit die Zeitkonvertierungen erfolgreich sind, muss der der ASF-Datei zugeordnete Bytedatenstrom über Suchfunktionen verfügen. Andernfalls ruft die Anwendung den MF_E_BYTESTREAM_NOT_SEEKABLE Fehler vom Aufruf Begin... ab. Eine weitere Voraussetzung für Zeitkonvertierungen ist, dass die ASF-Datei, die durch die ASF-Medienquelle dargestellt wird, Ü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-Übersetzung von Präsentationscode muss die ASF-Datei ein Simple Index-Objekt enthalten. Für die Zeitübersetzung von Code zu Präsentationszeit muss die ASF-Datei über ein Index-Objekt verfügen. Die Konvertierungsvorgänge basieren auf dem zugrunde liegenden Indexer (WMContainer-Komponente), um das index-Objekt zu analysieren und zu lesen, das der ASF-Datei zugeordnet ist. Wenn die Datei kein Index-Objekt 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 sucht nach dem Stream, der das entsprechende ASF-Indexobjekt enthält. Wenn ein solcher Datenstrom gefunden wird, analysiert die Medienquelle die ASF-Pakete des Datenstroms, bis der richtige Zeitcode erreicht ist. Nachdem das richtige Beispiel gefunden wurde, ruft es die entsprechende Präsentationszeit oder den Zeitcode aus dem Beispiel ab und gibt ihn an den Aufrufer zurück.

Unterstützung von Skriptbefehlen

Wenn Sie eine ASF-Topologie erstellen, die einen Skriptstream enthält, wird der Topologie ein Skriptstreamknoten hinzugefügt. Dieser Knoten sendet ZUM geeigneten Zeitpunkt IMFSamples. Der vom Skriptquellknoten bereitgestellte IMFSample speichert die Daten im IMFMediaBuffer, der dem Beispiel zugeordnet ist. 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.

Beispielsweise könnte eine Nutzlast wie folgt aussehen (wobei \0 ein NULL-Zeichen angibt):

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

Text\0Dies ist ein Untertitel\0

ASF-Komponenten auf Pipelineebene

ASF-Unterstützung in Media Foundation