Реализация управления скоростью

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

Этот раздел состоит из следующих подразделов.

При написании объекта конвейера Microsoft Media Foundation (источника мультимедиа, преобразования или приемника мультимедиа) может потребоваться поддержка переменной скорости воспроизведения. Для этого реализуйте следующие интерфейсы:

  1. Реализуйте интерфейс IMFGetService .
  2. Поддержка службы MF_RATE_CONTROL_SERVICE . (См. раздел Интерфейсы служб.)
  3. Реализуйте интерфейс IMFRateSupport , который получает скорость воспроизведения, поддерживаемую объектом .
  4. Реализуйте интерфейс IMFRateControl , который получает или задает скорость воспроизведения.

Источники мультимедиа

Если источник средств массовой информации поддерживает контроль ставок, он должен реализовать как IMFRateSupport , так и IMFRateControl. В противном случае сеанс мультимедиа сообщает, что минимальная и максимальная скорость воспроизведения составляет 1,0, независимо от того, какие другие компоненты находятся в конвейере.

Скорость воспроизведения не влияет на время представления примеров, поэтому источник мультимедиа не должен настраивать свои метки времени. Вместо этого часы презентации работают быстрее или медленнее. Для обратного воспроизведения источник доставляет образцы в обратном порядке с уменьшением меток времени.

Параметр fThin метода IMFRateControl::SetRate указывает, должен ли источник мультимедиа истончать содержимое. Истончение применяется в основном к видеопотокам. В режиме с истонченным источник удаляет разностные кадры и доставляет только ключевые кадры. При очень высокой скорости воспроизведения источник может пропустить некоторые ключевые кадры (например, доставить каждый другой ключевой кадр).

Источнику не нужно удалять звуковые образцы в режиме истонченного. Однако при очень высокой скорости воспроизведения источник может не иметь возможности быстро считывать данные для заполнения примеров запросов конвейера. В этом случае источнику может потребоваться удалить некоторые звуковые данные. Если это так, он должен попытаться доставить звуковые образцы, близкие по времени к примерам видео (при условии, что источник имеет оба типа потока).

При переходе потока из режима с тонким и неистонченным потоком отправляется событие MEStreamThinMode .

Когда источник мультимедиа завершает вызов SetRate, он отправляет событие MESourceRateChanged .

Во время обратного воспроизведения:

  • Источник мультимедиа доставляет образцы в обратном порядке без корректировки меток времени.
  • Метки времени в потоке должны монотонно уменьшаться.
  • Начало содержимого считается концом потока. После того как каждый поток мультимедиа доставляет первый пример в потоке (то есть время презентации = 0), он отправляет событие MEEndOfStream .

Преобразования Media Foundation

Как правило, преобразование Media Foundation (MFT) не нуждается в явной поддержке управления скоростью, если только MFT не реализует неистонченное обратное воспроизведение.

Если MFT не реализует интерфейс IMFRateSupport , сеанс мультимедиа предполагает следующее:

  • MFT поддерживает частоту воспроизведения с помощью алгоритмов для прямого воспроизведения, как в тонком, так и в неистонченном режиме.
  • MFT поддерживает истонченное обратное воспроизведение, но не поддерживает обратное воспроизведение без изменения.

Если любое из этих условий не соответствует действительности, MFT должно реализовать IMFRateSupport и IMFRateControl.

Обратное воспроизведение

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

Если MFT не предоставляет интерфейс IMFRateSupport , сеанс мультимедиа использует истончение для обратного воспроизведения следующим образом:

  • Пресс-сессия отправляет ключевые кадры в MFT обычным способом, вызывая IMFTransform::P rocessInput.

  • Сеанс мультимедиа удаляет разностные кадры и заменяет их событиями MEStreamTick .

  • Между каждой выборкой сеанс мультимедиа очищает MFT, чтобы избежать ошибок, вызванных тем, что метки времени уменьшаются.

Пример считается ключевым кадром, если для атрибута MFSampleExtension_CleanPoint задано значение TRUE, и считается разностным кадром, если этот атрибут имеет значение FALSE или не задан.

Если MFT реализует imfRateSupport, сеанс мультимедиа использует этот интерфейс, чтобы определить, поддерживает ли MFT обратное воспроизведение без изменения. Если MFT поддерживает обратное воспроизведение без изменения, сеанс мультимедиа доставляет все образцы в обратном порядке, не сбрасывая образцы и не очищая MFT.

Если MFT поддерживает неистонченное обратное воспроизведение, он должен реализовать интерфейс IMFRateControl . Сеанс мультимедиа будет использовать этот интерфейс для уведомления MFT об обратном воспроизведении. На этом этапе MFT должен быть подготовлен к уменьшению меток времени и для получения разностных кадров в обратном порядке. Декодеру обычно требуется буферировать образцы, пока он не получит всю группу изображений (GOP), а затем декодировать весь GOP и выводить декодированные кадры в правильном (обратном) порядке.

Приемники мультимедиа

Если приемник мультимедиа не является скоростным, сеанс мультимедиа предполагает, что приемник мультимедиа может обрабатывать любую скорость воспроизведения. Приемнику средств массовой информации не нужно реализовывать IMFRateSupport. (Приемник мультимедиа без скорости возвращает флаг MEDIASINK_RATELESS из метода IMFMediaSink::GetCharacteristics .)

В противном случае приемник мультимедиа должен реализовать imfRateSupport , если он может обрабатывать скорость воспроизведения, отличаемую от 1.0.

Приемники мультимедиа не должны реализовывать IMFRateControl. При изменении скорости воспроизведения часы презентации вызывают метод IMFClockStateSink::OnClockSetRate приемника мультимедиа.

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

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