Transmitir do arquivo tipo 1
[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.]
Para transmitir um arquivo tipo 1 durante a visualização do arquivo, use o grafo de filtro mostrado no diagrama a seguir.
Os filtros neste grafo incluem:
- O Divisor AVI analisa o arquivo AVI. Para um arquivo DV tipo 1, o pino de saída fornece exemplos de DV intercalados.
- O filtro Infinite Pin Tee divide o DV intercalado em um fluxo de transmissão e em um fluxo de visualização. Ambos os fluxos contêm os mesmos dados intercalados. (Este grafo usa o Pin Tee Infinito em vez do Tee Inteligente, porque não há perigo de soltar quadros ao ler de um arquivo, como há com a captura ao vivo.)
- O Divisor de DV divide o fluxo intercalado em um fluxo de vídeo DV, que é decodificado pelo Decodificador de Vídeo DV e um fluxo de áudio. Ambos os fluxos são renderizados para visualização.
Crie este grafo da seguinte maneira:
ICaptureGraphBuilder2 *pBuilder; // Capture graph builder.
IBaseFilter *pDV; // DV capture filter (MSDV)
// Initialize pDV (not shown).
// Create and initialize the Capture Graph Builder (not shown).
// Add the Infinite Pin Tee filter to the graph.
IBaseFilter *pTee;
hr = CoCreateInstance(CLSID_InfTee, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pTee));
hr = pGraph->AddFilter(pTee, L"Tee");
// Add the File Source filter to the graph.
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(
L"C:\\YourFileNameHere.avi",
L"Source",
&pFileSource);
// Add the AVI Splitter filter to the graph.
IBaseFilter *pAviSplit;
hr = CoCreateInstance(CLSID_AviSplitter, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pAviSplit));
hr = pGraph->AddFilter(pAviSplit, L"AVI Splitter");
// Connect the file source to the AVI Splitter.
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pAviSplit);
if (FAILED(hr))
{
// This is not an AVI file.
}
// Connect the file source to the Infinite Pin Tee.
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pAviSplit, 0, pTee);
if (FAILED(hr))
{
// This is not a type-1 DV file.
}
// Render one stream from the Infinite Pin Tee to MSDV, for transmit.
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);
// Render another stream from the Infinite Pin Tee for preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
- Chame IGraphBuilder::AddSourceFilter para adicionar o filtro de origem ao grafo de filtro.
- Crie o Divisor AVI e o Infinito Pin Tee e adicione-os ao grafo.
- Chame ICaptureGraphBuilder2::RenderStream para conectar o filtro de origem ao Divisor AVI. Especificar MEDIATYPE_Interleaved para garantir que o método falhe se o arquivo de origem não for um arquivo DV tipo 1. Nesse caso, você pode recuar e tentar criar um grafo de transmissão tipo 2.
- Chame RenderStream novamente para rotear o fluxo intercalado do Divisor AVI para o Tee de Pino Infinito
- Chame RenderStream uma terceira vez para rotear um fluxo do Infinito Pin Tee para o filtro MSDV, para transmitir para o dispositivo.
- Chame RenderStream uma última vez para criar a seção de visualização do grafo.
Se você não quiser visualizar, basta conectar a origem do arquivo ao filtro MSDV:
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);
Tópicos relacionados