Método ICaptureGraphBuilder2::RenderStream (strmif.h)

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 Audio/Video Capture in 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.]

O RenderStream método conecta um pino de saída em um filtro de origem a um filtro de coletor, opcionalmente por meio de um filtro intermediário.

Sintaxe

HRESULT RenderStream(
  [in] const GUID  *pCategory,
  [in] const GUID  *pType,
  [in] IUnknown    *pSource,
  [in] IBaseFilter *pfCompressor,
  [in] IBaseFilter *pfRenderer
);

Parâmetros

[in] pCategory

Um ponteiro para um GUID que especifica uma das categorias de pino listadas no Conjunto de Propriedades do Pin. Para corresponder a qualquer pino, independentemente da categoria, defina esse parâmetro como NULL. Os valores típicos incluem o seguinte.

  • PIN_CATEGORY_CAPTURE
  • PIN_CATEGORY_PREVIEW
  • PIN_CATEGORY_CC

[in] pType

Ponteiro para um GUID de tipo principal que especifica o tipo de mídia do pino de saída; ou NULL para usar qualquer pino, independentemente do tipo de mídia. Para obter uma lista de valores possíveis, consulte Tipos principais.

[in] pSource

Especifica um ponteiro para o filtro inicial para a conexão ou para um pino de saída.

[in] pfCompressor

Ponteiro para a interface IBaseFilter de um filtro intermediário, como um filtro de compactação. Pode ser NULL.

[in] pfRenderer

Ponteiro para a interface IBaseFilter de um filtro de coletor, como um filtro de renderizador ou mux. Se o valor for NULL, o método usará um renderizador padrão (consulte Comentários).

Retornar valor

Retorna um valor HRESULT . Os possíveis valores retornados incluem o seguinte.

Código de retorno Descrição
S_OK
Êxito.
VFW_S_NOPREVIEWPIN
A visualização foi renderizada por meio do Filtro De Tee Inteligente.
E_FAIL
Falha.
E_INVALIDARG
Argumento inválido.
E_POINTER
Argumento de ponteiro NULL.
VFW_E_NOT_IN_GRAPH
Um filtro não está no grafo de filtro. Esse erro poderá ocorrer se você não tiver chamado AddFilter para adicionar pSource, pIntermediate ou pSink ao grafo. Isso também poderá ocorrer se você não tiver chamado SetFiltergraph para conectar seu grafo ao Construtor de Gráficos de Captura; nesse caso, o objeto Capture Graph Builder cria automaticamente seu próprio grafo de filtro. Consulte Sobre o Construtor de Gráficos de Captura.

Comentários

Esse método renderiza um fluxo conectando dois ou mais filtros em uma cadeia:

  • O parâmetro pSource especifica o início da cadeia, um filtro ou um pino de saída.
  • O parâmetro pIntermediate especifica um filtro intermediário, normalmente um filtro de compactação. Este parâmetro pode ser NULL.
  • O parâmetro pSink especifica o filtro no final da cadeia. Normalmente, esse filtro é um renderizador para visualização ou um mux para captura de arquivo.
O método conecta pSource a pIntermediate e, em seguida, conecta pIntermediate a pSink. Se pIntermediate for NULL, o método apenas conectará pSource a pSink. Todos os filtros especificados por pSource, pIntermediate e pSink devem ser adicionados ao grafo antes de chamar o método . O método usa o Intelligent Connect, portanto, filtros adicionais, como decodificadores, podem ser adicionados ao grafo.

Se o parâmetro pSink for NULL, o método tentará usar um renderizador padrão. Para vídeo, ele usa o Renderizador de Vídeo e, para áudio, usa o Renderizador DirectSound.

Se pSource for um filtro, o método procurará um pino de saída nesse filtro. Nesse caso, use os parâmetros pCategory e pType para restringir a pesquisa. Por exemplo, se um filtro tiver pinos separados para visualização e captura, você poderá especificar PIN_CATEGORY_CAPTURE ou PIN_CATEGORY_PREVIEW. Se pSource for um pino de saída, defina pCategory e pType como NULL.

Em todos os casos, o método procura pinos não conectados. Se mais de um pino atender aos critérios especificados, o método usará o primeiro pino desse tipo encontrado.

Observe que, para a captura de DV, se o tipo de mídia for MEDIATYPE_Interleaved e o parâmetro pSink for NULL, o método dividirá o fluxo intercalado em um fluxo de áudio e um fluxo de vídeo e renderizará ambos os fluxos.

O RenderStream método lida com muitos dos detalhes necessários para capturar grafos:

Tee Inteligente. Alguns filtros de captura têm um pino de captura, mas nenhum pino de visualização. Para visualizar, o pino de captura deve estar conectado ao Filtro De Tee Inteligente. Esse filtro divide os dados em dois fluxos, um fluxo de captura e um fluxo de visualização. Quando você especifica PIN_CATEGORY_PREVIEW ou PIN_CATEGORY_CAPTURE, o método insere um filtro Smart Tee se for necessário. Em seguida, ele renderiza o fluxo especificado no filtro Smart Tee. Se você renderizar um fluxo de visualização e o método usar um filtro Smart Tee, ele retornará VFW_S_NOPREVIEWPIN.

Legendagem oculta. Você pode usar esse método para capturar ou visualizar legendas ocultas. Alguns filtros de captura fornecem dados de VBI (Intervalo de Espaço em Branco Vertical), outros fornecem dados de legendagem oculta. Para lidar com ambos os casos, chame o método duas vezes, uma vez usando PIN_CATEGORY_VBI e uma vez usando PIN_CATEGORY_CC. O método insere todos os filtros necessários para converter dados de VBI em legendas ocultas. Para visualizar os dados, defina o parâmetro pSink como NULL. Para capturar os dados em um arquivo, use o ponteiro da interface IBaseFilter do filtro multiplexer. Você pode capturar e visualizar os dados no mesmo grafo. Chame o método uma vez usando NULL e novamente usando o multiplexador. Defina o parâmetro pIntermediate como NULL.

Pinos de porta de vídeo. Os filtros que funcionam com hardware de captura de vídeo da VPE (extensão de porta de vídeo) podem ter pinos de porta de vídeo (PIN_CATEGORY_VIDEOPORT) em vez de pinos de visualização. Para que a visualização ou captura funcione, um pin de porta de vídeo deve se conectar ao Filtro de Mixer de Sobreposição. O método lida com esse detalhe. Você não precisa especificar PIN_CATEGORY_VIDEOPORT. Especifique PIN_CATEGORY_PREVIEW ou PIN_CATEGORY_CAPTURE e o método conectará o pino corretamente. De maneira semelhante, alguns filtros fornecem dados de VBI usando pinos de porta de vídeo (PIN_CATEGORY_VIDEOPORT_VBI). Assim como acontece com PIN_CATEGORY_VIDEOPORT, o método lida com esse detalhe. Você não precisa especificar PIN_CATEGORY_VIDEOPORT_VBI.

Filtros de suporte. Se um dispositivo de captura usar um driver WDM (Modelo de Driver do Windows), o grafo poderá exigir determinados filtros upstream do Filtro de Captura de Vídeo WDM, como um Filtro de Sintonizador de TV ou um Filtro de Barra Cruzada de Vídeo Analógico. Se esse método renderizar com êxito o fluxo, ele também inserirá todos os filtros WDM necessários no grafo. O método consulta os pinos de entrada no filtro de captura para determinar quais meios eles dão suporte e os conecta a filtros correspondentes.

Código de exemplo

Para um grafo de captura típico, conecte o pino de visualização ao renderizador padrão, sem filtro intermediário:
C++
// Video: 
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
    pCaptureFilter, NULL, NULL); 
// Audio:
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, 
    pCaptureFilter, NULL, NULL); 
Conecte o pino de captura a um filtro mux ou filtro de gravador de arquivos, dependendo do tipo de arquivo que você deseja gerar. Para arquivos AVI, use o filtro AVI Mux . Para arquivos ASF, use o filtro Gravador ASF do WM . Normalmente, você obterá um ponteiro para esse filtro do parâmetro ppf do método ICaptureGraphBuilder2::SetOutputFileName .
C++
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\Example.avi", 
    &ppf, &pSink);
pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
    pCaptureFilter, NULL, ppf);

Fontes de arquivo

Você pode usar esse método para transcodificar ou recompactar um arquivo. A discussão a seguir pressupõe que o arquivo tenha no máximo um fluxo de vídeo e um fluxo de áudio, ou então um único fluxo intercalado. Caso contrário, o método não funcionará corretamente.

Uma fonte de arquivo tem um pino de saída, portanto, defina pCategory e pType como NULL. Chame o método duas vezes , uma vez para renderizar o fluxo de vídeo e uma vez para renderizar o fluxo de áudio. A primeira chamada conecta o filtro de origem a um filtro de analisador e renderiza um dos pinos de saída do filtro do analisador. A segunda chamada renderiza o pino de saída restante do analisador. Se você estiver compactando um fluxo, mas não o outro, especifique o filtro de compressor na primeira chamada. O método escolherá automaticamente o fluxo correto com base no tipo de compactação.

C++
pBuilder->RenderStream(NULL, NULL, pSrc, pCompressor, pMux);
pBuilder->RenderStream(NULL, NULL, pSrc, NULL, pMux);
Para obter um exemplo completo, consulte Recompactando um arquivo AVI.

Requisitos

Requisito Valor
Plataforma de Destino Windows
Cabeçalho strmif.h (inclua Dshow.h)
Biblioteca Strmiids.lib

Confira também

Criando grafos com o Construtor de Grafos de Captura

Códigos de erro e êxito

ICaptureGraphBuilder2 Interface

Captura de vídeo