Utilisation de la source de Sequencer

Cette rubrique explique comment utiliser la source de Sequencer. Il contient les sections suivantes :

Pour obtenir une vue d’ensemble générale de la source de Sequencer, consultez à propos de la source de Sequencer.

Vue d’ensemble

La source Sequencer expose les interfaces suivantes.

Interface Description
IMFMediaSource Expose les fonctionnalités de source multimédia génériques.
IMFSequencerSource Permet à l’application d’ajouter ou de supprimer des topologies.
IMFMediaSourceTopologyProvider Récupère la topologie suivante à partir de la file d’attente de la session multimédia.
IMFMediaSourcePresentationProvider Utilisé par la session multimédia pour terminer les segments. Les applications n’utilisent pas cette interface.
IMFGetService Interroge la source de Sequencer pour les interfaces de service.

Pour lire une séquence de sources multimédias, procédez comme suit :

  1. Pour créer la source de Sequencer, appelez la fonction MFCreateSequencerSource .
  2. Pour chaque segment, créez une topologie de lecture, comme décrit dans création de topologies de lecture. Pour ajouter la topologie à la présentation, appelez IMFSequencerSource :: AppendTopology.
  3. Avant de commencer la lecture, appelez IMFMediaSource :: CreatePresentationDescriptor sur la source de Sequencer. Cette méthode retourne un pointeur vers un descripteur de présentation pour le premier segment. Pour obtenir la topologie associée à ce segment, appelez QueryInterface sur la source de Sequencer pour l’interface IMFMediaSourceTopologyProvider . Transmettez le descripteur de présentation à la méthode IMFMediaSourceTopologyProvider :: GetMediaSourceTopology . Cette méthode retourne un pointeur vers la topologie.
  4. Transmettez la topologie du premier segment à la session multimédia, en appelant la méthode IMFMediaSession :: SetTopology de la session de média.
  5. Démarrez la lecture en appelant IMFMediaSession :: Start.
  6. Lorsque la source de Sequencer est prête à préparer le segment suivant, elle envoie un événement MENewPresentation dont les données d’événement sont un pointeur d’interface IMFPresentationDescriptor . Là encore, récupérez la topologie du segment en appelant GetMediaSourceTopology sur la source de Sequencer et définissez la topologie sur la session de média en appelant SetTopology. Il n’est pas nécessaire de redémarrer la source du média. elle est automatiquement lue jusqu’au segment suivant.
  7. Avant de quitter l’application, arrêtez la source de Sequencer en appelant IMFMediaSource :: Shutdown.

Le code suivant montre comment récupérer la topologie et la définir sur la session multimédia :

// Queues the next topology on the session.

HRESULT CPlaylist::QueueNextSegment(IMFPresentationDescriptor *pPD)
{
    IMFMediaSourceTopologyProvider *pTopoProvider = NULL;
    IMFTopology *pTopology = NULL;

    //Get the topology for the presentation descriptor
    HRESULT hr = m_pSequencerSource->QueryInterface(IID_PPV_ARGS(&pTopoProvider));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pTopoProvider->GetMediaSourceTopology(pPD, &pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    //Set the topology on the media session
    m_pSession->SetTopology(NULL, pTopology);

done:
    SafeRelease(&pTopoProvider);
    SafeRelease(&pTopology);
    return hr;
}

Pour obtenir un exemple de code complet, consultez Code de l’exemple de code source Sequencer.

Ajout de topologies

La source de Sequencer gère deux listes de topologies : la liste d’entrée et la liste de préroll.

La liste d’entrée est une collection de topologies correspondant aux segments de sélection, dans l’ordre dans lequel ils ont été ajoutés par l’application en appelant IMFSequencerSource :: AppendTopology. Cette méthode affecte à chaque topologie un identificateur de segment unique du type MFSequencerElementId. L’identificateur de segment est défini en tant qu’attribut pour tous les nœuds de topologie source. Une application peut obtenir l’identificateur de segment à partir d’un nœud source à l’aide de l’attribut d' _ _ _ ELEMENTID de séquence TOPONODE MF . La liste d’entrée peut avoir des topologies en double si l’application a appelé AppendTopology sur la même topologie plusieurs fois. Toutefois, ils sont identifiés par leurs identificateurs de segment uniques.

La liste de préroll est une collection de topologies de liste d’entrée qui ont été initialisées en vue de la lecture. Cela permet à la session de média de passer à la topologie suivante en toute transparence lorsque la topologie Active se termine. L’application ne peut pas ajouter ou supprimer directement des topologies de la liste de préroll ; elle est générée par la source de Sequencer lorsqu’une topologie de la liste d’entrée est sélectionnée pour la lecture. Ainsi, la source de Sequencer ajoute la topologie suivante à partir de la liste d’entrée à la liste des prérolls. Après cela, la source Sequencer déclenche de manière asynchrone l’événement MENewPresentation et passe le descripteur de présentation pour la topologie de prérestauration en tant que données d’événement. L’application doit écouter cet événement à l’aide de l’interface IMFMediaEventGenerator de la session de média et effectuer la file d’attente de la topologie de prérestauration sur la session multimédia en appelant IMFMediaSession :: SetTopology. Cette opération doit être effectuée avant que la session multimédia ne termine la lecture de la topologie Active. SetTopology informe la session multimédia à propos de la topologie suivante qu’elle doit lire après la fin de la lecture de la topologie Active. Pour garantir un treansition transparent, l’application doit appeler SetTopology avant la fin de la session de média en lisant la topologie précédente. Dans le cas contraire, il y aura un intervalle entre les segments.

L’événement MENewPresentation est déclenché tant qu’il existe une topologie qui suit la topologie Active. Par conséquent, si la liste d’entrée contient une seule topologie, ou si la topologie Active est la dernière de la liste d’entrée, cet événement n’est pas déclenché.

La liste des prérolls est synchronisée avec la liste d’entrée et est actualisée chaque fois qu’une topologie est ajoutée ou supprimée dans la liste d’entrée.

Suppression de topologies

Pour supprimer une topologie de la source de Sequencer, une application doit appeler la méthode IMFSequencerSource ::D eletetopology et spécifier l’identificateur de segment.

Avant d’appeler DeleteTopology, l’application doit s’assurer que la session multimédia n’utilise pas la topologie que l’application souhaite supprimer. Pour ce faire, les deux conditions suivantes doivent se produire avant que l’application appelle DeleteTopology:

  • L’événement MESessionTopologyStatus avec MF _ TOPOSTATUS _ terminé est reçu pour la topologie pour s’assurer que la lecture de la session multimédia est terminée.

  • MESessionTopologyStatus avec MF _ TOPOSTATUS _ Started _ source est reçu pour la topologie suivante afin de s’assurer que la session multimédia a démarré la prochaine topologie, MESessionEnded événement est reçu pour s’assurer que la session multimédia est terminée avec la dernière topologie de la source de Sequencer.

Si le segment en cours de suppression est la topologie Active, la lecture est arrêtée et la source Sequencer déclenche l’événement MEEndOfPresentationSegment . Si la topologie Active est également la dernière topologie, l’événement MEEndOfPresentation est déclenché.

Omission à un segment

Une application peut passer à un segment particulier de la séquence en démarrant la session multimédia avec un décalage de segment, comme suit :

  1. Appelez la fonction MFCreateSequencerSegmentOffset pour créer le décalage du segment. Spécifiez l’identificateur du segment dans le paramètre dwId . (L’identificateur a été retourné par la méthode IMFSequencerSource :: AppendTopology lorsque vous avez ajouté la topologie à la source du séquenceur pour la première fois.) Le paramètre hnsOffset spécifie un décalage horaire par rapport au début du segment. La lecture démarrera à ce moment-là. Pour le paramètre pvarSegmentOffset , transmettez l’adresse d’un PROPVARIANT vide. Quand la fonction retourne, ce PROPVARIANT contient le décalage de segment.

  2. Appelez la méthode IMFMediaSession :: Start sur la session multimédia. Pour le paramètre pguidTimeFormat , utilisez la valeur GUID de _ décalage de segment de format de temps MF _ _ _ . Cette valeur indique la recherche par décalage de segment. Pour le paramètre pvarStartPosition , transmettez l’adresse du PROPVARIANT créé à l’étape précédente.

L’exemple de code suivant montre comment passer au début d’un segment spécifié dans une séquence.

// Skips to the specified segment in the sequencer source

HRESULT CPlaylist::SkipTo(DWORD index)
{
    if (index >= m_count)
    {
        return E_INVALIDARG;
    }

    MFSequencerElementId ID = m_segments[index].SegmentID;

    PROPVARIANT var;

    HRESULT hr = MFCreateSequencerSegmentOffset(ID, NULL, &var);
    
    if (SUCCEEDED(hr))
    {
        hr = m_pSession->Start(&MF_TIME_FORMAT_SEGMENT_OFFSET, &var);
        PropVariantClear(&var);
    }
    return hr;
}

Lorsque l’application recherche sur des segments, elle reçoit plusieurs événements, car la source de Sequencer termine le segment actuel et prépare la lecture du nouveau segment. Comme ces événements sont reçus de manière asynchrone, il est difficile de prédire la séquence exacte d’événements. Ces événements sont les suivants :

  • La source Sequencer envoie un événement MENewPresentation pour le nouveau segment vers lequel la session multimédia est ignorée.

  • Lorsque la source de Sequencer termine le segment actif, elle envoie l’événement MEEndOfPresentationSegment .

  • La source de Sequencer annule ensuite la topologie de prérestauration. Cela génère les événements suivants pour la topologie annulée :

  • Ensuite, la source Sequencer envoie des événements pour le nouveau segment, y compris divers événements MESessionTopologyStatus .

  • Si le nouveau segment n’est pas le dernier dans la liste, la source de Sequencer actualise la liste des préroll et déclenche un autre MENewPresentation pour la nouvelle topologie de préroll. Pour plus d’informations sur les topologies dans la liste des préroll, consultez à propos de la source de Sequencer.

Vous trouverez plus de détails sur les événements envoyés par la source de Sequencer dans la rubrique événementsde la source de Sequencer.

Comment créer une sélection

Source de Sequencer