IMFMediaSource ::Start, méthode (mfidl.h)

Démarre, recherche ou redémarre la source multimédia en spécifiant où commencer la lecture.

Syntaxe

HRESULT Start(
  [in] IMFPresentationDescriptor *pPresentationDescriptor,
  [in] const GUID                *pguidTimeFormat,
  [in] const PROPVARIANT         *pvarStartPosition
);

Paramètres

[in] pPresentationDescriptor

Pointeur vers l’interface IMFPresentationDescriptor du descripteur de présentation de la source multimédia. Pour obtenir le descripteur de présentation, appelez IMFMediaSource ::CreatePresentationDescriptor. Vous pouvez modifier le descripteur de présentation avant d’appeler Démarrer, pour sélectionner ou désélectionner des flux ou modifier les types de médias.

[in] pguidTimeFormat

Pointeur vers un GUID qui spécifie le format d’heure. Le format d’heure définit les unités du paramètre pvarStartPosition . Si la valeur est GUID_NULL, le format d’heure est de 100 nanosecondes. Certaines sources multimédias peuvent prendre en charge des GUID de format de temps supplémentaires. Ce paramètre peut être NULL. Si la valeur est NULL, elle équivaut à GUID_NULL.

[in] pvarStartPosition

Spécifie où commencer la lecture. Les unités de ce paramètre sont indiquées par le format d’heure donné dans pguidTimeFormat. Si le format d’heure est GUID_NULL, le type de variante doit être VT_I8 ou VT_EMPTY. Utilisez VT_I8 pour spécifier une nouvelle position de départ, en unités de 100 nanosecondes. Utilisez VT_EMPTY pour commencer à partir de la position actuelle. D’autres formats d’heure peuvent utiliser d’autres types PROPVARIANT .

Valeur retournée

Cette méthode retourne un code HRESULT. Les valeurs possibles sont notamment celles figurant dans le tableau suivant.

Code de retour Description
S_OK
S_OK
MF_E_ASF_OUTOFRANGE
La position de début se trouve au-delà de la fin de la présentation (source multimédia ASF).
MF_E_HW_MFT_FAILED_START_STREAMING
Un périphérique matériel n’a pas pu démarrer la diffusion en continu. Ce code d’erreur peut être retourné par une source multimédia qui représente un périphérique matériel, tel qu’une caméra. Par exemple, si l’appareil photo est déjà utilisé par une autre application, la méthode peut retourner ce code d’erreur.
MF_E_INVALIDREQUEST
La demande de démarrage n’est pas valide. Par exemple, la position de début se trouve au-delà de la fin de la présentation.
MF_E_SHUTDOWN
La méthode Shutdown de la source multimédia a été appelée.
MF_E_UNSUPPORTED_TIME_FORMAT
La source du média ne prend pas en charge le format d’heure spécifié dans pguidTimeFormat.

Remarques

Cette méthode est asynchrone. Si l’opération réussit, la source du média envoie les événements suivants :

  • Pour chaque nouveau flux, la source envoie un événement MENewStream . Cet événement est envoyé pour le premier appel de démarrage dans lequel le flux apparaît. Les données d’événement sont un pointeur vers l’interface IMFMediaStream du flux.
  • Pour chaque flux mis à jour , la source envoie un événement MEUpdatedStream . Un flux est mis à jour si le flux existait déjà lorsque Start a été appelé (par exemple, si l’application recherche pendant la lecture). Les données d’événement sont un pointeur vers l’interface IMFMediaStream du flux.
  • Si l’état précédent a été arrêté, la source envoie un événement MESourceStarted .
  • Si l’état précédent a été démarré ou suspendu et que la position de départ est la position actuelle (VT_EMPTY), la source envoie un événement MESourceStarted .
  • Si l’état précédent a été démarré ou suspendu et qu’une nouvelle position de départ est spécifiée, la source envoie un événement MESourceSeeked .
  • Si la source envoie un événement MESourceStarted , chaque flux multimédia envoie un événement MEStreamStarted . Si la source envoie un événement MESourceSeeked , chaque flux envoie un événement MEStreamSeeked .
Si l’opération de démarrage échoue de manière asynchrone (une fois que la méthode retourne S_OK), la source multimédia envoie un événement MESourceStarted qui contient un code d’échec, sans envoyer d’autres événements répertoriés ici. Si la méthode échoue de façon synchrone (retourne un code d’erreur), aucun événement n’est déclenché.

Un appel à Démarrer entraîne une recherche si l’état précédent a été démarré ou suspendu, et si la nouvelle position de départ n’est pas VT_EMPTY. Toutes les sources de médias ne peuvent pas rechercher. Si une source multimédia peut rechercher, la méthode IMFMediaSource ::GetCharacteristics retourne l’indicateur MFMEDIASOURCE_CAN_SEEK .

Les événements de la source multimédia ne sont pas synchronisés avec les événements des flux multimédias. Par conséquent, si vous recherchez une source multimédia, vous pouvez toujours recevoir des exemples de la position précédente après avoir obtenu l’événement MESourceSeeked . Si vous devez synchroniser les opérations, attendez l’événement de flux , MEStreamSeeked, qui marque le point exact dans le flux où la recherche se produit.

Fin de Stream

Lorsqu’un flux est lu jusqu’à la fin, le flux envoie un événement MEEndOfStream . Lorsque tous les flux sélectionnés ont atteint la fin, la source multimédia envoie un événement MEEndOfPresentation .

Si la position de départ se trouve au-delà de la fin d’un flux sélectionné (mais avant la fin de la présentation), le flux doit envoyer MEEndOfStream immédiatement après MEStreamStarted/MEStreamSeeked. Si la lecture atteint la fin de la présentation et que Start est appelé à nouveau à partir de la position actuelle, les flux envoient de nouveau l’événement MEEndOfStream et la source multimédia renvoie l’événement MEEndOfPresentation . Ces événements informent le pipeline de ne plus demander de données.

Pendant la lecture inversée, le début du fichier est considéré comme la fin du flux. Pour plus d’informations, consultez Implémentation du contrôle de débit.

Implémentation de Start

Lorsqu’une source multimédia exécute une recherche, elle doit commencer à la première image clé avant l’heure de recherche, afin que le décodeur puisse décoder les exemples pour l’heure de début cible. Le pipeline ignore tous les échantillons décodés qui sont trop tôt.

Si l’heure de début est VT_EMPTY et que l’état précédent a été démarré ou suspendu, la source doit reprendre à sa position actuelle. Dans ce cas, il n’est pas nécessaire de renvoyer la trame clé précédente, car le décodeur aura toujours les données qui ont été envoyées précédemment.

Lors de la validation du paramètre pPresentationDescriptor, la source du média doit case activée uniquement pour les informations dont elle a besoin pour fonctionner correctement. En particulier, le client peut ajouter des attributs privés au descripteur de présentation. La présence d’attributs supplémentaires ne doit pas entraîner l’échec de la méthode Start .

Une fois l’option Démarrer appelée, chaque flux sur la source multimédia doit effectuer l’une des opérations suivantes :

Pour plus d’informations, consultez Écriture d’une source de média personnalisée.

Exemples

L’exemple suivant démarre la lecture à 1 seconde dans la présentation.

PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_I8;
var.hVal.QuadPart = 10000000; // 10^7 = 1 second.

hr = pSource->Start(pPresentationDescriptor, NULL, &var);

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista [applications de bureau | applications UWP]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête mfidl.h
Bibliothèque Mfuuid.lib

Voir aussi

IMFMediaSource

Sources multimédias