Partilhar via


Fontes ao vivo

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize 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.]

Uma fonte ao vivo, também chamada de push source, recebe dados em tempo real. Os exemplos incluem captura de vídeo e transmissões em rede. Em geral, uma fonte ativa não pode controlar a taxa de chegada dos dados.

Um filtro é considerado uma fonte ativa se uma das seguintes opções for verdadeira:

  • O filtro retorna o sinalizador de AM_FILTER_MISC_FLAGS_IS_SOURCE do método de IAMFilterMiscFlags::GetMiscFlags, E pelo menos um de seus pinos de saída expõe o interface IAMPushSource.
  • O filtro expõe a interfaceIKsPropertySet e tem um pino de captura (PIN_CATEGORY_CAPTURE). Consulte de conjunto de propriedades de pino para obter mais informações.

Se um filtro de fonte ativa fornecer um relógio, o Gerenciador de Gráficos de Filtros preferirá esse relógio quando escolher o relógio de referência do gráfico. Consulte Relógios de referência para obter mais informações.

de latência

A latência de um filtro é a quantidade de tempo que o filtro leva para processar uma amostra. Para fontes vivas, a latência é determinada pelo tamanho do buffer usado para armazenar amostras. Por exemplo, suponha que o gráfico de filtro tenha uma fonte de vídeo com uma latência de 33 milissegundos (ms) e uma fonte de áudio com uma latência de 500 ms. Cada quadro de vídeo chega ao renderizador de vídeo cerca de 470 ms antes que a amostra de áudio correspondente chegue ao renderizador de áudio. A menos que o gráfico compense a diferença, o áudio e o vídeo não serão sincronizados.

Os códigos-fonte ao vivo podem ser sincronizados através da interfaceIAMPushSource. O Filter Graph Manager não sincroniza fontes ao vivo, a menos que o aplicativo habilite a sincronização chamando o IAMGraphStreams::SyncUsingStreamOffset método. Se a sincronização estiver habilitada, o Gerenciador de Gráficos de Filtro consultará cada filtro de origem em busca de IAMPushSource. Se o filtro suportar IAMPushSource , o Gerenciador de Gráficos de Filtros chamará IAMLatency::GetLatency para recuperar a latência esperada do filtro. (O interface IAMPushSource herda IAMLatency.) A partir dos valores de latência combinados, o Filter Graph Manager determina a latência máxima esperada no gráfico. Em seguida, ele chama IAMPushSource::SetStreamOffset para dar a cada filtro de origem um deslocamento de fluxo, que esse filtro adiciona aos carimbos de data/hora gerados.

Este método destina-se principalmente à visualização ao vivo. No entanto, observe que um pino de visualização em um dispositivo de captura ao vivo (como uma câmera) não define carimbos de data/hora nas amostras que ele entrega. Portanto, para usar esse método com um dispositivo de captura ao vivo, você deve visualizar a partir do pino de captura. Para obter mais informações, consulte Filtros de captura de vídeo DirectShow.

Atualmente, a interface IAMPushSource é suportada pelo filtro VFW Capture e pelo filtro Audio Capture.

Correspondência de Tarifas

Se um filtro de renderizador programar amostras usando um relógio de referência, mas o filtro de origem produzi-las usando um relógio diferente, podem ocorrer falhas na reprodução. O renderizador pode ser executado mais rápido do que a origem, causando lacunas nos dados. Ou pode ser mais lento do que a fonte, fazendo com que as amostras "se amontoem", até que em algum momento o gráfico soltará amostras. Normalmente, uma fonte ativa não pode controlar sua taxa de produção, portanto, em vez disso, o renderizador deve corresponder as taxas com a fonte.

Atualmente, apenas o renderizador de áudio executa a correspondência de taxa, porque as falhas na reprodução de áudio são mais percetíveis do que as falhas no vídeo. Para executar a correspondência de taxa, o renderizador de áudio deve selecionar algo em relação ao qual ele corresponderá às taxas. Ele usa o seguinte algoritmo:

  • Se o gráfico não estiver usando um relógio de referência, o renderizador de áudio não tentará corresponder às taxas. (Sempre que o gráfico não tem relógio de referência, as amostras são sempre renderizadas imediatamente à medida que chegam.)
  • Caso contrário, se houver um relógio de referência para o gráfico, o renderizador de áudio verificará se há uma fonte ao vivo a montante, usando os critérios descritos anteriormente. Caso contrário, o renderizador de áudio não corresponde às taxas.
  • Se houver uma fonte ao vivo upstream e essa fonte expor a interfaceIAMPushSourceem seu pino de saída, o renderizador de áudio chamará IAMPushSource::GetPushSourceFlags. Procura uma das seguintes bandeiras:
    • AM_PUSHSOURCECAPS_INTERNAL_RM. Esse sinalizador significa que o filtro de origem tem seu próprio mecanismo de correspondência de taxa, portanto, o renderizador de áudio não corresponde às taxas.
    • AM_PUSHSOURCECAPS_NOT_LIVE. Esse sinalizador significa que o filtro de origem não é realmente uma fonte ativa, embora exponha a interface IAMPushSource. Portanto, o renderizador de áudio não corresponde às taxas.
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK. Esse sinalizador significa que o filtro de origem está usando um relógio particular para gerar carimbos de data/hora. Nesse caso, o renderizador de áudio corresponde às taxas com os carimbos de data/hora. (No entanto, se os exemplos não tiverem carimbos de data/hora, o renderizador ignorará esse sinalizador.)
  • Se GetPushSourceFlags não retornar nenhum sinalizador (zero), o comportamento do renderizador de áudio dependerá do relógio do gráfico e se as amostras têm carimbos de data/hora:
    • Se o renderizador de áudio não for o relógio gráfico, E as amostras tiverem carimbos de data/hora, o renderizador de áudio corresponderá às taxas em relação aos carimbos de data/hora.
    • Se as amostras não tiverem carimbos de data/hora, o renderizador de áudio tentará corresponder à taxa de dados de áudio recebidos.
    • Se o renderizador de áudio for o relógio gráfico, ele tentará corresponder à taxa de dados de entrada.

A razão para o último caso é a seguinte: Se o renderizador de áudio for o relógio de referência e o filtro de origem estiver usando o mesmo relógio para gerar carimbos de data/hora, o renderizador de áudio não poderá comparar as taxas com os carimbos de data/hora. Se o fizesse, na verdade, estaria tentando igualar as taxas consigo mesmo, o que poderia fazer com que o relógio se desviasse. Portanto, neste caso, o renderizador corresponde à taxa de dados de áudio recebidos.

hora e relógios no DirectShow