다음을 통해 공유


파일에 프로젝트 작성

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

[이 API는 지원되지 않으며 나중에 변경되거나 사용할 수 없습니다.]

이 문서에서는 파일에 DirectShow Editing Services 프로젝트를 작성하는 방법을 설명합니다. 먼저 기본 렌더링 엔진을 사용하여 파일을 작성하는 방법을 설명합니다. 그런 다음 스마트 렌더링 엔진을 사용하는 스마트 압축을 설명합니다.

DirectShow Editing Services가 프로젝트를 렌더링하는 방법에 대한 개요는 렌더링 엔진 정보를 참조하세요.

기본 렌더링 엔진 사용

먼저 다음과 같이 그래프의 프런트 엔드를 빌드합니다.

  1. 렌더링 엔진을 만듭니다.
  2. 타임라인 지정합니다.
  3. 렌더링 범위를 설정합니다. (선택 사항)
  4. 그래프의 프런트 엔드를 빌드합니다.

다음 코드 예제에서는 이러한 단계를 보여줍니다.

IRenderEngine *pRender = NULL; 
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC,
    IID_IRenderEngine, (void**) &pRender);

hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );

다음으로, 필터 그래프에 멀티플렉서 및 파일 쓰기 필터를 추가합니다. 이 작업을 수행하는 가장 쉬운 방법은 캡처 그래프를 빌드하기 위한 DirectShow 구성 요소인 캡처 그래프 작성기를 사용하는 것입니다. 캡처 그래프 작성기는 ICaptureGraphBuilder2 인터페이스를 노출합니다. 다음 단계를 수행합니다.

  1. 캡처 그래프 작성기의 instance 만듭니다.
  2. 그래프에 대한 포인터를 가져와 그래프 작성기로 전달합니다.
  3. 출력 파일의 이름 및 미디어 형식을 지정합니다. 이 단계에서는 나중에 필요한 mux 필터에 대한 포인터도 가져옵니다.

다음 코드 예제에서는 이러한 단계를 보여줍니다.

CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, 
    IID_ICaptureGraphBuilder2, (void **)&pBuilder);

// Get a pointer to the graph front end.
IGraphBuilder *pGraph;
pRender->GetFilterGraph(&pGraph);
pBuilder->SetFiltergraph(pGraph);

// Create the file-writing section.
IBaseFilter *pMux;
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, 
    OLESTR("Output.avi"), &pMux, NULL);

마지막으로 프런트 엔드의 출력 핀을 mux 필터에 연결합니다.

  1. 그룹 수를 검색합니다.
  2. 각 핀에 대해 핀에 대한 포인터를 가져옵니다.
  3. 필요에 따라 압축 필터의 instance 만들어 스트림을 압축합니다. 압축기 유형은 그룹의 미디어 형식에 따라 달라집니다. 시스템 디바이스 열거자를 사용하여 사용 가능한 압축 필터를 열거할 수 있습니다. 자세한 내용은 디바이스 및 필터 열거를 참조하세요.
  4. 필요에 따라 키 프레임 속도와 같은 압축 매개 변수를 설정합니다. 이 단계는 문서의 뒷부분에 자세히 설명되어 있습니다.
  5. ICaptureGraphBuilder2::RenderStream을 호출합니다. 이 메서드는 핀, 압축 필터(있는 경우) 및 멀티플렉서에 대한 포인터를 사용합니다.

다음 코드 예제에서는 출력 핀을 연결하는 방법을 보여 줍니다.

long NumGroups;
pTimeline->GetGroupCount(&NumGroups);

// Loop through the groups and get the output pins.
for (i = 0; i < NumGroups; i++)
{
    IPin *pPin;
    if (pRender->GetGroupOutputPin(i, &pPin) == S_OK) 
    {
        IBaseFilter *pCompressor;
        // Create a compressor filter. (Not shown.)
        // Set compression parameters. (Not shown.)

        // Connect the pin.
        pBuilder->RenderStream(NULL, NULL, pPin, pCompressor, pMux);
        pCompressor->Release();
        pPin->Release();
    }
}

압축 매개 변수(이전의 4단계)를 설정하려면 IAMVideoCompression 인터페이스를 사용합니다. 이 인터페이스는 압축 필터의 출력 핀에 노출됩니다. 압축 필터의 핀을 열거하고 IAMVideoCompression에 대한 각 출력 핀을 쿼리합니다. (핀 열거에 대한 자세한 내용은 핀 열거를 참조하세요.) 이 단계에서 얻은 모든 인터페이스 포인터를 해제해야 합니다.

필터 그래프를 빌드한 후 필터 그래프 관리자에서 IMediaControl::Run 메서드를 호출합니다. 필터 그래프가 실행되면 파일에 데이터를 씁니다. 이벤트 알림을 사용하여 재생이 완료되기를 기다립니다. ( 이벤트에 응답을 참조하세요.) 재생이 완료되면 IMediaControl::Stop을 명시적으로 호출하여 필터 그래프를 중지해야 합니다. 그렇지 않으면 파일이 올바르게 작성되지 않습니다.

스마트 렌더링 엔진 사용

스마트 압축의 이점을 얻으려면 기본 렌더링 엔진 대신 스마트 렌더링 엔진을 사용합니다. 그래프를 빌드하는 단계는 거의 동일합니다. 주요 차이점은 압축이 파일 작성 섹션이 아니라 그래프의 프런트 엔드에서 처리된다는 것입니다.

중요

스마트 렌더링 엔진을 사용하여 Windows Media 파일을 읽거나 쓰지 마세요.

 

각 비디오 그룹에는 해당 그룹의 압축 형식을 지정하는 속성이 있습니다. 압축 형식은 높이, 너비, 비트 깊이 및 프레임 속도에서 그룹의 압축되지 않은 형식과 정확히 일치해야 합니다. 스마트 렌더링 엔진은 그래프를 생성할 때 압축 형식을 사용합니다. 압축 형식을 설정하기 전에 IAMTimelineGroup::SetMediaType을 호출하여 해당 그룹의 압축되지 않은 형식을 설정해야 합니다.

그룹의 압축 형식을 설정하려면 IAMTimelineGroup::SetSmartRecompressFormat 메서드를 호출합니다. 이 메서드는 SCompFmt0 구조체에 대한 포인터를 사용합니다. SCompFmt0 구조체에는 0이어야 하는 nFormatIdAM_MEDIA_TYPE 구조체인 MediaType의 두 멤버가 있습니다. 형식 정보를 사용하여 AM_MEDIA_TYPE 구조를 초기화합니다.

참고

최종 프로젝트의 형식이 원본 파일 중 하나와 같도록 하려면 미디어 감지기를 사용하여 원본 파일에서 직접 AM_MEDIA_TYPE 구조를 가져올 수 있습니다. IMediaDet::get_StreamMediaType 참조하세요.

 

다음 예제와 같이 SCompFmt0 변수를 long 형식의 포인터로 캐스팅합니다.

SCompFmt0 *pFormat = new SCompFmt0;
memset(pFormat, 0, sizeof(SCompFmt0));
pFormat->nFormatId = 0;

// Initialize pFormat->MediaType. (Not shown.)

pGroup->SetSmartRecompressFormat( (long*) pFormat );

스마트 렌더링 엔진은 호환되는 압축 필터를 자동으로 검색합니다. ISmartRenderEngine::SetGroupCompressor를 호출하여 그룹에 대한 압축 필터를 지정할 수도 있습니다.

그래프를 빌드하려면 이전 섹션에서 기본 렌더링 엔진에 대해 설명한 것과 동일한 단계를 사용합니다. 유일한 차이점은 다음과 같습니다.

  • 기본 렌더링 엔진이 아닌 스마트 렌더링 엔진을 사용합니다. 클래스 식별자가 CLSID_SmartRenderEngine.
  • 프런트 엔드를 빌드한 후 출력 핀을 렌더링하기 전에 압축 매개 변수를 설정합니다. ISmartRenderEngine::GetGroupCompressor 메서드를 호출하여 그룹의 압축 필터에 대한 포인터를 가져옵니다. 그런 다음, 앞에서 설명한 대로 IAMVideoCompression 인터페이스를 쿼리합니다.
  • 출력 핀을 렌더링할 때 압축 필터를 삽입할 필요가 없습니다. 스트림이 이미 압축되어 있습니다.

프로젝트 렌더링