Поделиться через


Создание данных в фильтре записи

[Функция, связанная с этой страницей 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.

Фильтры захвата видео DirectShow

Время и часы в DirectShow

Написание фильтров записи