Часы презентации

Часы презентации — это объект, который создает время для презентации. Время, сообщаемое часами презентации, называется временем презентации. Все потоки в презентации синхронизируются с временем презентации. Часы презентации предоставляют следующие интерфейсы.

Интерфейс Описание
МВФPresentationClock Основной интерфейс для использования часов презентации.
IMFRateControl Управляет скоростью часов.
IMFTimer Предоставляет обратный вызов таймера.
МВФShutdown Завершает работу часов презентации.

 

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

Если вы используете сеанс мультимедиа для воспроизведения, сеанс мультимедиа обрабатывает все сведения о создании часов презентации, выборе источника времени и уведомлении приемников мультимедиа. Приложение может использовать часы презентации для получения текущего времени презентации во время воспроизведения, но в противном случае не вызовет никаких методов в часах презентации.

Часы и состояния часов

Чтобы получить последнее время с часов презентации, вызовите IMFPresentationClock::GetTime. Время часов всегда находится в 100-наносекундных единицах, поэтому одна секунда составляет 10 000 000 (10^7) тактов. Это соответствует частоте 10 МГц.

Часы презентации имеют три состояния: "Выполняется", "Приостановлено" и "Остановлено".

  • Чтобы запустить часы, вызовите IMFPresentationClock::Start. Метод Start указывает время начала часов. Пока часы выполняются, время часов увеличивается с начала по текущей частоте.
  • Чтобы приостановить часы, вызовите IMFPresentationClock::P ause. Пока часы приостановлены, время не перемещается, а GetTime возвращает время, в течение которого часы были приостановлены.
  • Чтобы остановить часы, вызовите IMFPresentationClock::Stop. Когда часы остановлены, время часов не перемещается, а GetTime возвращает ноль.

По умолчанию часы перемещаются по скорости 1,0, то есть 1 тактов на 100 наносекунд. Чтобы изменить скорость продвижения часов, запросите часы презентации для интерфейса МВФRateControl и вызовите IMFRateControl::SetRate.

Объекты могут получать уведомления об изменениях состояния (включая изменения скорости) из часов презентации. Чтобы получать уведомления, реализуйте интерфейс IMFClockStateSink и вызовИТЕ IMFPresentationClock::AddClockStateSink на часы презентации. Перед завершением работы вызовите IMFPresentationClock::RemoveClockStateSink , чтобы отменить регистрацию объекта. Приемники мультимедиа используют этот механизм для получения уведомлений от часов.

Время презентации

Приемник мультимедиа пытается запланировать каждый образец таким образом, чтобы он отображался в нужное время или как можно ближе к правильному времени. Применяются следующие определения:

  • Время презентации. Время отрисовки образца. Время задается в единицах 100 наносекунд.
  • Время мультимедиа. Время относительно начала содержимого. Например, если видеофайл длиной 10 секунд, то на полпути к файлу используется время мультимедиа в 5 секунд.
  • Метка времени. Время, отмеченное в образце мультимедиа. Чтобы получить метку времени, вызовите IMFSample::GetSampleTime. Когда источник мультимедиа создает образец, он задает метку времени, равную времени мультимедиа. Сеанс мультимедиа преобразует метку времени в время презентации.

По умолчанию время мультимедиа и время презентации одинаковы, например, если видеокадр отображается 5 секунд в исходном файле, время мультимедиа и время презентации — 5 секунд. Если вы используете источник Sequencer, модель времени несколько сложнее, чтобы обеспечить плавные переходы между сегментами. Дополнительные сведения о модели времени источника последовательности см. в разделе "Время представления последовательности".

Источник мультимедиа всегда задает метку времени, равную времени мультимедиа. Если время презентации не соответствует времени мультимедиа, сеанс мультимедиа преобразует метки времени в примерах мультимедиа. К тому времени, когда приемник получает образец, метка времени образца была преобразована в время презентации. Приемник планирует выборку с текущим временем презентации. (Приемники без скоростей являются исключением, так как они игнорируют часы презентации.)

Если приложение стремится к новой позиции, сеанс мультимедиа перезапускает часы презентации в указанное время поиска. Например, если приложение стремится к 5-секундной позиции в файле, сеанс мультимедиа запускает часы в 5 секунд. Источник мультимедиа может доставлять образцы с немного более ранней меткой времени, если время поиска не попадает на границу ключевого кадра. Это необходимо, чтобы декодеры могли декодировать все кадры. Сеанс мультимедиа удаляет или обрезает образцы, прежде чем они достигают приемников мультимедиа, чтобы соответствовать запрошенной времени поиска. Например, если время поиска равно 5 секундам, первый пример звука может начинаться в 4,5 секунды. Сеанс мультимедиа обрезает первые 0,5 секунды от первого декодированного аудио примера.

Создание часов презентации

Чтобы создать часы презентации, вызовите MFCreatePresentationClock. Чтобы завершить работу часов, запросите интерфейс МВФShutdown и вызовИТЕ IMFShutdown::Shutdown. Вызывающий объект MFCreatePresentationClock отвечает за вызов завершения работы; в большинстве случаев это сеанс мультимедиа, а не приложение.

Источники времени презентации

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

diagram showing the relation between the presentation clock and the presentation time source

При первом создании часов презентации у него нет источника времени. Чтобы задать источник времени, вызовите IMFPresentationClock::SetTimeSource с указателем на интерфейс IMFPresentationTimeSource источника времени. Источник времени поддерживает те же состояния, что и часы презентации (выполнение, приостановка и остановка), и должен реализовывать интерфейс IMFClockStateSink . Часы презентации используют этот интерфейс для уведомления источника времени об изменении состояния. Таким образом, источник времени предоставляет тактовые часы, но часы презентации инициируют изменения состояния часов.

Некоторые приемники мультимедиа имеют доступ к точным часам и, следовательно, предоставляют интерфейс IMFPresentationTimeSource . В частности, отрисовщик звука может использовать частоту звуковой карты в качестве часов. При воспроизведении звука средство отрисовки звука может выступать в качестве источника времени, чтобы видео синхронизировалось со скоростью воспроизведения звука. Обычно это дает лучшие результаты, чем попытки сопоставить звук с внешними часами.

Media Foundation также предоставляет источник времени презентации на основе системных часов. Чтобы создать этот объект, вызовите MFCreateSystemTimeSource. Системный источник времени можно использовать, если приемники мультимедиа не предоставляют источник времени.

Как правило, приемник мультимедиа должен использовать часы презентации, предоставленные ему, независимо от того, какой источник времени использует часы презентации. Это правило применяется, даже если приемник мультимедиа реализует IMFPresentationTimeSource. Если в часах презентации используется другой источник времени, приемник мультимедиа должен следовать этому источнику времени, а не собственным внутренним часам.

Существует две ситуации, когда приемник мультимедиа не будет следовать часам презентации:

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

  • Некоторые приемники мультимедиа не могут соответствовать скорости с источником времени, кроме самих себя. В этом случае приемник возвращает флаг MEDIASINK_CANNOT_MATCH_CLOCK в методе GetCharacteristics . Конвейер по-прежнему может использовать другой источник времени, но результаты будут менее оптимальными. Приемник, скорее всего, отстает и вызовет сбои во время воспроизведения.

API платформы Media Foundation