Partilhar via


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.

capturando rgb não compactado no arquivo

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.

Vídeo digital no DirectShow