Compartir a través de


CSourceSeeking (clase)

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Jerarquía de clases csourceseeking

La clase CSourceSeeking es una clase abstracta para implementar la búsqueda en filtros de origen con un pin de salida.

Esta clase admite la interfaz IMediaSeeking . Proporciona implementaciones predeterminadas para todos los métodos IMediaSeeking . Las variables miembro protegidas almacenan la hora de inicio, la hora de detención y la tasa actual. De forma predeterminada, el único formato de hora admitido por la clase es TIME_FORMAT_MEDIA_TIME (unidades de 100 nanosegundos). Vea Comentarios para obtener más información.

Variables miembro protegidas Descripción
m_rtDuration Duración de la secuencia.
m_rtStart Hora de inicio.
m_rtStop Tiempo de detención.
m_dRateSeeking Velocidad de reproducción.
m_dwSeekingCaps Búsqueda de funcionalidades.
m_pLock Puntero a un objeto de sección crítico para el bloqueo.
Métodos protegidos Descripción
CSourceSeeking Método constructor.
Métodos virtuales puros Descripción
ChangeRate Se llama cuando cambia la velocidad de reproducción.
ChangeStart Se llama cuando cambia la posición inicial.
ChangeStop Se llama cuando cambia la posición de detención.
Métodos IMediaSeeking Descripción
IsFormatSupported Determina si se admite un formato de hora especificado.
QueryPreferredFormat Recupera el formato de hora preferido del objeto.
SetTimeFormat Establece el formato de hora.
IsUsingTimeFormat Determina si un formato de hora especificado es el formato actualmente en uso.
GetTimeFormat Recupera el formato de hora actual.
GetDuration Recupera la duración de la secuencia.
GetStopPosition Recupera la hora en la que se detendrá la reproducción, con respecto a la duración de la secuencia.
GetCurrentPosition Recupera la posición actual, en relación con la duración total de la secuencia.
GetCapabilities Recupera todas las funcionalidades de búsqueda de la secuencia.
CheckCapabilities Consulta si la secuencia ha especificado funcionalidades de búsqueda.
ConvertTimeFormat Convierte de un formato de una vez a otro.
SetPositions Establece la posición actual y la posición de detención.
GetPositions Recupera la posición actual y la posición de detención.
GetAvailable Recupera el intervalo de tiempos en los que la búsqueda es eficaz.
SetRate Establece la velocidad de reproducción.
GetRate Recupera la velocidad de reproducción.
GetPreroll Recupera la hora de inscripción previa.

Observaciones

Cada vez que cambia la posición inicial, la posición de detención o la velocidad de reproducción, el objeto CSourceSeeking llama a un método virtual puro correspondiente:

La clase derivada debe implementar estos métodos. Después de cualquier operación de búsqueda, un filtro debe hacer lo siguiente:

  1. Llame al método IPin::BeginFlush en el pin de entrada de bajada.
  2. Detenga el subproceso de trabajo que está entregando datos.
  3. Llame al método IPin::EndFlush en el pin de entrada.
  4. Reinicie el subproceso de trabajo.
  5. Llame al método IPin::NewSegment en el pin de entrada.
  6. Establezca la propiedad discontinuidad en el primer ejemplo. Llame al método IMediaSample::SetDiscontinuity .

La llamada a BeginFlush libera el subproceso de trabajo, si el subproceso está bloqueado en espera de entregar un ejemplo.

En el paso 2, asegúrese de que el subproceso ha dejado de enviar datos. En función de la implementación, es posible que tenga que esperar a que el subproceso salga o que el subproceso indique una respuesta de algún tipo. Si el filtro usa la clase CSourceStream , el método CSourceStream::Stop se bloquea hasta que responda el subproceso de trabajo.

Lo ideal es que el nuevo segmento (paso 5) se entregue desde el subproceso de trabajo. También puede hacerlo el objeto CSourceSeeking , siempre y cuando el filtro lo serialice con los ejemplos.

En el ejemplo siguiente se muestra una posible implementación. Se supone que el pin de salida del filtro de origen se deriva de CSourceSeeking y CSourceStream. En este ejemplo se define un método auxiliar, UpdateFromSeek, que realiza los pasos 1 4. El método CSourceStream::OnThreadStartPlay se invalida para enviar el nuevo segmento y para establecer una marca que indica la discontinuidad. El subproceso de trabajo recoge esta marca y llama al método 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);
}

Compatibilidad con formatos de tiempo adicionales

De forma predeterminada, esta clase solo admite la búsqueda en unidades de tiempo de referencia (TIME_FORMAT_MEDIA_TIME). Para admitir formatos de tiempo adicionales, invalide los métodos IMediaSeeking que tratan con formatos de hora:

Además, invalide los métodos IMediaSeeking restantes para realizar las conversiones necesarias entre formatos de tiempo. Después de llamar al método SetTimeFormat , todos los métodos IMediaSeeking deben tratar los parámetros de hora entrante y saliente como en el nuevo formato de hora. Por ejemplo, si la variable m_rtDuration representa la duración en unidades de tiempo de referencia, pero el formato de hora actual es fotogramas, el método GetDuration debe devolver el valor m_rtDuration convertido en fotogramas. Por ejemplo:

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
} 

Además, asegúrese de comprobar si hay la marca AM_SEEKING_ReturnTime en el método IMediaSeeking::SetPositions . Si esta marca está presente, convierta los valores de posición en horas de referencia cuando los devuelva al autor de la llamada.

Requisitos

Requisito Value
Encabezado
Ctlutil.h (include Streams.h)
Biblioteca
Strmbase.lib (compilaciones comerciales);
Strmbasd.lib (compilaciones de depuración)

Consulte también

Admitir la búsqueda en un filtro de origen