다음을 통해 공유


입력 형식을 열거하려면

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

각 Windows Media 코덱은 압축을 위해 하나 이상의 입력 미디어를 허용합니다. Windows Media Format SDK를 사용하면 코덱에서 지원하는 형식보다 다양한 형식을 입력할 수 있습니다. SDK는 필요한 경우 비디오 프레임 크기 조정 또는 오디오 다시 샘플링과 같은 입력에 대한 사전 처리 변환을 수행하여 이 작업을 수행합니다. 어떤 경우든 작성하는 파일의 입력 형식이 기록기에 보내는 데이터와 일치하는지 확인해야 합니다. 각 코덱에는 프로필이 로드될 때 기록기에 설정된 기본 입력 미디어 형식이 있습니다. IWMWriter::GetInputProps를 호출하여 기본 입력 형식을 검사할 수 있습니다.

비디오 코덱은 IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 및 RGB 8 형식을 지원합니다. 오디오 코덱은 PCM 오디오를 지원합니다.

코덱에서 지원하는 입력 형식을 열거하려면 다음 단계를 수행합니다.

  1. 작성기 개체를 만들고 사용할 프로필을 설정합니다. 작성기에서 프로필을 설정하는 방법에 대한 자세한 내용은 작성기와 함께 프로필을 사용하려면을 참조하세요.
  2. 형식을 검사 입력 번호를 식별합니다. 입력 번호를 식별하는 방법에 대한 자세한 내용은 숫자 별 입력 식별을 참조하세요.
  3. IWMWriter::GetInputFormatCount를 호출하여 원하는 입력에서 지원하는 총 입력 형식 수를 검색합니다.
  4. 지원되는 모든 입력 형식을 반복하여 각각에 대해 다음 단계를 수행합니다.
    • IWMWriter::GetInputFormat을 호출하여 입력 형식에 대한 IWMInputMediaProps 인터페이스를 검색합니다.
    • 입력 형식에 대한 WM_MEDIA_TYPE 구조를 검색합니다. 구조체의 크기를 가져오기 위해 pType 매개 변수에 대해 NULL을 전달하여 IWMMediaProps::GetMediaType을 호출합니다. 그런 다음, 메모리를 할당하여 구조를 유지하고 GetMediaType 을 다시 호출하여 구조를 가져옵니다. IWMInputMediaPropsIWMMediaProps에서 상속되므로 이전 단계에서 검색된 IWMInputMediaProps의 instance GetMediaType을 호출할 수 있습니다.
    • WM_MEDIA_TYPE 구조체에 설명된 형식에는 입력 형식에 대한 모든 관련 정보가 포함됩니다. 미디어의 기본 형식은 WM_MEDIA_TYPE.subtype으로 식별됩니다. 비디오 스트림의 경우 pbFormat 멤버는 직사각형 크기를 포함하여 스트림에 대한 추가 세부 정보를 포함하는 동적으로 할당된 WMVIDEOINFOHEADER 구조를 가리킵니다. 입력 프레임의 크기는 코덱에서 지원하는 크기와 정확히 일치할 필요가 없습니다. 일치하지 않는 경우 대부분의 경우 SDK 런타임 구성 요소는 입력 비디오 프레임의 크기를 코덱이 허용할 수 있는 내용으로 자동으로 조정합니다.

다음 예제 코드는 매개 변수로 전달된 하위 형식의 입력 형식을 찾습니다. 이 코드를 사용하는 방법에 대한 자세한 내용은 코드 예제 사용을 참조하세요.

HRESULT FindInputFormat(IWMWriter* pWriter, 
                       DWORD dwInput,
                       GUID guidSubType,
                       IWMInputMediaProps** ppProps)
{
    DWORD   cFormats = 0;
    DWORD   cbSize   = 0;

    WM_MEDIA_TYPE*      pType  = NULL;
    IWMInputMediaProps* pProps = NULL;

    // Set the ppProps parameter to point to NULL. This will
    //  be used to check the results of the function later.
    *ppProps = NULL;

    // Find the number of formats supported by this input.
    HRESULT hr = pWriter->GetInputFormatCount(dwInput, &cFormats);
    if (FAILED(hr))
    {
        goto Exit;
    }
    // Loop through all of the supported formats.
    for (DWORD formatIndex = 0; formatIndex < cFormats; formatIndex++)
    {
        // Get the input media properties for the input format.
        hr = pWriter->GetInputFormat(dwInput, formatIndex, &pProps);
        if (FAILED(hr))
        {
            goto Exit;
        }
        // Get the size of the media type structure.
        hr = pProps->GetMediaType(NULL, &cbSize);
        if (FAILED(hr))
        {
            goto Exit;
        }
        // Allocate memory for the media type structure.
        pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
        if (pType == NULL)
        {
            hr = E_OUTOFMEMORY;
            goto Exit;
        }
        
        // Get the media type structure.
        hr = pProps->GetMediaType(pType, &cbSize);
        if (FAILED(hr))
        {
            goto Exit;
        }

        if(pType->subtype == guidSubType)
        {
            *ppProps = pProps;
            (*ppProps)->AddRef();
            goto Exit;
        }

        // Clean up for next iteration.
        delete [] pType;
        pType = NULL;
        SAFE_RELEASE(pProps);
    } // End for formatIndex.

    // If execution made it to this point, no matching format was found.
    hr = NS_E_INVALID_INPUT_FORMAT;

Exit:
    delete [] pType;
    SAFE_RELEASE(pProps);
    return hr;
}

IWMWriter 인터페이스

ASF 파일 작성