將中繼資料新增至檔案接收
ASF 檔案接收是媒體基礎所提供的 IMFMediaSink 實作,應用程式可用來將 ASF 媒體資料封存至檔案。 如需 ASF 媒體接收的物件模型和一般使用方式的相關資訊,請參閱 ASF 媒體接收。
建立 ASF 檔案接收之後,必須使用輸出檔中資料流程和編碼資訊的相關資訊進行設定。 這些程式說明在檔案 接收中將資料流程資訊新增至 ASF 檔案接收 和 設定屬性。 此外,您也可以新增中繼資料資訊,包括名稱/值組,例如「作者」、「標題」。 本主題描述將中繼資料資訊新增至檔案接收的程式,使其出現在最終 的 ASF 標頭物件中。
您可以在建置編碼拓撲之前,將中繼資料資訊新增至 ASF 檔案接收。 檔案接收的 ASF ContentInfo 物件會持續追蹤中繼資料屬性,並透過 IMFMetadata 介面向應用程式公開。 其中一些屬性,例如 「IsVBR」,指出檔案是否包含變數位元速率 (VBR) 資料流程,藉由剖析所設定的資料流程編碼屬性,自動由檔案接收設定。
如需完整的屬性清單,請參閱格式 SDK 檔中的主題。
在 ASF 檔案接收上使用 IMFMetadata 介面
查詢 ASF 檔案接收物件,以取得 其 IMFMetadataProvider 介面實作的指標。
呼叫 IMFMetadataProvider::GetMFMetadata 以取得 IMFMetadata 指標。
pPresentationDescriptor參數會被忽略,而且應用程式可以傳遞Null。 如果應用程式傳遞零做為 dwStreamIdentifier 參數中的資料流程識別碼,此方法會擷取套用至整個 ASF 檔案的中繼資料。 否則,只會擷取資料流程的中繼資料。
呼叫 IMFMetadata::GetAllPropertyNames 以擷取媒體內容上設定的檔案編碼屬性清單。
呼叫 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;
}
相關主題