Partager via


Utilisation de la source Sequencer

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

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

Vue d’ensemble

La source Sequencer expose les interfaces suivantes.

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

 

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

  1. Pour créer la source 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 du séquenceur. 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 Sequencer pour l’interface IMFMediaSourceTopologyProvider. Passez le descripteur de présentation à la méthode IMFMediaSourceTopologyProvider::GetMediaSourceTopology. Cette méthode retourne un pointeur vers la topologie.
  4. Transmettez la topologie pour le premier segment à la session multimédia en appelant la méthode IMFMediaSession::SetTopology de la session multimédia.
  5. Démarrez la lecture en appelant IMFMediaSession::Start.
  6. Lorsque la source Sequencer est prête à préinscrire le segment suivant, elle envoie un événement MENewPresentation dont les données d’événement sont un pointeur d’interface IMFPresentationDescriptor. Là encore, obtenez la topologie pour le segment en appelant GetMediaSourceTopology sur la source du séquenceur et définissez la topologie sur la session multimédia en appelant SetTopology. Il n’est pas nécessaire de redémarrer la source multimédia. Elle se joue automatiquement jusqu’au segment suivant.
  7. Avant la fermeture de l’application, arrêtez la source Sequencer en appelant IMFMediaSource::Shutdown.

Le code suivant montre comment obtenir 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 l’exemple de code source Sequencer.

Ajout de topologies

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

La liste d’entrée est une collection de topologies correspondant aux segments de playlist, dans l’ordre où elles ont été ajoutées 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 MF_TOPONODE_SEQUENCE_ELEMENTID. La liste d’entrée peut avoir des topologies en double si l’application a appelé AppendTopology plusieurs fois sur la même topologie. Toutefois, elles sont identifiées par leurs identificateurs de segment uniques.

La liste de prerolls est une collection de topologies de liste d’entrée qui ont été initialisées en préparation de la lecture. Cela permet à la session multimédia de passer à la topologie suivante de manière fluide lorsque la topologie active se termine. L’application ne peut pas ajouter ou supprimer directement des topologies de la liste de prerolls. Elle est générée par la source Sequencer lorsqu’une topologie de la liste d’entrée est sélectionnée pour la lecture. Cela incite la source Sequencer à ajouter la topologie suivante de la liste d’entrée à la liste de prerolls. Après cela, la source Sequencer déclenche de façon asynchrone l’événement MENewPresentation et transmet le descripteur de présentation pour la topologie de prerolls en tant que données d’événement. L’application doit écouter cet événement à l’aide de l’interface IMFMediaEventGenerator de la session multimédia et doit mettre en file d’attente la topologie de prerolls sur la session multimédia en appelant IMFMediaSession::SetTopology. Cette opération doit être effectuée avant que la session multimédia termine la lecture de la topologie active. SetTopology informe la session multimédia sur la topologie suivante qu’elle doit lire lorsque la lecture de la topologie active est terminée. Pour garantir une transition fluide, l’application doit appeler SetTopology avant que la session multimédia ne termine la lecture de la topologie précédente. Sinon, il y aura un écart entre les segments.

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

La liste de prerolls est synchronisée avec la liste d’entrée et est actualisée chaque fois qu’une topologie est ajoutée ou supprimée de la liste d’entrée.

Suppression de topologies

Pour supprimer une topologie de la source Sequencer, une application doit appeler la méthode IMFSequencerSource::DeleteTopology 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 doivent se produire avant que l’application appelle DeleteTopology :

  • L’événement MESessionTopologyStatus avec MF_TOPOSTATUS_ENDED est reçu pour la topologie afin de s’assurer que la session multimédia a terminé la lecture.

  • MESessionTopologyStatus avec MF_TOPOSTATUS_STARTED_SOURCE est reçu pour la topologie suivante afin de s’assurer que la session multimédia a commencé à lire la topologie suivante. L’événement MESessionEnded est reçu pour s’assurer que la session multimédia est effectuée avec la dernière topologie dans la source du séquenceur.

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

Passer à un segment

Une application peut passer à un segment particulier dans la séquence en démarrant la session multimédia avec un décalage de segment de cette manière :

  1. Appelez la fonction MFCreateSequencerSegmentOffset pour créer le décalage de 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 Sequencer.) Le paramètre hnsOffset spécifie un décalage de temps, par rapport au début du segment. La lecture démarre à ce stade. Pour le paramètre pvarSegmentOffset, passez l’adresse d’un PROPVARIANT vide. Lorsque la fonction est retournée, 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 MF_TIME_FORMAT_SEGMENT_OFFSET. Cette valeur indique la recherche par décalage de segment. Pour le paramètre pvarStartPosition, passez 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 plusieurs segments, celle-ci reçoit plusieurs événements à mesure que la source du séquenceur met fin au segment actuel et se prépare à lire le nouveau segment. Étant donné que ces événements sont reçus de façon 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 auquel la session multimédia est ignorée.

  • Lorsque la source Sequencer met fin au segment actif, elle envoie l’événement MEEndOfPresentationSegment.

  • La source Sequencer annule ensuite la topologie de prerolls. Cela entraîne les événements suivants pour la topologie annulée :

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

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

Vous trouverez plus d’informations sur les événements envoyés par la source Sequencer dans la rubrique Événements de source Sequencer.

Guide pratique pour créer une playlist

Source Sequencer