Определение поддерживаемых ставок

Перед изменением скорости воспроизведения приложение должно проверка, поддерживается ли скорость воспроизведения объектами в конвейере. Интерфейс IMFRateSupport предоставляет методы для получения максимальной скорости вперед и обратного, поддерживаемой скорости, ближайшей к запрошенной ставке, и самой медленной скорости. Каждый из этих запросов скорости может указать направление воспроизведения и использовать ли истончение. Точная скорость воспроизведения запрашивается с помощью интерфейса IMFRateControl .

Сведения об изменении скорости воспроизведения см. в разделе Настройка скорости воспроизведения в сеансе мультимедиа.

Общие сведения о скорости воспроизведения см. в разделе Сведения об управлении скоростью.

Определение текущей скорости воспроизведения

  1. Получите службу управления скоростью из сеанса мультимедиа.

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

    Передайте указатель инициализированного интерфейса IMFMediaSession в параметр punkObjectMFGetService.

    Приложение должно запрашивать службу управления скоростью через сеанс мультимедиа. Внутренний сеанс мультимедиа запрашивает объекты в топологии.

  2. Вызовите метод IMFRateControl::GetRate, чтобы получить текущую скорость воспроизведения.

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

    Параметр pfThingetRate получает значение BOOL , указывающее, является ли поток истонченным в данный момент. Приложение должно передать значение NULL , если оно не хочет запрашивать поддержку истончения для потока. Параметр pflRate получает текущую скорость воспроизведения.

Определение ближайшего поддерживаемого тарифа

  1. Получите службу поддержки по тарифам из сеанса мультимедиа.

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

    Передайте указатель инициализированного интерфейса IMFMediaSession в параметр punkObjectMFGetService.

  2. Вызовите метод IMFRateSupport::IsRateSupported , чтобы получить поддерживаемую скорость, ближайшую к запрошенной скорости воспроизведения.

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

    В примере запрашивается, поддерживается ли скорость воспроизведения 4.0 с истончением. На это указывает передача TRUE в параметре fThinisRateSupported. Если эта скорость поддерживается, функция actualRate содержит скорость воспроизведения 4,0, а вызов завершается успешно с возвращаемым значением S_OK. Если точная скорость воспроизведения не поддерживается, ближайший поддерживаемый показатель будет получен в параметре actualRate. Если скорость не поддерживается и ближайшей скорости воспроизведения нет, вызов возвращает соответствующий код ошибки.

    Эти значения могут изменяться в зависимости от того, какие компоненты конвейера загружаются. Поэтому при загрузке нового topololgy значения следует запрашивать снова.

    Если требуемая скорость воспроизведения не поддерживается, один из вариантов — запросить каждый объект в топологии по отдельности, чтобы узнать, не поддерживает ли определенный компонент скорость. Возможно, вы сможете перестроить топологию без этого компонента, а затем воспроизвести с требуемой скоростью. Например, если каждый компонент, кроме отрисовщика звука, поддерживает заданную скорость, можно перестроить топологию без аудиоветвления и воспроизвести с нужной скоростью без звука.

Определение самой медленной поддерживаемой скорости

  1. Получите службу поддержки по тарифам из сеанса мультимедиа.

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

    Передайте указатель инициализированного интерфейса IMFMediaSession в параметр punkObjectMFGetService.

  2. Вызовите метод IMFRateSupport::GetSlowestRate, чтобы получить самую низкую поддерживаемую скорость.

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

    В примере запрашивается самая низкая скорость обратного воспроизведения с истончением. Нижняя граница частоты получается в параметре slowestRategetSlowestRate.

    Если обратное воспроизведение или истончение не поддерживается, вызов возвращает соответствующий код ошибки.

Сеанс мультимедиа

Управление скоростью

Поиск, перемыка вперед и обратное воспроизведение