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;
}
相關主題