Поделиться через


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

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

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

Общие сведения о скоростях воспроизведения см. в разделе "О контроле скорости".

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

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

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

    Передайте инициализированный указатель интерфейса IMFMediaSession в параметре punkObject для MFGetService.

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

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

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

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

Определение ближайшей поддерживаемой частоты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Запрос примеров для самой медленной скорости обратного воспроизведения с уменьшением количества данных. Нижний предел скорости получается в параметре getSlowestRate.

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

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

Контроль скорости

Поиск, Быстрая прокрутка и обратный воспроизведение