Partager via


Descripteurs de présentation

Une présentation est un ensemble de flux multimédias associés qui partagent une heure de présentation commune. Par exemple, une présentation peut être constituée des flux audio et vidéo d’un film. Un descripteur de présentation est un objet qui contient la description d’une présentation particulière. Les descripteurs de présentation sont utilisés pour configurer des sources multimédias et certains récepteurs multimédias.

Chaque descripteur de présentation contient une liste d’un ou plusieurs descripteurs de flux . Celles-ci décrivent les flux de la présentation. Les flux peuvent être sélectionnés ou désélectionnés. Seuls les flux sélectionnés produisent des données. Les flux désélectionnés ne sont pas actifs et ne produisent aucune donnée. Chaque descripteur de flux a un gestionnaire de type de média , qui est utilisé pour modifier le type de média du flux ou obtenir le type de média actuel du flux. (Pour plus d’informations sur les types de supports, consultez types de supports.)

Le tableau suivant présente les interfaces principales exposées par chacun de ces objets.

Objet Interface
Descripteur de présentation IMFPresentationDescriptor
Descripteur de flux IMFStreamDescriptor
Gestionnaire de types de supports IMFMediaTypeHandler

 

Présentations de sources multimédias

Chaque source multimédia fournit un descripteur de présentation qui décrit la configuration par défaut de la source. Dans la configuration par défaut, au moins un flux est sélectionné et chaque flux sélectionné a un type de média. Pour obtenir le descripteur de présentation, appelez IMFMediaSource ::CreatePresentationDescriptor. La méthode retourne un pointeur IMFPresentationDescriptor.

Vous pouvez modifier le descripteur de présentation de la source pour sélectionner un autre ensemble de flux. Ne modifiez pas le descripteur de présentation, sauf si la source multimédia est arrêtée. Les modifications sont appliquées lorsque vous appelez IMFMediaSource ::Start pour démarrer la source.

Pour obtenir le nombre de flux, appelez IMFPresentationDescriptor ::GetStreamDescriptorCount. Pour obtenir le descripteur de flux pour un flux, appelez IMFPresentationDescriptor ::GetStreamDescriptorByIndex et passez l’index du flux. Les flux sont indexés à partir de zéro. La méthode GetStreamDescriptorByIndex retourne un pointeur IMFStreamDescriptor. Elle retourne également un indicateur booléen indiquant si le flux est sélectionné. Si le flux est sélectionné, la source multimédia produit des données pour ce flux. Sinon, la source ne produit aucune donnée pour ce flux. Pour sélectionner un flux, appelez IMFPresentationDescriptor ::SelectStream avec l’index du flux. Pour désélectionner un flux, appelez IMFPresentationDescriptor ::D eselectStream.

Le code suivant montre comment obtenir le descripteur de présentation à partir d’une source multimédia et énumérer les flux.

HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL  fSelected = FALSE;

IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;

hr = pSource->CreatePresentationDescriptor(&pPresentation);

if (SUCCEEDED(hr))
{
    hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}

if (SUCCEEDED(hr))
{
    for (DWORD iStream = 0; iStream < cStreams; iStream++)
    {
        hr = pPresentation->GetStreamDescriptorByIndex(
            iStream, &fSelected, &pStreamDesc);

        if (FAILED(hr))
        {
            break;
        }

        /*  Use the stream descriptor. (Not shown.) */

        SAFE_RELEASE(pStreamDesc);
    }
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);

Gestionnaires de types de supports

Pour modifier le type de média du flux ou obtenir le type de média actuel du flux, utilisez le gestionnaire de type de média du descripteur de flux. Appelez IMFStreamDescriptor ::GetMediaTypeHandler pour obtenir le gestionnaire de type multimédia. Cette méthode retourne un pointeur IMFMediaTypeHandler.

Si vous souhaitez simplement savoir quel type de données se trouve dans le flux, tel que l’audio ou la vidéo, appelez IMFMediaTypeHandler ::GetMajorType. Cette méthode retourne le GUID du type de média principal. Par exemple, une application de lecture connecte généralement un flux audio au renderer audio et un flux vidéo au renderer vidéo. Si vous utilisez la session multimédia ou le chargeur de topologie pour générer une topologie, le GUID de type principal peut être les seules informations de format dont vous avez besoin.

Si votre application a besoin d’informations plus détaillées sur le format actuel, appelez IMFMediaTypeHandler ::GetCurrentMediaType. Cette méthode retourne un pointeur vers l’interface IMFMediaType du type de média. Utilisez cette interface pour obtenir les détails du format.

Le gestionnaire de types de média contient également une liste de types de supports pris en charge pour le flux. Pour obtenir la taille de la liste, appelez IMFMediaTypeHandler ::GetMediaTypeCount. Pour obtenir un type de média dans la liste, appelez IMFMediaTypeHandler ::GetMediaTypeByIndex avec l’index du type de média. Les types de supports sont retournés dans l’ordre approximatif des préférences. Par exemple, pour les formats audio, les taux d’échantillonnage plus élevés sont préférés aux taux d’échantillonnage inférieurs. Toutefois, il n’existe aucune règle définitive qui régit l’ordre, donc vous devez le traiter simplement comme une directive.

La liste des types pris en charge peut ne pas contenir chaque type de média possible pris en charge par le flux. Pour tester si un type de média particulier est pris en charge, appelez IMFMediaTypeHandler ::IsMediaTypeSupported. Pour définir le type de média, appelez IMFMediaTypeHandler ::SetCurrentMediaType. Si la méthode réussit, le flux contient des données conformes au format spécifié. La méthode SetCurrentMediaType ne modifie pas la liste des types préférés.

Le code suivant montre comment obtenir le gestionnaire de types de média, énumérer les types de supports préférés et définir le type de média. Cet exemple suppose que l’application a un algorithme, non illustré ici, pour sélectionner le type de média. Les spécificités dépendent considérablement de votre application.

HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL  bTypeOK = FALSE;

IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;

hr = pStreamDesc->GetMediaTypeHandler(&pHandler);

if (SUCCEEDED(hr))
{
    hr = pHandler->GetMediaTypeCount(&cTypes);
}

if (SUCCEEDED(hr))
{
    for (DWORD iType = 0; iType < cTypes; iType++)
    {   
        hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);

        if (FAILED(hr))
        {
            break;
        }

        /* Examine the media type. (Not shown.)  */

        /* If this media type is acceptable, set the media type. */

        if (bTypeOK)
        {
            hr = pHandler->SetCurrentMediaType(pMediaType);
            break;
        }

        SAFE_RELEASE(pMediaType);
    }
}    

SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);

sources multimédias

API Media Foundation Platform