Transmitir desde el archivo de tipo 1
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Para transmitir un archivo de tipo 1 al obtener una vista previa del archivo, use el gráfico de filtros que se muestra en el diagrama siguiente.
Los filtros de este gráfico incluyen:
- El divisor AVI analiza el archivo AVI. Para un archivo DV de tipo 1, el pin de salida entrega muestras dv intercaladas.
- El filtro Infinite Pin Tee divide el DV intercalado en una secuencia de transmisión y una secuencia de vista previa. Ambas secuencias contienen los mismos datos intercalados. (Este grafo usa infinite Pin Tee en lugar de Smart Tee, porque no hay ningún peligro de quitar fotogramas al leer desde un archivo, ya que hay con la captura en directo).
- El divisor dv divide la secuencia intercalada en una secuencia de vídeo DV, que el descodificador de vídeo DV y una secuencia de audio. Ambos flujos se representan para la versión preliminar.
Compile este grafo de la siguiente manera:
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);
- Llame a IGraphBuilder::AddSourceFilter para agregar el filtro de origen al gráfico de filtros.
- Cree el divisor AVI y el Pin Infinito Tee y agréguelos al grafo.
- Llame a ICaptureGraphBuilder2::RenderStream para conectar el filtro de origen al divisor avi. Especificar MEDIATYPE_Interleaved para asegurarse de que se produce un error en el método si el archivo de origen no es un archivo DV de tipo 1. En ese caso, puede volver atrás e intentar compilar un gráfico de transmisión de tipo 2 en su lugar.
- Vuelva a llamar a RenderStream para enrutar la secuencia intercalada desde el divisor AVI al pin infinito Tee.
- Llame a RenderStream una tercera vez para enrutar una secuencia desde infinite Pin Tee al filtro MSDV para transmitir al dispositivo.
- Llame a RenderStream una última vez para compilar la sección de vista previa del grafo.
Si no desea obtener una vista previa, basta con conectar el origen del archivo al filtro MSDV:
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);
Temas relacionados