Windows Vista 中的中繼資料提供者
在 Windows Vista 中,Microsoft Media Foundation 會透過 IMFMetadata 介面公開中繼資料。
讀取中繼資料
若要從媒體來源讀取中繼資料,請執行下列步驟:
- 取得媒體來源之 IMFMediaSource 介面的指標。 您可以使用 IMFSourceResolver 介面來取得 IMFMediaSource 指標。
- 呼叫 IMFMediaSource::CreatePresentationDescriptor 以取得媒體來源的簡報描述元。
- 在媒體來源上呼叫 MFGetService ,以取得 IMFMetadataProvider 介面的指標。 在MFGetService的guidService參數中,指定值MF_METADATA_PROVIDER_SERVICE。 如果來源不支援 IMFMetadataProvider 介面, MFGetService 會傳回 MF_E_UNSUPPORTED_SERVICE。
- 呼叫 IMFMetadataProvider::GetMFMetadata ,並傳入簡報描述元的指標。 這個方法會傳回 IMFMetadata 介面的指標。
- 若要取得資料流程層級中繼資料,請先呼叫 IMFStreamDescriptor::GetStreamIdentifier 以取得資料流程識別碼。 然後在GetMFMetadata的dwStreamIdentifier參數中傳遞資料流程識別碼。
- 若要取得簡報層級中繼資料,請將 dwStreamIdentifier 設定為零。
- [選擇性]呼叫 IMFMetadata::GetAllLanguages 以取得可用的中繼資料語言清單。 語言是使用 RFC 1766 相容的語言標記來識別。
- [選擇性]呼叫 IMFMetadata::SetLanguage 以選取語言。
- [選擇性]呼叫 IMFMetadata::GetAllPropertyNames 以取得此資料流程或簡報之所有中繼資料屬性的名稱清單。
- 呼叫 IMFMetadata::GetProperty 以取得特定的中繼資料屬性值,並傳入屬性的名稱。
下列程式碼顯示步驟 2–4:
HRESULT GetMetadata(
IMFMediaSource *pSource, IMFMetadata **ppMetadata, DWORD dwStream = 0)
{
IMFPresentationDescriptor *pPD = NULL;
IMFMetadataProvider *pProvider = NULL;
HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
if (FAILED(hr))
{
goto done;
}
hr = MFGetService(
pSource, MF_METADATA_PROVIDER_SERVICE, IID_PPV_ARGS(&pProvider));
if (FAILED(hr))
{
goto done;
}
hr = pProvider->GetMFMetadata(pPD, dwStream, 0, ppMetadata);
done:
SafeRelease(&pPD);
SafeRelease(&pProvider);
return hr;
}
下列程式碼顯示步驟 7–8。
DisplayProperty
假設 是顯示PROPVARIANT值的函式。
HRESULT DisplayMetadata(IMFMetadata *pMetadata)
{
PROPVARIANT varNames;
HRESULT hr = pMetadata->GetAllPropertyNames(&varNames);
if (FAILED(hr))
{
return hr;
}
for (ULONG i = 0; i < varNames.calpwstr.cElems; i++)
{
wprintf(L"%s\n", varNames.calpwstr.pElems[i]);
PROPVARIANT varValue;
hr = pMetadata->GetProperty( varNames.calpwstr.pElems[i], &varValue );
if (SUCCEEDED(hr))
{
DisplayProperty(varValue);
PropVariantClear(&varValue);
}
}
PropVariantClear(&varNames);
return hr;
}
相關主題