Класс CSourceSeeking
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
Класс 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 вызывает соответствующий чистый виртуальный метод:
- Начальная позиция: CSourceSeeking::ChangeStart
- Позиция остановки: CSourceSeeking::ChangeStop
- Скорость воспроизведения: CSourceSeeking::ChangeRate
Производный класс должен реализовывать эти методы. После любой операции поиска фильтр должен выполнять следующие действия.
- Вызовите метод IPin::BeginFlush в подчиненном входном контакте.
- Остановите рабочий поток, который доставляет данные.
- Вызовите метод IPin::EndFlush для входного закрепления.
- Перезапустите рабочий поток.
- Вызовите метод IPin::NewSegment для входного закрепления.
- Задайте свойство разрыва в первом примере. Вызовите метод 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::GetTimeFormat
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::SetTimeFormat
Кроме того, переопределите остальные методы 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. Если этот флаг присутствует, преобразуйте значения позиции в ссылочные значения при их возврате вызывающему объекту.
Требования
Требование | Значение |
---|---|
Заголовок |
|
Библиотека |
|