Guide pratique pour déterminer les taux pris en charge

Avant de modifier le taux de lecture, une application doit case activée si le taux de lecture est pris en charge par les objets du pipeline. L’interface IMFRateSupport fournit des méthodes permettant d’obtenir les taux avancés et inversés maximums, le taux pris en charge le plus proche d’un taux demandé et le taux le plus lent. Chacune de ces requêtes de débit peut spécifier le sens de lecture et s’il faut utiliser l’amincissement. Le taux de lecture exact est interrogé à l’aide de l’interface IMFRateControl .

Pour plus d’informations sur la modification des taux de lecture, consultez Comment définir le taux de lecture sur la session multimédia.

Pour obtenir des informations générales sur les taux de lecture, consultez À propos du contrôle de débit.

Pour déterminer le taux de lecture actuel

  1. Obtenez le service de contrôle de débit à partir de la session multimédia.

    IMFRateControl *pRateControl = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateControl, 
           (void**) &pRateControl );
    

    Passez un pointeur d’interface IMFMediaSession initialisé dans le paramètre punkObject de MFGetService.

    L’application doit interroger le service de contrôle de débit via la session multimédia. En interne, la session multimédia interroge les objets dans la topologie.

  2. Appelez la méthode IMFRateControl::GetRate pour obtenir le taux de lecture actuel.

    hr = pRateControl->GetRate(&bThin, &rate);
    

    Le paramètre pfThin de GetRate reçoit une valeur BOOL qui indique si le flux est en cours d’amincissement. L’application doit passer la valeur NULL si elle ne souhaite pas interroger la prise en charge de l’amincissement pour le flux. Le paramètre pflRate reçoit le taux de lecture actuel.

Pour déterminer le taux pris en charge le plus proche

  1. Obtenez le service de support tarifaire à partir de la session multimédia.

    IMFRateSupport *pRateSupport = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateSupport, 
           (void**) &pRateSupport );
    

    Passez un pointeur d’interface IMFMediaSession initialisé dans le paramètre punkObject de MFGetService.

  2. Appelez la méthode IMFRateSupport::IsRateSupported pour récupérer le taux pris en charge le plus proche d’un taux de lecture demandé.

    float rateRequested = 4.0;
    float actualRate = 0;
    hr = pRateSupport->IsRateSupported(
           TRUE, 
           rateRequested, 
           &actualRate );
    

    L’exemple demande si un taux de lecture de 4.0 est pris en charge avec l’amincissement. Cela est indiqué en transmettant TRUE dans le paramètre fThind’IsRateSupported. Si ce taux est pris en charge, actualRate contient le taux de lecture de 4.0, et l’appel réussit avec une valeur de retour de S_OK. Si le taux de lecture exact n’est pas pris en charge, le taux pris en charge le plus proche est reçu dans actualRate. Si le taux n’est pas pris en charge et qu’il n’existe pas de taux de lecture le plus proche disponible, l’appel retourne un code d’erreur approprié.

    Ces valeurs peuvent changer en fonction des composants de pipeline chargés. Par conséquent, vous devez interroger à nouveau les valeurs chaque fois que vous chargez une nouvelle topololgie.

    Si le taux de lecture souhaité n’est pas pris en charge, une option consiste à interroger chaque objet de la topologie individuellement pour déterminer si un composant particulier ne prend pas en charge le taux. Vous pourrez peut-être reconstruire la topologie sans ce composant, puis jouer au rythme souhaité. Par exemple, si chaque composant à l’exception du convertisseur audio prend en charge un débit donné, vous pouvez reconstruire la topologie sans la branche audio et lire au débit souhaité sans audio.

Pour déterminer le taux pris en charge le plus lent

  1. Obtenez le service de support tarifaire à partir de la session multimédia.

    IMFRateSupport *pRateSupport = NULL;
    hr = MFGetService(
           pMediaSession, 
           MF_RATE_CONTROL_SERVICE,
           IID_IMFRateSupport, 
           (void**) &pRateSupport );
    

    Passez un pointeur d’interface IMFMediaSession initialisé dans le paramètre punkObject de MFGetService.

  2. Appelez la méthode IMFRateSupport::GetSlowestRate pour récupérer le taux pris en charge le plus lent.

    float slowestRate = 0;
    hr = pRateSupport->GetSlowestRate(
           MFRATE_REVERSE, 
           TRUE, 
           &slowestRate);
    

    Exemples de requêtes pour le taux de lecture inverse le plus lent avec amincissement. Le taux limite inférieur est reçu dans le paramètre slowestRate de GetSlowestRate.

    Si la lecture inversée ou l’amincissement n’est pas pris en charge, l’appel retourne un code d’erreur approprié.

Session multimédia

Contrôle de débit

Recherche, avance rapide et lecture inversée