AVI 파일에 비디오 캡처
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
다음 그림에서는 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 또는 기타 인터페이스를 지원할 수 있습니다. 가능한 인터페이스 목록은 파일 인코딩 및 디코딩 인터페이스를 참조하세요.
관련 항목