Trasmettere da un file di tipo 1

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Per trasmettere un file di tipo 1 durante l'anteprima del file, usare il grafico del filtro illustrato nel diagramma seguente.

trasmissione type-1 con anteprima

I filtri in questo grafico includono:

  • Avi Splitter analizza il file AVI. Per un file DV di tipo 1, il pin di output fornisce esempi DV interleaved.
  • Il filtro Infinite Pin Tee suddivide il DV interleaved in un flusso di trasmissione e in un flusso di anteprima. Entrambi i flussi contengono gli stessi dati interleaved. Questo grafico usa infinite pin tee anziché smart tee, perché non c'è pericolo di eliminare fotogrammi durante la lettura da un file, come avviene con l'acquisizione dinamica.
  • Il splitter DV suddivide il flusso interleaved in un flusso video DV, decodificato dal decodificatore video DV e da un flusso audio. Entrambi i flussi vengono sottoposti a rendering per l'anteprima.

Compilare questo grafico come segue:

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. Chiamare IGraphBuilder::AddSourceFilter per aggiungere il filtro di origine al grafico del filtro.
  2. Creare il splitter AVI e il tee pin infinito e aggiungerli al grafico.
  3. Chiamare ICaptureGraphBuilder2::RenderStream per connettere il filtro di origine al splitter AVI. Specificando MEDIATYPE_Interleaved per assicurarsi che il metodo non riesca se il file di origine non è un file DV di tipo 1. In questo caso, è possibile eseguire il backout e tentare di creare un grafo di trasmissione di tipo 2.
  4. Chiamare di nuovo RenderStream per instradare il flusso interleaved dal splitter AVI al tee pin infinito
  5. Chiamare RenderStream una terza volta per instradare un flusso dal tee pin infinito al filtro MSDV per la trasmissione al dispositivo.
  6. Chiamare RenderStream un'ultima volta per compilare la sezione di anteprima del grafico.

Se non si vuole visualizzare l'anteprima, è sufficiente connettere l'origine file al filtro MSDV:

hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);

Video digitale in DirectShow