Capturar DV para RGB não compactado
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na 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 Captura de Áudio/Vídeo no 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.]
Este exemplo mostra como capturar DV da filmadora e salvá-lo em um arquivo como RGB não compactado durante a visualização. Use o grafo de filtro mostrado no diagrama a seguir.
O filtro Divisor dv divide o áudio/vídeo intercalado em fluxos de áudio e vídeo separados O vídeo codificado em DV vai para o filtro de Decodificador de Vídeo DV , que gera vídeo RGB não compactado. O vídeo RGB é roteado por meio do filtro Smart Tee para o filtro AVI Mux (para captura) e o renderizador de vídeo (para visualização). Enquanto isso, o fluxo de áudio do Divisor de DV passa pelo filtro Infinito Pin Tee para o AVI Mux e o renderizador de áudio. O Gerenciador de Grafo de Filtro mantém todos esses fluxos sincronizados, usando os carimbos de data/hora nos exemplos e no relógio de referência do grafo.
Esse grafo pode parecer desnecessariamente complicado, mas garante que o fluxo de vídeo codificado em DV seja decodificado apenas uma vez, o que minimiza os requisitos de CPU. Além disso, observe que o vídeo passa pelo filtro Smart Tee enquanto o áudio passa pelo filtro Infinito Pin Tee. O Smart Tee pode descartar quadros de visualização para melhorar o desempenho da captura, o que é desejável para vídeo, mas não para áudio, onde amostras descartadas são altamente perceptíveis. Além disso, como o áudio requer largura de banda muito menor do que o vídeo, há relativamente pouca chance de soltar áudio no arquivo.
Você deve criar esse grafo uma seção de cada vez, mas o método RenderStream ainda pode ajudar. Use o seguinte código:
// Build the file-writing section of the graph.
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,
OLESTR("C:\\Example3.avi"), &pMux, 0);
// MSDV to DV splitter.
IBaseFilter *pDVSplit; // Create the DV Splitter (CLSID_DVSplitter)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pDV, 0, pDVSplit);
// Splitter to DV Decoder to Smart Tee.
IBaseFilter *pDVDec; // Create the DV Decoder (CLSID_DVVideoCodec)
IBaseFilter *pSmartTee; // Create the Smart Tee (CLSID_SmartTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Video, pDVSplit, pDVDec,
pSmartTee);
// Smart Tee (video) to Avi Mux.
IPin *pPin1;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 0, &pPin1);
hr = pBuilder->RenderStream(0, 0, pPin1, 0, pMux);
// Smart Tee to preview.
IPin *pPin2;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 1, &pPin2);
hr = pBuilder->RenderStream(0, 0, pPin2, 0, pMux);
// DV Splitter (audio) to Infinite Tee to Avi Mux.
IBaseFilter *pTee; // Create the Infinite Pin Tee (CLSID_InfTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Audio, pDVSplit, pTee, pMux);
// Infinite Pin Tee to preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
Você deve criar os filtros Decodificador de Vídeo DV, Smart Tee e Infinite Pin Tee e adicionar cada um ao grafo de filtro. (Para resumir, essas etapas são omitidas do código anterior.) Este exemplo usa o método ICaptureGraphBuilder2::FindPin para localizar os pinos de captura e visualização no filtro Smart Tee; capture é sempre o pino de saída 0 e a visualização é o pino de saída 1.
Tópicos relacionados