Класс CSourceSeeking

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Иерархия классов csourceseeking

Класс CSourceSeeking является абстрактным классом для реализации поиска в исходных фильтрах с одним выходным закреплением.

Этот класс поддерживает интерфейс IMediaSeeking . Он предоставляет реализации по умолчанию для всех методов IMediaSeeking . Защищенные переменные-члены хранят время начала, время остановки и текущую скорость. По умолчанию единственным форматом времени, поддерживаемым классом, является TIME_FORMAT_MEDIA_TIME (100-наносекундные единицы). Дополнительные сведения см. в разделе "Примечания".

Защищенные переменные-члены Описание
m_rtDuration Длительность потока.
m_rtStart Время начала.
m_rtStop Время остановки.
m_dRateSeeking Скорость воспроизведения.
m_dwSeekingCaps Поиск возможностей.
m_pLock Указатель на объект критического раздела для блокировки.
Защищенные методы Описание
CSourceSeeking Метод конструктора.
Чистые виртуальные методы Описание
ChangeRate Вызывается при изменении скорости воспроизведения.
ИзменениеЗапуск Вызывается при изменении начальной позиции.
ChangeStop Вызывается при изменении позиции остановки.
Методы IMediaSeeking Описание
IsFormatSupported Определяет, поддерживается ли указанный формат времени.
QueryPreferredFormat Извлекает предпочтительный формат времени объекта.
SetTimeFormat Задает формат времени.
IsUsingTimeFormat Определяет, является ли указанный формат времени используемым в настоящее время форматом.
GetTimeFormat Извлекает формат текущего времени.
GetDuration Извлекает длительность потока.
GetStopPosition Извлекает время остановки воспроизведения относительно длительности потока.
GetCurrentPosition Извлекает текущую позицию относительно общей длительности потока.
GetCapabilities Извлекает все возможности поиска потока.
CheckCapabilities Запрашивает, заданы ли в потоке возможности поиска.
ConvertTimeFormat Преобразует один формат времени в другой.
SetPositions Задает текущую и стоп-позицию.
GetPositions Извлекает текущую и стоп-позицию.
GetAvailable Извлекает диапазон времени, в котором поиск является эффективным.
SetRate Задает частоту воспроизведения.
GetRate Извлекает частоту воспроизведения.
GetPreroll Извлекает время предварительной подготовки.

Комментарии

При изменении начальной, стоп-позиции или скорости воспроизведения объект CSourceSeeking вызывает соответствующий чистый виртуальный метод:

Производный класс должен реализовывать эти методы. После любой операции поиска фильтр должен выполнять следующие действия.

  1. Вызовите метод IPin::BeginFlush в подчиненном входном контакте.
  2. Остановите рабочий поток, который доставляет данные.
  3. Вызовите метод IPin::EndFlush для входного закрепления.
  4. Перезапустите рабочий поток.
  5. Вызовите метод IPin::NewSegment для входного закрепления.
  6. Задайте свойство разрыва в первом примере. Вызовите метод IMediaSample::SetDiscontinuity .

Вызов BeginFlush освобождает рабочий поток, если поток заблокирован для доставки примера.

На шаге 2 убедитесь, что поток прекратил отправку данных. В зависимости от реализации может потребоваться дождаться выхода потока или сообщить потоку о каком-либо ответе. Если фильтр использует класс CSourceStream , метод CSourceStream::Stop блокируется, пока рабочий поток не ответит.

В идеале новый сегмент (шаг 5) должен быть доставлен из рабочего потока. Это также можно сделать с помощью объекта CSourceSeeking , если фильтр сериализует его с примерами.

В следующем примере показана возможная реализация. Предполагается, что выходной контакт исходного фильтра является производным от CSourceSeeking и CSourceStream. В этом примере определяется вспомогательный метод UpdateFromSeek, который выполняет шаги 1 4. Метод CSourceStream::OnThreadStartPlay переопределен для отправки нового сегмента и установки флага, указывающего на разрыв. Рабочий поток берет этот флаг и вызывает метод IMediaSample::SetDiscontinuity :

void CMyStream::UpdateFromSeek()
{
    if (ThreadExists()) 
    {
        DeliverBeginFlush();
        Stop();
        DeliverEndFlush();
        Run();
    }
}

HRESULT CMyStream::OnThreadStartPlay()
{
    m_bDiscontinuity = TRUE;
    return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}

Поддержка дополнительных форматов времени

По умолчанию этот класс поддерживает поиск только в единицах эталонного времени (TIME_FORMAT_MEDIA_TIME). Чтобы поддерживать дополнительные форматы времени, переопределите методы IMediaSeeking , которые используют форматы времени:

Кроме того, переопределите остальные методы IMediaSeeking , чтобы выполнить необходимые преобразования между форматами времени. После вызова метода SetTimeFormat все методы IMediaSeeking должны рассматривать входящие и исходящие параметры времени как параметры в новом формате времени. Например, если переменная m_rtDuration представляет длительность в единицах ссылочного времени, но текущий формат времени — кадры, то метод GetDuration должен возвращать значение , m_rtDuration преобразованное в кадры. Пример:

STDMETHODIMP GetDuration(LONGLONG *pDuration)
{
    HRESULT hr = CSourceSeeking::GetDuration(pDuration);
    if (SUCCEEDED(hr))
    {
        if (m_TimeFormat == TIME_FORMAT_FRAME)
        {
            // Convert from reference time to frames.
            *pDuration = TimeToFrame(*pDuration);  // Private method.
        }
    }
    return hr
} 

Кроме того, убедитесь, что проверка флаг AM_SEEKING_ReturnTime в методе IMediaSeeking::SetPositions. Если этот флаг присутствует, преобразуйте значения позиции в ссылочные значения при их возврате вызывающему объекту.

Требования

Требование Значение
Заголовок
Ctlutil.h (включая Streams.h)
Библиотека
Strmbase.lib (розничные сборки);
Strmbasd.lib (отладочные сборки)

См. также раздел

Поддержка поиска в исходном фильтре