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