Динамические источники
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
Динамический источник, также называемый источником push-уведомлений, получает данные в режиме реального времени. К примерам относятся захват видео и сетевые трансляции. Как правило, динамический источник не может управлять скоростью поступления данных.
Фильтр считается динамическим источником, если выполняется одно из следующих действий:
- Фильтр возвращает флаг AM_FILTER_MISC_FLAGS_IS_SOURCE из метода IAMFilterMiscFlags::GetMiscFlags , и по крайней мере один из его выходных контактов предоставляет интерфейс IAMPushSource .
- Фильтр предоставляет интерфейс IKsPropertySet и имеет контакт захвата (PIN_CATEGORY_CAPTURE). Дополнительные сведения см. в разделе Закрепление набора свойств .
Если динамический фильтр источника предоставляет часы, диспетчер фильтров графа предпочтет эти часы при выборе эталонных часов графа. Дополнительные сведения см. в разделе Справочные часы .
Задержка
Задержка фильтра — это время, которое требуется фильтру для обработки выборки. Для динамических источников задержка определяется размером буфера, используемого для хранения выборок. Например, предположим, что в графе фильтра есть источник видео с задержкой 33 миллисекунд (мс) и источник звука с задержкой 500 мс. Каждый видеокадр прибывает в отрисовщик видео примерно 470 мс, прежде чем соответствующий пример звука достигнет отрисовщика звука. Если граф не компенсирует разницу, аудио и видео не будут синхронизированы.
Динамические источники можно синхронизировать с помощью интерфейса IAMPushSource . Диспетчер фильтров графов не синхронизирует динамические источники, если приложение не включает синхронизацию путем вызова метода IAMGraphStreams::SyncUsingStreamOffset . Если синхронизация включена, диспетчер фильтров Graph запрашивает каждый исходный фильтр для IAMPushSource. Если фильтр поддерживает IAMPushSource, диспетчер графов фильтров вызывает IAMLatency::GetLatency для получения ожидаемой задержки фильтра. (Интерфейс IAMPushSource наследует IAMLatency.) На основе объединенных значений задержки диспетчер фильтров графа определяет максимальную ожидаемую задержку на графе. Затем он вызывает IAMPushSource::SetStreamOffset , чтобы предоставить каждому исходному фильтру смещение потока, которое этот фильтр добавляет к создаваемым меткам времени.
Этот метод предназначен в первую очередь для динамической предварительной версии. Однако обратите внимание, что контакт предварительного просмотра на устройстве захвата в реальном времени (например, на камере) не устанавливает метки времени на доставляемых образцах. Поэтому, чтобы использовать этот метод с устройством динамического захвата, необходимо выполнить предварительный просмотр из контакта захвата. Дополнительные сведения см. в разделе DirectShow Video Capture Filters.
В настоящее время интерфейс IAMPushSource поддерживается фильтром захвата VFW и фильтром аудиозахвата .
Сопоставление скорости
Если фильтр отрисовщика планирует примеры с использованием одного эталонного времени, но исходный фильтр создает их с использованием других часов, при воспроизведении могут возникнуть сбои. Отрисовщик может работать быстрее, чем источник, что приводит к пробелам в данных. Или он может работать медленнее, чем источник, в результате чего выборки будут "кучу вверх", пока в какой-то момент граф не будет удалять образцы. Как правило, динамический источник не может управлять скоростью производства, поэтому вместо этого отрисовщик должен сопоставлять скорости с источником.
В настоящее время сопоставление скорости выполняет только отрисовщик звука, так как сбои при воспроизведении звука более заметны, чем сбои в видео. Чтобы выполнить сопоставление скорости, отрисовщик звука должен выбрать то, что будет соответствовать скорости. В нем используется следующий алгоритм:
- Если график не использует ссылочные часы, отрисовщик звука не пытается сопоставить частоту. (Всякий раз, когда на графике нет ссылочных часов, образцы всегда отрисовываются сразу по мере поступления.)
- В противном случае, если для графа есть ссылочные часы, отрисовщик звука проверяет, есть ли динамический источник вышестоящий, используя описанные выше критерии. В противном случае отрисовщик звука не соответствует скорости.
- Если имеется динамический источник вышестоящий и этот источник предоставляет интерфейс IAMPushSource на своем выходном контакте, отрисовщик звука вызывает IAMPushSource::GetPushSourceFlags. Он ищет один из следующих флагов:
- AM_PUSHSOURCECAPS_INTERNAL_RM. Этот флаг означает, что фильтр источника имеет собственный механизм сопоставления скорости, поэтому отрисовщик звука не соответствует скорости.
- AM_PUSHSOURCECAPS_NOT_LIVE. Этот флаг означает, что фильтр источника на самом деле не является динамическим источником, хотя он предоставляет интерфейс IAMPushSource . Таким образом, отрисовщик звука не соответствует скорости.
- AM_PUSHSOURCECAPS_PRIVATE_CLOCK. Этот флаг означает, что фильтр источника использует частные часы для создания меток времени. В этом случае отрисовщик звука соответствует скорости с метками времени. (Однако если в примерах нет меток времени, отрисовщик игнорирует этот флаг.)
- Если GetPushSourceFlags не возвращает флагов (ноль), поведение отрисовщика звука зависит от часов графа и от того, имеют ли образцы метки времени:
- Если звуковой отрисовщик не является графиком, а образцы имеют метки времени, то отрисовщик звука соответствует скорости с метками времени.
- Если примеры не имеют меток времени, отрисовщик аудио пытается сопоставить скорость входящих звуковых данных.
- Если отрисовщик звука является графиком, он пытается соответствовать скорости входящих данных.
Причина последнего случая заключается в следующем: если отрисовщик звука является эталонными часами, а фильтр источника использует те же часы для создания меток времени, то отрисовщик звука не может сопоставить частоту с метками времени. Если бы это было так, по сути, он будет пытаться сопоставить ставки с самим собой, что может привести к смещению часов. Таким образом, в этом случае отрисовщик соответствует скорости входящих звуковых данных.
Связанные темы