Создание данных в фильтре записи
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
В этом разделе описывается, как пользовательский фильтр отслеживания DirectShow должен создавать выходные данные.
Изменения состояния фильтра
Фильтр отслеживания должен создавать данные только в том случае, если фильтр запущен. Не отправляйте данные из контактов при приостановке фильтра. Кроме того, при приостановке фильтра верните VFW_S_CANT_CUE из метода CBaseFilter::GetState . Это возвращаемое значение сообщает диспетчеру фильтров Graph, что он не должен ожидать никаких данных из фильтра, пока фильтр приостановлен. Дополнительные сведения см. в разделе Состояния фильтра.
В следующем коде показано, как реализовать метод IMediaFilter::GetState :
CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
CheckPointer(pState, E_POINTER);
*pState = m_State;
if (m_State == State_Paused)
{
return VFW_S_CANT_CUE;
}
else
{
return S_OK;
}
}
Управление отдельными потоками
Выходные контакты фильтра отслеживания должны поддерживать интерфейс IAMStreamControl , чтобы приложение и 20000 1000 г. Например, приложение может выполнить предварительный просмотр без записи, а затем переключиться в режим записи без перестроения графа фильтра. Для реализации этого интерфейса можно использовать класс CBaseStreamControl .
Метки времени
Когда фильтр захватывает образец, пометка времени образца с текущим потоком времени. Время окончания — это время начала и длительность. Например, если фильтр захватывает 10 выборок в секунду и время потока составляет 200 000 000 единиц, то метки времени должны быть 200000000 и 20100000. (В секунду приходится 10 000 000 единиц.)
Чтобы вычислить время потока, вызовите метод IReferenceClock::GetTime , чтобы получить текущее время отсчета, а затем подстрока исходного времени начала. Кроме того, можно вызвать метод CBaseFilter::StreamTime , который выполняет то же вычисление. Чтобы задать метку времени для примера, вызовите метод IMediaSample::SetTime .
Однако если фильтр содержит контакт предварительного просмотра, то примеры из предварительного просмотра не должны иметь метки времени. Причина заключается в том, что образцы всегда достигают отрисовщика немного позже времени записи. Если примеры имеют метку времени, отрисовщик будет обрабатывать их как поздние и может попытаться наверстать упущенное, удалив примеры. (Дополнительные сведения см. в разделе DirectShow Video Capture Filters.) Обратите внимание, что интерфейс IAMStreamControl требует, чтобы пин-код отслеживал время выборки. Для закрепления предварительного просмотра может потребоваться изменить реализацию, чтобы она не зависела от меток времени.
Метки времени всегда должны увеличиваться от одной выборки к другой. Это верно, даже если фильтр приостанавливается. Если фильтр выполняется, приостанавливается, а затем выполняется снова, первый образец после приостановки должен иметь больший временной отметок, чем последний образец перед приостановкой.
В зависимости от данных, которые вы собираете, может быть целесообразно задать время мультимедиа для примеров.
Дополнительные сведения см. в разделе Время и часы в DirectShow.
Связанные темы