IMFMediaSource::Start-Methode (mfidl.h)
Startet, sucht oder startet die Medienquelle neu, indem angegeben wird, wo die Wiedergabe gestartet werden soll.
Syntax
HRESULT Start(
[in] IMFPresentationDescriptor *pPresentationDescriptor,
[in] const GUID *pguidTimeFormat,
[in] const PROPVARIANT *pvarStartPosition
);
Parameter
[in] pPresentationDescriptor
Zeiger auf die IMFPresentationDescriptor-Schnittstelle des Präsentationsdeskriptors der Medienquelle. Um den Präsentationsdeskriptor abzurufen, rufen Sie IMFMediaSource::CreatePresentationDescriptor auf. Sie können den Präsentationsdeskriptor ändern, bevor Sie Start aufrufen, um Streams auszuwählen oder zu deaktivieren oder die Medientypen zu ändern.
[in] pguidTimeFormat
Zeiger auf eine GUID, die das Zeitformat angibt. Das Zeitformat definiert die Einheiten für den pvarStartPosition-Parameter . Wenn der Wert GUID_NULL ist, ist das Zeitformat 100 Nanosekundeneinheiten. Einige Medienquellen unterstützen möglicherweise zusätzliche Zeitformat-GUIDs. Dieser Parameter kann NULL sein. Wenn der Wert NULL ist, entspricht er GUID_NULL.
[in] pvarStartPosition
Gibt an, wo die Wiedergabe gestartet werden soll. Die Einheiten dieses Parameters werden durch das in pguidTimeFormat angegebene Zeitformat angegeben. Wenn das Zeitformat GUID_NULL ist, muss der Variantentyp VT_I8 oder VT_EMPTY sein. Verwenden Sie VT_I8 , um eine neue Startposition in Einheiten von 100 Nanosekunden anzugeben. Verwenden Sie VT_EMPTY , um mit der aktuellen Position zu beginnen. Andere Zeitformate können andere PROPVARIANT-Typen verwenden.
Rückgabewert
Die Methode gibt ein HRESULT zurück. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.
Rückgabecode | BESCHREIBUNG |
---|---|
|
Die Methode wurde erfolgreich ausgeführt. |
|
Die Startposition befindet sich am Ende der Präsentation (ASF-Medienquelle). |
|
Ein Hardwaregerät konnte das Streaming nicht starten. Dieser Fehlercode kann von einer Medienquelle zurückgegeben werden, die ein Hardwaregerät darstellt, z. B. eine Kamera. Wenn die Kamera beispielsweise bereits von einer anderen Anwendung verwendet wird, gibt die Methode möglicherweise diesen Fehlercode zurück. |
|
Die Startanforderung ist ungültig. Beispielsweise befindet sich die Startposition nach dem Ende der Präsentation. |
|
Die Shutdown-Methode der Medienquelle wurde aufgerufen. |
|
Die Medienquelle unterstützt das in pguidTimeFormat angegebene Zeitformat nicht. |
Hinweise
Diese Methode ist asynchron. Wenn der Vorgang erfolgreich ist, sendet die Medienquelle die folgenden Ereignisse:
- Für jeden neuen Stream sendet die Quelle ein MENewStream-Ereignis . Dieses Ereignis wird für den ersten Startaufruf gesendet, in dem der Stream angezeigt wird. Die Ereignisdaten sind ein Zeiger auf die IMFMediaStream-Schnittstelle des Streams.
- Für jeden aktualisierten Stream sendet die Quelle ein MEUpdatedStream-Ereignis . Ein Stream wird aktualisiert, wenn der Stream bereits vorhanden war, als Start aufgerufen wurde (z. B. wenn die Anwendung während der Wiedergabe sucht). Die Ereignisdaten sind ein Zeiger auf die IMFMediaStream-Schnittstelle des Streams.
- Wenn der vorherige Zustand beendet wurde, sendet die Quelle ein MESourceStarted-Ereignis .
- Wenn der vorherige Zustand gestartet oder angehalten wurde und die Startposition die aktuelle Position ist (VT_EMPTY), sendet die Quelle ein MESourceStarted-Ereignis .
- Wenn der vorherige Zustand gestartet oder angehalten wurde und eine neue Startposition angegeben wird, sendet die Quelle ein MESourceSeeked-Ereignis .
- Wenn die Quelle ein MESourceStarted-Ereignis sendet, sendet jeder Medienstream ein MEStreamStarted-Ereignis . Wenn die Quelle ein MESourceSeeked-Ereignis sendet, sendet jeder Stream ein MEStreamSeeked-Ereignis .
Ein Aufruf von Start führt zu einer Suche , wenn der vorherige Zustand gestartet oder angehalten wurde und die neue Startposition nicht VT_EMPTY ist. Nicht jede Medienquelle kann suchen. Wenn eine Medienquelle suchen kann, gibt die IMFMediaSource::GetCharacteristics-Methode das MFMEDIASOURCE_CAN_SEEK-Flag zurück.
Ereignisse aus der Medienquelle werden nicht mit Ereignissen aus den Mediendatenströmen synchronisiert. Wenn Sie eine Medienquelle suchen, können Sie daher nach dem Abrufen des MESourceSeeked-Ereignisses weiterhin Beispiele aus der früheren Position erhalten. Wenn Sie die Vorgänge synchronisieren müssen, warten Sie auf das Streamereignis MEStreamSeeked, das den genauen Punkt im Stream markiert, an dem die Suche stattfindet.
Ende Stream
Wenn ein Stream bis zum Ende wiedergegeben wird, sendet der Stream ein MEEndOfStream-Ereignis . Wenn alle ausgewählten Streams das Ende erreicht haben, sendet die Medienquelle ein MEEndOfPresentation-Ereignis .Wenn die Startposition am Ende eines ausgewählten Datenstroms liegt (aber vor dem Ende der Präsentation), sollte der Stream MEEndOfStream unmittelbar nach MEStreamStarted/MEStreamSeeked senden. Wenn die Wiedergabe das Ende der Präsentation erreicht und Start von der aktuellen Position aus erneut aufgerufen wird, senden die Streams das MEEndOfStream-Ereignis erneut, und die Medienquelle sendet das MEEndOfPresentation-Ereignis erneut. Diese Ereignisse informieren die Pipeline, keine weiteren Daten anzufordern.
Während der umgekehrten Wiedergabe wird der Anfang der Datei als Das Ende des Datenstroms betrachtet. Weitere Informationen finden Sie unter Implementieren der Ratensteuerung.
Implementieren von Start
Wenn eine Medienquelle eine Suche ausführt, sollte sie beim ersten Keyframe vor der Suchzeit beginnen, damit der Decoder die Beispiele für die Zielstartzeit decodieren kann. Die Pipeline verwirft alle decodierten Beispiele, die zu früh sind.Wenn die Startzeit VT_EMPTY ist und der vorherige Zustand gestartet oder angehalten wurde, sollte die Quelle von ihrer aktuellen Position aus fortgesetzt werden. In diesem Fall ist es nicht erforderlich, den vorherigen Keyframe erneut zu senden, da der Decoder weiterhin die Daten enthält, die zuvor gesendet wurden.
Beim Überprüfen des pPresentationDescriptor-Parameters sollte die Medienquelle nur auf die Informationen überprüfen, die sie für die ordnungsgemäße Funktion benötigt. Insbesondere kann der Client dem Präsentationsdeskriptor private Attribute hinzufügen. Das Vorhandensein zusätzlicher Attribute sollte nicht dazu führen, dass die Start-Methode fehlschlägt.
Nachdem Start aufgerufen wurde, muss jeder Stream auf der Medienquelle eine der folgenden Aktionen ausführen:
- Stellen Sie Mediendaten als Reaktion auf IMFMediaStream::RequestSample-Aufrufe bereit.
- Senden Sie MEStreamTick-Ereignisse , um eine Lücke im Stream anzuzeigen.
- Senden Sie ein MEEndOfStream-Ereignis , um das Ende des Datenstroms anzugeben.
Beispiele
Im folgenden Beispiel wird die Wiedergabe mit einer Sekunde in der Präsentation gestartet.
PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_I8;
var.hVal.QuadPart = 10000000; // 10^7 = 1 second.
hr = pSource->Start(pPresentationDescriptor, NULL, &var);
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2008 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | mfidl.h |
Bibliothek | Mfuuid.lib |