다음을 통해 공유


AVI 파일에 비디오 캡처

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

다음 그림에서는 AVI 파일에 비디오를 캡처하기 위한 가장 간단한 그래프를 보여 줍니다.

avi 비디오 캡처 그래프

AVI Mux 필터는 캡처 핀에서 비디오 스트림을 가져와서 AVI 스트림으로 패키지합니다. 오디오 스트림을 AVI Mux 필터에 연결할 수도 있습니다. 이 경우 mux는 두 스트림을 인터리브합니다. 파일 기록기 필터는 AVI 스트림을 디스크에 씁니다.

그래프를 빌드하려면 먼저 다음과 같이 ICaptureGraphBuilder2::SetOutputFileName 메서드를 호출합니다.

IBaseFilter *pMux;
hr = pBuild->SetOutputFileName(
    &MEDIASUBTYPE_Avi,  // Specifies AVI for the target file.
    L"C:\\Example.avi", // File name.
    &pMux,              // Receives a pointer to the mux.
    NULL);              // (Optional) Receives a pointer to the file sink.

첫 번째 매개 변수는 파일 형식(이 경우 AVI)을 지정합니다. 두 번째 매개 변수는 파일 이름을 제공합니다. AVI의 경우 SetOutputFileName 메서드는 AVI Mux 필터와 파일 기록기 필터를 공동 생성하고 그래프에 추가합니다. 또한 IFileSinkFilter::SetFileName 메서드를 호출하여 파일 작성기 필터의 파일 이름을 설정하고 두 필터를 연결합니다. 메서드는 세 번째 매개 변수에서 AVI Mux에 대한 포인터를 반환합니다. 필요에 따라 네 번째 매개 변수의 IFileSinkFilter 인터페이스에 대한 포인터를 반환합니다. 이 인터페이스가 필요하지 않은 경우 이전 예제와 같이 이 매개 변수를 NULL로 설정할 수 있습니다.

다음으로, 다음과 같이 ICaptureGraphBuilder2::RenderStream 메서드를 호출하여 캡처 필터를 AVI Mux에 연결합니다.

hr = pBuild->RenderStream(
    &PIN_CATEGORY_CAPTURE, // Pin category.
    &MEDIATYPE_Video,      // Media type.
    pCap,                  // Capture filter.
    NULL,                  // Intermediate filter (optional).
    pMux);                 // Mux or file sink filter.

// Release the mux filter.
pMux->Release();

첫 번째 매개 변수는 캡처를 위해 PIN_CATEGORY_CAPTURE 핀 범주를 제공합니다. 두 번째 매개 변수는 미디어 형식을 제공합니다. 세 번째 매개 변수는 캡처 필터의 IBaseFilter 인터페이스에 대한 포인터입니다. 네 번째 매개 변수는 선택 사항입니다. 이를 통해 mux 필터에 전달하기 전에 인코더와 같은 중간 필터를 통해 비디오 스트림을 라우팅할 수 있습니다. 그렇지 않으면 이전 예제와 같이 이 매개 변수를 NULL로 설정합니다. 다섯 번째 매개 변수는 mux 필터에 대한 포인터입니다. 이 포인터는 SetOutputFileName 메서드를 호출하여 가져옵니다.

오디오를 캡처하려면 미디어 유형이 MEDIATYPE_Audio RenderStream을 호출합니다. 두 개의 개별 디바이스에서 오디오 및 비디오를 캡처하는 경우 오디오 스트림을 master 스트림으로 만드는 것이 좋습니다. 이렇게 하면 AVI Mux 필터가 오디오 스트림과 일치하도록 비디오 스트림의 재생 속도를 조정하기 때문에 두 스트림 간의 드리프트를 방지할 수 있습니다. master 스트림을 설정하려면 AVI Mux 필터에서 IConfigAviMux::SetMasterStream 메서드를 호출합니다.

IConfigAviMux *pConfigMux = NULL;
hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux);
if (SUCCEEDED(hr))
{
    pConfigMux->SetMasterStream(1);
    pConfigMux->Release();
}

SetMasterStream에 대한 매개 변수는 RenderStream을 호출하는 순서에 따라 결정되는 스트림 번호입니다. 예를 들어 비디오에 대해 RenderStream을 먼저 호출한 다음 오디오의 경우 비디오는 스트림 0이고 오디오는 스트림 1입니다.

IConfigInterleaving::p ut_Mode 메서드를 호출하여 AVI Mux 필터가 오디오 및 비디오 스트림을 인터리브하는 방법을 설정할 수도 있습니다.

IConfigInterleaving *pInterleave = NULL;
hr = pMux->QueryInterface(IID_IConfigInterleaving, (void**)&pInterleave);
if (SUCCEEDED(hr))
{
    pInterleave->put_Mode(INTERLEAVE_CAPTURE);
    pInterleave->Release();
}

INTERLEAVE_CAPTURE 플래그를 사용하면 AVI Mux는 비디오 캡처에 적합한 속도로 인터리빙을 수행합니다. 인터리빙이 없음을 의미하는 INTERLEAVE_NONE 사용할 수도 있습니다. AVI Mux는 도착하는 순서대로 데이터를 작성하기만 하면 됩니다. INTERLEAVE_FULL 플래그는 AVI Mux가 전체 인터리빙을 수행한다는 것을 의미합니다. 그러나 이 모드는 가장 많이 들은 것이 필요하기 때문에 비디오 캡처에 덜 적합합니다.

비디오 스트림 인코딩

캡처 필터와 AVI Mux 필터 사이에 인코더 필터를 삽입하여 비디오 스트림을 인코딩할 수 있습니다. 시스템 디바이스 열거자 또는 필터 매퍼를 사용하여 인코더 필터를 선택합니다. 자세한 내용은 디바이스 및 필터 열거를 참조하세요.

다음 예제에서 굵게 표시된 RenderStream에 대한 네 번째 매개 변수로 인코더 필터를 지정합니다.

IBaseFilter *pEncoder;
/* Create the encoder filter (not shown). */
// Add it to the filter graph.
pGraph->AddFilter(pEncoder, L"Encoder");

/* Call SetOutputFileName as shown previously. */

// Render the stream.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, 
    pCap, 
pEncoder, pMux);
pEncoder->Release();

인코더 필터는 인코딩 매개 변수를 설정하기 위해 IAMVideoCompression 또는 기타 인터페이스를 지원할 수 있습니다. 가능한 인터페이스 목록은 파일 인코딩 및 디코딩 인터페이스를 참조하세요.

파일에 비디오 캡처