Classe CSourceSeeking
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
A classe CSourceSeeking é uma classe abstrata para implementar a busca em filtros de origem com um pino de saída.
Essa classe dá suporte à interface IMediaSeeking . Ele fornece implementações padrão para todos os métodos IMediaSeeking . As variáveis de membro protegidas armazenam a hora de início, a hora de parada e a taxa atual. Por padrão, o único formato de tempo compatível com a classe é TIME_FORMAT_MEDIA_TIME (unidades de 100 nanossegundos). Confira Comentários para obter mais informações.
Variáveis de membro protegidas | Descrição |
---|---|
m_rtDuration | Duração do fluxo. |
m_rtStart | Hora de início. |
m_rtStop | Hora de parar. |
m_dRateSeeking | Taxa de reprodução. |
m_dwSeekingCaps | Buscando recursos. |
m_pLock | Ponteiro para um objeto de seção crítico para bloqueio. |
Métodos Protegidos | Descrição |
Csourceseeking | Método de construtor. |
Métodos virtuais puros | Descrição |
Changerate | Chamado quando a taxa de reprodução é alterada. |
Changestart | Chamado quando a posição inicial é alterada. |
Changestop | Chamado quando a posição de parada é alterada. |
Métodos IMediaSeeking | Descrição |
Isformatsupported | Determina se há suporte para um formato de hora especificado. |
QueryPreferredFormat | Recupera o formato de hora preferencial do objeto. |
SetTimeFormat | Define o formato de hora. |
IsUsingTimeFormat | Determina se um formato de hora especificado é o formato atualmente em uso. |
Gettimeformat | Recupera o formato de hora atual. |
GetDuration | Recupera a duração do fluxo. |
GetStopPosition | Recupera o tempo em que a reprodução será interrompida, em relação à duração do fluxo. |
Getcurrentposition | Recupera a posição atual, em relação à duração total do fluxo. |
GetCapabilities | Recupera todos os recursos de busca do fluxo. |
CheckCapabilities | Consulta se o fluxo especificou a busca de recursos. |
ConvertTimeFormat | Converte de um formato de vez em outro. |
Setpositions | Define a posição atual e a posição de parada. |
GetPositions | Recupera a posição atual e a posição de parada. |
Obter Disponível | Recupera o intervalo de vezes em que a busca é eficiente. |
Setrate | Define a taxa de reprodução. |
GetRate | Recupera a taxa de reprodução. |
GetPreroll | Recupera o tempo de pré-registro. |
Comentários
Sempre que a posição inicial, a posição de parada ou a taxa de reprodução forem alteradas, o objeto CSourceSeeking chamará um método virtual puro correspondente:
- Posição inicial: CSourceSeeking::ChangeStart
- Posição de parada: CSourceSeeking::ChangeStop
- Taxa de reprodução: CSourceSeeking::ChangeRate
A classe derivada deve implementar esses métodos. Após qualquer operação de busca, um filtro deve fazer o seguinte:
- Chame o método IPin::BeginFlush no pin de entrada downstream.
- Interrompa o thread de trabalho que está fornecendo dados.
- Chame o método IPin::EndFlush no pin de entrada.
- Reinicie o thread de trabalho.
- Chame o método IPin::NewSegment no pin de entrada.
- Defina a propriedade de descontinuidade no primeiro exemplo. Chame o método IMediaSample::SetDiscontinuity .
A chamada para BeginFlush libera o thread de trabalho, se o thread estiver bloqueado aguardando para entregar uma amostra.
Na etapa 2, verifique se o thread parou de enviar dados. Dependendo da implementação, talvez seja necessário aguardar a saída do thread ou para que o thread sinalize uma resposta de algum tipo. Se o filtro usar a classe CSourceStream , o método CSourceStream::Stop será bloqueado até que o thread de trabalho responda.
O ideal é que o novo segmento (etapa 5) seja entregue do thread de trabalho. Ele também pode ser feito pelo objeto CSourceSeeking , desde que o filtro o serialize com os exemplos.
O exemplo a seguir mostra uma possível implementação. Ele pressupõe que o pino de saída do filtro de origem seja derivado de CSourceSeeking e CSourceStream. Este exemplo define um método auxiliar, UpdateFromSeek, que executa as etapas 1 4. O método CSourceStream::OnThreadStartPlay é substituído para enviar o novo segmento e para definir um sinalizador que indica a descontinuidade. O thread de trabalho pega esse sinalizador e chama o 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);
}
Suporte a formatos de tempo adicionais
Por padrão, essa classe dá suporte à busca apenas em unidades de tempo de referência (TIME_FORMAT_MEDIA_TIME). Para dar suporte a formatos de tempo adicionais, substitua os métodos IMediaSeeking que lidam com formatos de tempo:
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::SetTimeFormat
Além disso, substitua os métodos IMediaSeeking restantes para executar as conversões necessárias entre os formatos de tempo. Depois que o método SetTimeFormat é chamado, todos os métodos IMediaSeeking devem tratar os parâmetros de hora de entrada e saída como estando no novo formato de hora. Por exemplo, se a variável m_rtDuration representar a duração em unidades de tempo de referência, mas o formato de hora atual for quadros, o método GetDuration deverá retornar o valor m_rtDuration convertido em quadros. Por exemplo:
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
}
Além disso, certifique-se de marcar para o sinalizador AM_SEEKING_ReturnTime no método IMediaSeeking::SetPositions. Se esse sinalizador estiver presente, converta os valores de posição em tempos de referência quando você os retornar ao chamador.
Requisitos
Requisito | Valor |
---|---|
parâmetro |
|
Biblioteca |
|