다음을 통해 공유


Type-1 파일에서 전송

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

파일을 미리 보는 동안 형식 1 파일을 전송하려면 다음 다이어그램에 표시된 필터 그래프를 사용합니다.

미리 보기로 type-1 전송

이 그래프의 필터는 다음과 같습니다.

  • AVI 분할은 AVI 파일을 구문 분석합니다. 형식 1 DV 파일의 경우 출력 핀은 인터리브된 DV 샘플을 제공합니다.
  • 무한 핀 티 필터는 인터리브된 DV를 전송 스트림 및 미리 보기 스트림으로 분할합니다. 두 스트림 모두 동일한 인터리브 데이터를 포함합니다. (이 그래프는 라이브 캡처가 있는 것처럼 파일에서 읽을 때 프레임을 삭제할 위험이 없으므로 스마트 티 대신 무한 핀 티를 사용합니다.)
  • DV 분할기는 인터리브 스트림을 DV 비디오 디코더 및 오디오 스트림에 의해 디코딩되는 DV 비디오 스트림으로 분할합니다. 두 스트림 모두 미리 보기용으로 렌더러됩니다.

다음과 같이 이 그래프를 작성합니다.

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. IGraphBuilder::AddSourceFilter를 호출하여 필터 그래프에 원본 필터를 추가합니다.
  2. AVI 분할기 및 무한 핀 티를 만들고 그래프에 추가합니다.
  3. ICaptureGraphBuilder2::RenderStream을 호출하여 원본 필터를 AVI 분할자에 연결합니다. 소스 파일이 형식 1 DV 파일이 아닌 경우 메서드가 실패하도록 MEDIATYPE_Interleaved 지정합니다. 이 경우 백업하고 대신 type-2 전송 그래프를 빌드할 수 있습니다.
  4. RenderStream을 다시 호출하여 인터리브 스트림을 AVI 분할자에서 무한 핀 티로 라우팅합니다.
  5. 디바이스로 전송하기 위해 RenderStream을 세 번째로 호출하여 무한 핀 티에서 MSDV 필터로 하나의 스트림을 라우팅합니다.
  6. 마지막으로 RenderStream을 호출하여 그래프의 미리 보기 섹션을 빌드합니다.

미리 보기를 원하지 않는 경우 파일 원본을 MSDV 필터에 연결하기만 하면 됩니다.

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

DirectShow의 디지털 비디오