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.

transmissão do tipo 1 com versão prévia

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);
  1. Chame IGraphBuilder::AddSourceFilter para adicionar o filtro de origem ao grafo de filtro.
  2. Crie o Divisor AVI e o Infinito Pin Tee e adicione-os ao grafo.
  3. 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.
  4. Chame RenderStream novamente para rotear o fluxo intercalado do Divisor AVI para o Tee de Pino Infinito
  5. Chame RenderStream uma terceira vez para rotear um fluxo do Infinito Pin Tee para o filtro MSDV, para transmitir para o dispositivo.
  6. 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);

Vídeo digital no DirectShow