將中繼資料新增至檔案接收

ASF 檔案接收是媒體基礎所提供的 IMFMediaSink 實作,應用程式可用來將 ASF 媒體資料封存至檔案。 如需 ASF 媒體接收的物件模型和一般使用方式的相關資訊,請參閱 ASF 媒體接收

建立 ASF 檔案接收之後,必須使用輸出檔中資料流程和編碼資訊的相關資訊進行設定。 這些程式說明在檔案 接收中將資料流程資訊新增至 ASF 檔案接收設定屬性。 此外,您也可以新增中繼資料資訊,包括名稱/值組,例如「作者」、「標題」。 本主題描述將中繼資料資訊新增至檔案接收的程式,使其出現在最終 的 ASF 標頭物件中。

您可以在建置編碼拓撲之前,將中繼資料資訊新增至 ASF 檔案接收。 檔案接收的 ASF ContentInfo 物件會持續追蹤中繼資料屬性,並透過 IMFMetadata 介面向應用程式公開。 其中一些屬性,例如 「IsVBR」,指出檔案是否包含變數位元速率 (VBR) 資料流程,藉由剖析所設定的資料流程編碼屬性,自動由檔案接收設定。

如需完整的屬性清單,請參閱格式 SDK 檔中的主題。

在 ASF 檔案接收上使用 IMFMetadata 介面

  1. 查詢 ASF 檔案接收物件,以取得 其 IMFMetadataProvider 介面實作的指標。

  2. 呼叫 IMFMetadataProvider::GetMFMetadata 以取得 IMFMetadata 指標。

    pPresentationDescriptor參數會被忽略,而且應用程式可以傳遞Null。 如果應用程式傳遞零做為 dwStreamIdentifier 參數中的資料流程識別碼,此方法會擷取套用至整個 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 元件

媒體基礎中的 ASF 支援