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

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

Интерфейс Описание
IMFPresentationClock Основной интерфейс для использования часов представления.
IMFRateControl Управляет частотой часов.
IMFTimer Предоставляет обратный вызов таймера.
IMFShutdown Завершает работу часов презентации.

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

схема, показывающая связь между часами презентации и источником времени презентации

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

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

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

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

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

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

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

API-интерфейсы платформы Media Foundation