Реализация контроля скорости
В этом разделе описывается, как пользовательские объекты конвейера могут поддерживать переменные частоты воспроизведения, включая обратное воспроизведение. Сведения об использовании управления скоростью из приложения см. в разделе "Контроль скорости".
Этот раздел состоит из следующих подразделов.
Если вы разрабатываете объект платформы Microsoft Media Foundation (источник мультимедиа, преобразование или приемник мультимедиа), может потребоваться поддержка переменных скоростей воспроизведения. Для этого реализуйте следующие интерфейсы:
- Реализуйте интерфейс IMFGetService.
- Поддержка службы MF_RATE_CONTROL_SERVICE. (См. раздел Интерфейсы служб.)
- Реализуйте интерфейс IMFRateSupport, который получает поддерживаемые объектом скорости воспроизведения.
- Реализуйте интерфейс 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::ProcessInput.
Сессия мультимедиа пропускает delta кадры и заменяет их событиями 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. При изменении скорости воспроизведения презентационные часы вызывают метод
Связанные темы