如何判斷支援的速率
變更播放速率之前,應用程式應該檢查管線中的物件是否支援播放速率。 IMFRateSupport 介面提供方法來取得最高向前和反向利率、最接近所要求比率的支援率,以及最慢的速率。 每個速率查詢都可以指定播放方向,以及是否要使用精簡。 使用IMFRateControl介面來查詢確切的播放速率。
如需變更播放速率的資訊,請參閱 如何在媒體會話上設定播放速率。
如需播放速率的一般資訊,請參閱 關於速率控制。
判斷目前的播放速率
從媒體會話取得速率控制服務。
IMFRateControl *pRateControl = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateControl, (void**) &pRateControl );
在 MFGetService 的 punkObject 參數中傳遞初始化的 IMFMediaSession 介面指標。
應用程式必須透過媒體會話查詢速率控制服務。 在內部,媒體會話會查詢拓撲中的物件。
呼叫 IMFRateControl::GetRate 方法來取得目前的播放速率。
hr = pRateControl->GetRate(&bThin, &rate);
GetRate 的 pfThin 參數會收到 BOOL 值,指出數據流目前是否正在精簡。 如果應用程式不想查詢數據流的精簡支援,則必須傳遞 NULL 。 pflRate 參數會接收目前的播放速率。
判斷最接近支援率
從媒體會話取得速率支持服務。
IMFRateSupport *pRateSupport = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateSupport, (void**) &pRateSupport );
在 MFGetService 的 punkObject 參數中傳遞初始化的 IMFMediaSession 介面指標。
呼叫IMFRateSupport::IsRateSupported方法來擷取最接近所要求播放速率的支援速率。
float rateRequested = 4.0; float actualRate = 0; hr = pRateSupport->IsRateSupported( TRUE, rateRequested, &actualRate );
此範例會查詢 4.0 的播放速率是否支援精簡。 這是藉由在 IsRateSupported 的 fThin 參數中傳遞 TRUE 來表示。 如果支援此速率, actualRate 會包含 4.0 的播放速率,而呼叫會成功且傳回值為 S_OK。 如果不支援確切的播放速率,則會在 actualRate 中收到最接近的支援速率。 如果不支援速率,而且沒有可用的最接近播放速率,則呼叫會傳回適當的錯誤碼。
這些值可能會根據載入管線元件而變更。 因此,每當載入新的拓撲時,您應該再次查詢值。
如果不支援所需的播放速率,有一個選項是個別查詢拓撲中的每個物件,以找出特定元件是否不支援速率。 您可以重建不含此元件的拓撲,然後以所需的速率播放。 例如,如果音訊轉譯器以外的每個元件都支援指定的速率,您可以重建不含音訊分支的拓撲,並以所需的速率播放沒有音訊。
判斷支援率最慢
從媒體會話取得速率支持服務。
IMFRateSupport *pRateSupport = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateSupport, (void**) &pRateSupport );
在 MFGetService 的 punkObject 參數中傳遞初始化的 IMFMediaSession 介面指標。
呼叫IMFRateSupport:GetSlowestRate方法來擷取最慢的支援率。
float slowestRate = 0; hr = pRateSupport->GetSlowestRate( MFRATE_REVERSE, TRUE, &slowestRate);
此範例會使用精簡查詢最慢的反向播放速率。 下限速率會以 GetSlowestRate 的 slowestRate 參數接收。
如果不支援反向播放或精簡,呼叫會傳回適當的錯誤碼。
相關主題