다음을 통해 공유


파일 싱크에 메타데이터 추가

ASF 파일 싱크는 애플리케이션이 ASF 미디어 데이터를 파일에 보관하는 데 사용할 수 있는 Media Foundation에서 제공하는 IMFMediaSink 의 구현입니다. ASF 미디어 싱크의 개체 모델 및 일반 사용에 대한 자세한 내용은 ASF 미디어 싱크를 참조하세요.

ASF 파일 싱크를 만든 후에는 출력 파일의 스트림 및 인코딩 정보에 대한 정보로 구성해야 합니다. 이러한 절차는 ASF 파일 싱크에 스트림 정보 추가 및 파일 싱크의 속성 설정에 설명되어 있습니다. 또한 "Author", Title"과 같은 이름/값 쌍이 포함된 메타데이터 정보를 추가할 수도 있습니다. 이 항목에서는 최종 ASF 헤더 개체에 표시되도록 파일 싱크에 메타데이터 정보를 추가하는 프로세스에 대해 설명합니다.

인코딩 토폴로지를 빌드하기 전에 ASF 파일 싱크에 메타데이터 정보를 추가할 수 있습니다. 파일 싱크에 대한 ASF ContentInfo 개체는 메타데이터 속성을 추적하고 IMFMetadata 인터페이스를 통해 애플리케이션에 노출됩니다. 파일에 VBR(가변 비트 전송률) 스트림이 포함되어 있는지를 나타내는 "IsVBR"과 같은 이러한 속성 중 일부는 설정된 스트림 인코딩 속성을 구문 분석하여 파일 싱크에 의해 자동으로 설정됩니다.

속성의 전체 목록은 형식 SDK 설명서의 "특성 목록" 항목을 참조하세요.

ASF 파일 싱크에서 IMFMetadata 인터페이스 사용

  1. ASF 파일 싱크 개체를 쿼리하여 IMFMetadataProvider 인터페이스 구현에 대한 포인터를 가져옵니다.

  2. IMFMetadataProvider::GetMFMetadata를 호출하여 IMFMetadata 포인터를 가져옵니다.

    pPresentationDescriptor 매개 변수는 무시되고 애플리케이션은 NULL을 전달할 수 있습니다. 애플리케이션이 dwStreamIdentifier 매개 변수의 스트림 식별자로 0을 전달하는 경우 메서드는 전체 ASF 파일에 적용되는 메타데이터를 검색합니다. 그렇지 않으면 스트림에 대한 메타데이터만 검색됩니다.

  3. IMFMetadata::GetAllPropertyNames를 호출하여 미디어 콘텐츠에 설정된 파일 인코딩 속성 목록을 검색합니다.

  4. IMFMetadata::GetProperty를 호출하여 속성 값을 가져옵니다.

예제

다음 예제 코드에서는 ASF 파일에 설정된 속성 이름 및 값을 열거하는 방법을 보여 있습니다.

/////////////////////////////////////////////////////////////////////
// Name: ListASFProperties
//
// Enumerates the metadata properties of the ASF file. 
//
// pContentInfo: Pointer to the ASF ContentInfo object.
/////////////////////////////////////////////////////////////////////

HRESULT ListASFProperties(IMFASFContentInfo *pContentInfo)
{
    HRESULT hr = S_OK;
    
    PROPVARIANT varNames;
    PropVariantInit(&varNames);

    PROPVARIANT varValue;
    PropVariantInit(&varValue);

    IMFMetadataProvider* pProvider = NULL;
    IMFMetadata* pMetadata = NULL;

    // Query the ContentInfo object for IMFMetadataProvider.
    CHECK_HR(hr = pContentInfo->QueryInterface(IID_IMFMetadataProvider,
        (void**)&pProvider));

    // Get a pointer to IMFMetadata for file-wide metadata.
    CHECK_HR(hr = pProvider->GetMFMetadata(NULL, 0, 0, &pMetadata));

    // Get the property names that are stored in the metadata object.
    CHECK_HR(hr = pMetadata->GetAllPropertyNames(&varNames));

    // Loop through the properties and get their values.
    if (varNames.vt == (VT_VECTOR | VT_LPWSTR))
    {
        ULONG cElements = varNames.calpwstr.cElems;
        for (ULONG i = 0; i < cElements; i++)
        {
            const WCHAR* sName = varNames.calpwstr.pElems[i];
            CHECK_HR(hr = pMetadata->GetProperty(sName, &varValue));
            //Use the property values. Not shown.
            PropVariantClear(&varValue);
        }
    }
done:
    PropVariantClear(&varNames);
    PropVariantClear(&varValue);
    SAFE_RELEASE (pMetaData);
    SAFE_RELEASE (pProvider);
    return hr;
}

ASF 미디어 싱크

파이프라인 계층 ASF 구성 요소

Media Foundation의 ASF 지원