将元数据添加到文件接收器

ASF 文件接收器是媒体基础提供的 IMFMediaSink 的实现,应用程序可以使用该实现将 ASF 媒体数据存档到文件中。 有关 ASF 媒体接收器的对象模型和一般用法的信息,请参阅 ASF 媒体接收器

创建 ASF 文件接收器后,必须使用有关输出文件中的流和编码信息对其进行配置。 将 流信息添加到 ASF 文件接收器在文件接收器中设置属性中介绍了这些步骤。 此外,还可以添加元数据信息,包括名称/值对,例如“Author”、Title”。 本主题介绍向文件接收器添加元数据信息,使其出现在最终 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 支持