Guide pratique pour déterminer les taux pris en charge
Avant de modifier le taux de lecture, une application doit vérifier 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 d’avance et d’inverse maximal, 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 la direction 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
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 );
Transmettez 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 par le biais de la session multimédia. En interne, la session multimédia interroge les objets de la topologie.
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 actuellement mince. L’application doit passer NULL s’il ne souhaite pas interroger la prise en charge de l’amincissement du flux. Le paramètre pflRate reçoit le taux de lecture actuel.
Pour déterminer le taux pris en charge le plus proche
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 );
Transmettez un pointeur d’interface IMFMediaSession initialisé dans le paramètre punkObject de MFGetService.
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 interroge si un taux de lecture de 4,0 est pris en charge avec l’amincissement. Cela est indiqué en passant TRUE dans le paramètre fThin de 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’y a 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 topologie.
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 pouvez peut-être reconstruire la topologie sans ce composant, puis jouer à la vitesse souhaitée. 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 à la vitesse souhaitée sans audio.
Pour déterminer le taux le plus lent pris en charge
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 );
Transmettez un pointeur d’interface IMFMediaSession initialisé dans le paramètre punkObject de MFGetService.
Appelez la méthode IMFRateSupport ::GetSlowestRate pour récupérer le taux le plus lent pris en charge.
float slowestRate = 0; hr = pRateSupport->GetSlowestRate( MFRATE_REVERSE, TRUE, &slowestRate);
L’exemple de requête pour le taux de lecture inverse le plus lent avec l’amincissement. Le taux de limite inférieur est reçu dans le paramètre LentRate de GetSlowestRate.
Si la lecture inversée ou l’amincissement n’est pas pris en charge, l’appel retourne un code d’erreur approprié.
Rubriques connexes