다음을 통해 공유


압축되지 않은 RGB에 DV 캡처

[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, Media Foundation 오디오/비디오 캡처대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngineAudio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

이 예제에서는 미리 보는 동안 캠코더에서 DV를 캡처하고 압축되지 않은 RGB로 파일에 저장하는 방법을 보여줍니다. 다음 다이어그램에 표시된 필터 그래프를 사용합니다.

압축되지 않은 rgb를 파일

DV 분할기 필터는 인터리브 오디오/비디오를 별도의 비디오 및 오디오 스트림으로 분할합니다. DV로 인코딩된 비디오는 압축되지 않은 RGB 비디오를 출력하는 DV 비디오 디코더 필터로 이동합니다. RGB 비디오는 스마트 티 필터를 통해 AVI Mux 필터(캡처용) 및 비디오 렌더러(미리 보기용)로 라우팅됩니다. 한편 DV 분할자의 오디오 스트림은 무한 핀 티 필터를 통해 AVI Mux 및 오디오 렌더러로 이동합니다. Filter Graph Manager는 샘플의 타임스탬프 및 그래프 참조 클록을 사용하여 이러한 모든 스트림을 동기화된 상태로 유지합니다.

이 그래프는 불필요하게 복잡해 보일 수 있지만 DV로 인코딩된 비디오 스트림이 한 번만 디코딩되어 CPU 요구 사항을 최소화합니다. 또한 오디오가 무한 핀 티 필터를 통과하는 동안 비디오가 스마트 티 필터를 통과합니다. 스마트 티는 캡처 성능을 향상시키기 위해 미리 보기 프레임을 삭제할 수 있으며, 이는 비디오에는 바람직하지만 삭제된 샘플이 눈에 띄는 오디오에는 적합하지 않습니다. 또한 오디오는 비디오보다 훨씬 낮은 대역폭이 필요하기 때문에 파일에 오디오를 삭제할 가능성이 상대적으로 적습니다.

이 그래프는 한 번에 한 섹션씩 작성해야 하지만 RenderStream 메서드는 여전히 도움이 될 수 있습니다. 다음 코드를 사용합니다.

// 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);

DV 분할자, DV 비디오 디코더, 스마트 티 및 무한 핀 티 필터를 만들고 필터 그래프에 각각 추가해야 합니다. (간단히 하기 위해 이러한 단계는 이전 코드에서 생략됩니다.) 이 예제에서는 ICaptureGraphBuilder2::FindPin 메서드를 사용하여 스마트 티 필터에서 캡처 및 미리 보기 핀을 찾습니다. 캡처는 항상 출력 핀 0이고 미리 보기는 출력 핀 1입니다.

DirectShow 디지털 비디오