Two-Pass 인코딩 사용(Windows Media Format 11 SDK)

[이 페이지와 연결된 기능인 Windows Media Format 11 SDK는 레거시 기능입니다. 원본 판독기 및 싱크 작성기에 의해 대체되었습니다. 원본 판독기 및 싱크 작성기는 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 Windows Media Format 11 SDK 대신 소스 판독기 및 싱크 기록기를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

일부 코덱은 특정 형식에 대해 2단계 인코딩을 지원합니다. 경우에 따라 코덱은 지정된 형식을 두 개의 패스로 인코딩해야 합니다. 2단계 인코딩을 사용하는 경우 인코딩 패스 전에 스트림에 대한 샘플을 코덱으로 보냅니다. 코덱은 샘플을 분석하고 분석에 따라 인코딩 패스를 구성합니다. 이렇게 하면 더 효율적으로 인코딩된 파일이 생성됩니다.

코덱이 지정된 형식에 대해 원패스 인코딩 또는 2-pass 또는 둘 다를 지원하는지 확인하려면 g_wszNumPasses 및 적절한 값을 사용하여 IWMCodecInfo3::SetCodecEnumerationSetting 을 호출한 다음 원하는 형식이 반환되는지 확인하기 위해 형식을 열거합니다. 2단계 인코딩을 지원하는 Windows Media 코덱에 대한 자세한 내용은 인코딩 방법 선택을 참조하세요.

IWMWriterPreprocess 인터페이스의 메서드를 호출하여 Windows Media Format SDK에서 2단계 인코딩을 사용할 수 있습니다.

특정 형식에 대해 2단계 인코딩이 필요하지만 애플리케이션이 전처리 패스를 수행하지 못하는 경우 writeSample 에 대한 첫 번째 호출은 NS_E_INVALID_NUM_PASSES 함께 실패합니다.

다음 예제 함수는 2단계 인코딩을 수행하는 방법을 보여 줍니다. 이 함수는 작성기가 프로필로 설정되고 시작된 후에 호출됩니다. 이 코드를 사용하는 방법에 대한 자세한 내용은 코드 예제 사용을 참조하세요.

HRESULT PreProcess(IWMWriter* pWriter, DWORD dwInputNum)
{
    HRESULT hr        = S_OK;
    DWORD   dwMaxPass = 0;

    IWMWriterPreprocess* pPreProc = NULL;

    // Get the writer preprocessor interface.
    hr = pWriter->QueryInterface(IID_IWMWriterPreprocess, 
                                 (void**) &pPreProc);
    GOTO_EXIT_IF_FAILED(hr);

    // Check that the input can be preprocessed.
    hr = pPreProc->GetMaxPreprocessingPasses(dwInputNum,0, &dwMaxPass);
    GOTO_EXIT_IF_FAILED(hr);

    if(dwMaxPass == 0)
    {
        hr = NS_E_INVALID_REQUEST;
        goto Exit;
    }

    // Set the number of preprocessing passes to the maximum.
    hr = pPreProc->SetNumPreprocessingPasses(dwInputNum, 0, dwMaxPass);
    GOTO_EXIT_IF_FAILED(hr);

    // Call BeginWriting before calling BeginPreprocessingPass
    hr = pWriter->BeginWriting();

    // Start preprocessing the first pass.
    hr = pPreProc->BeginPreprocessingPass(dwInputNum, 0);
    GOTO_EXIT_IF_FAILED(hr);

    // TODO: Make repeated calls to pPreProc->PreprocessSample to
    // preprocess all the samples in the stream.

    // End preprocessing.
    hr = pPreProc->EndPreprocessingPass(dwInputNum, 0);
    GOTO_EXIT_IF_FAILED(hr);

    // TODO: If the maximum number of preprocessing passes is greater
    // than one, repeat the preprocessing steps for each pass.

Exit:
    SAFE_RELEASE(pPreProc);
    Return hr;
}

ASF 파일 작성