Часы презентации
часов презентации — это объект, который создает время часов для презентации. Время, сообщаемое часами презентации, называется время презентации. Все потоки презентации синхронизируются с временем презентации. Часы презентации предоставляют следующие интерфейсы.
Интерфейс | Описание |
---|---|
МВФPresentationClock | Основной интерфейс для использования часов презентации. |
МВФRateControl | Управляет скоростью часов. |
МВФTimer | Предоставляет обратный вызов таймера. |
МВФShutdown | Завершает работу часов презентации. |
Приемники мультимедиа используют время презентации, чтобы запланировать время отрисовки примеров. Каждый раз, когда приемник мультимедиа получает новый образец, он получает метку времени из образца и отрисовывает образец в указанное время или как можно ближе к тому времени. Так как все приемники мультимедиа в топологии используют одинаковые часы презентации, синхронизируются несколько потоков (например, аудио и видео). Источники мультимедиа и преобразования не используют часы презентации, так как они не запланируют время доставки примеров. Вместо этого они создают образцы всякий раз, когда конвейер запрашивает новый пример.
Если вы используете сеанс мультимедиа для воспроизведения, сеанс мультимедиа обрабатывает все сведения о создании часов презентации, выборе источника времени и уведомлении приемников мультимедиа. Приложение может использовать часы презентации для получения текущего времени презентации во время воспроизведения, но в противном случае не вызовет никаких методов в часах презентации.
Часы и состояния часов
Чтобы получить последнее время с часов презентации, вызовите МВФPresentationClock::GetTime. Время часов всегда находится в 100-наносекундных единицах, поэтому один второй — 10 000 000 (10^7) галок. Это соответствует частоте 10 МГц.
Часы презентации имеют три состояния: выполнение, приостановка и остановка.
- Чтобы запустить часы, вызовите МВФPresentationClock::Start. Метод Start указывает время начала часов. Пока часы выполняются, время часов увеличивается с начала, по текущей частоте часов.
- Чтобы приостановить часы, вызовите МВФPresentationClock::P ause. Пока часы приостановлены, время часов не перемещается и GetTime возвращает время приостановки часов.
- Чтобы остановить часы, вызовите МВФPresentationClock::Stop. Когда часы остановлены, время часов не перемещается и GetTime возвращает ноль.
По умолчанию часы перемещаются по скорости 1,0, что означает 1 тик на 100 наносекунд. Чтобы изменить скорость продвижения часов, запросите часы презентации для интерфейса IMFRateControl и вызовите IMFRateControl::SetRate.
Объекты могут получать уведомления об изменениях состояния (включая изменения скорости) из часов презентации. Чтобы получать уведомления, реализуйте интерфейс IMFClockStateSink и вызовите IMFPresentationClock::AddClockStateSink на часы презентации. Перед завершением работы вызовите МВФPresentationClock::RemoveClockStateSink, чтобы отменить регистрацию объекта. Приемники мультимедиа используют этот механизм для получения уведомлений от часов.
Время презентации
Приемник мультимедиа пытается запланировать каждый образец таким образом, чтобы образец отображался в правильное время или как можно ближе к правильному времени. Применяются следующие определения:
- Время презентации. Время отрисовки примера. Время задается в единицах 100 наносекунд.
- Время мультимедиа. Время относительно начала содержимого. Например, если видеофайл длиной 10 секунд, то точка в половине пути через файл имеет время мультимедиа в 5 секунд.
- Отметка времени. Время, отмеченное в примере носителя. Чтобы получить метку времени, вызовите МВФSample::GetSampleTime. Когда источник мультимедиа создает образец, он задает метку времени, равную времени носителя. Сеанс мультимедиа преобразует метку времени в время презентации.
По умолчанию время мультимедиа и время презентации совпадают, например, если видеокадр отображается 5 секунд в исходном файле, время мультимедиа и время презентации — 5 секунд. Если вы используете источника последовательности, модель времени несколько сложнее, чтобы обеспечить плавный переход между сегментами. Дополнительные сведения о модели времени источника последовательности см. в разделе Время представления последовательности.
Источник мультимедиа всегда задает метку времени, равную времени носителя. Если время презентации не соответствует времени мультимедиа, сеанс мультимедиа преобразует метки времени в примерах мультимедиа. К тому времени, когда приемник получает образец, метка времени образца преобразуется в время презентации. Приемник планирует выборку по текущему времени презентации. (Приемники без скорости являются исключением, так как они игнорируют часы презентации.)
Если приложение стремится к новой позиции, сеанс мультимедиа перезапускает часы презентации в указанное время поиска. Например, если приложение стремится к 5-секундной позиции в файле, сеанс мультимедиа запускает часы в 5 секунд. Источник мультимедиа может доставлять образцы с немного более ранней меткой времени, если время поиска не попадает на границу ключевого кадра. Это необходимо, чтобы декодеры могли декодировать все кадры. Сеанс мультимедиа удаляет или обрезает образцы, прежде чем они достигают приемников мультимедиа, чтобы соответствовать запрошенным времени поиска. Например, если время поиска составляет 5 секунд, первый образец звука может начинаться в 4,5 секунды. Сеанс мультимедиа обрезает первые 0,5 секунды от первого декодированного звукового примера.
Создание часов презентации
Чтобы создать часы презентации, вызовите MFCreatePresentationClock. Чтобы завершить работу часов, запросите интерфейсМВФShutdown и вызовите МВФShutdown::Shutdown. Вызывающий объект MFCreatePresentationClock отвечает за вызов завершение работы; В большинстве случаев это сеанс мультимедиа, а не приложение.
Источники времени презентации
Несмотря на его название, часы презентации на самом деле не реализуют часы. Вместо этого он получает время часов из другого объекта, называемого источником времени презентации. Источник времени может быть любым объектом, который создает точные часы и предоставляет интерфейс IMFPresentationTimeSource. На следующем рисунке показан этот процесс.
схема
При первом создании часов презентации он не имеет источника времени. Чтобы задать источник времени, вызовите МВФPresentationClock::SetTimeSource с указателем на интерфейс источника времени МВФPresentationTimeSource. Источник времени поддерживает те же состояния, что и часы презентации (выполнение, приостановка и остановка), и должен реализовать интерфейс IMFClockStateSink. Часы презентации используют этот интерфейс для уведомления источника времени при изменении состояния. Таким образом, источник времени предоставляет часы, но часы презентации инициируют изменения состояния в часах.
Некоторые приемники мультимедиа имеют доступ к точным часам и поэтому предоставляют интерфейс IMFPresentationTimeSource. В частности, средство отрисовки звука может использовать частоту звуковой карты в качестве часов. При воспроизведении звука полезно для отрисовщика звука выступать в качестве источника времени, чтобы видео синхронизировано с скоростью воспроизведения звука. Обычно это дает лучшие результаты, чем попытка сопоставить звук с внешними часами.
Media Foundation также предоставляет источник времени презентации на основе системных часов. Чтобы создать этот объект, вызовите MFCreateSystemTimeSource. Источник системного времени можно использовать, если приемники мультимедиа не предоставляют источник времени.
Как правило, приемник мультимедиа должен использовать часы презентации, предоставленные ему, независимо от того, какой источник времени использует часы презентации. Это правило применяется, даже если приемник мультимедиа реализует МВФPresentationTimeSource. Если в часах презентации используется другой источник времени, приемник мультимедиа должен следовать этому источнику времени, а не собственным внутренним часам.
Существует две ситуации, когда приемник мультимедиа не будет следовать часам презентации:
Некоторые приемники мультимедиа скорости. Если приемник мультимедиа не имеет скорости, он использует примеры как можно быстрее, не планируя их в соответствии с часами презентации. Как правило, приемники без скорости записывают данные в файл, поэтому рекомендуется выполнить операцию как можно быстрее. Приемник без скорости возвращает флаг MEDIASINK_RATELESS в методе IMFMediaSink::GetCharacteristics. Когда все приемники в топологии являются скоростными, сеанс мультимедиа отправляет данные через конвейер как можно быстрее.
Некоторые приемники мультимедиа не могут соответствовать тарифам с источником времени, кроме самих себя. В этом случае приемник возвращает флаг MEDIASINK_CANNOT_MATCH_CLOCK в методе GetCharacteristics. Конвейер по-прежнему может использовать другой источник времени, но результаты будут менее оптимальными. Приемник, скорее всего, отстает и вызывает сбои во время воспроизведения.
Связанные разделы