将元数据添加到文件接收器
ASF 文件接收器是媒体基础提供的 IMFMediaSink 的实现,应用程序可以使用该实现将 ASF 媒体数据存档到文件中。 有关 ASF 媒体接收器的对象模型和一般用法的信息,请参阅 ASF 媒体接收器。
创建 ASF 文件接收器后,必须使用有关输出文件中的流和编码信息对其进行配置。 将 流信息添加到 ASF 文件接收器 和 在文件接收器中设置属性中介绍了这些步骤。 此外,还可以添加元数据信息,包括名称/值对,例如“Author”、Title”。 本主题介绍向文件接收器添加元数据信息,使其出现在最终 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;
}
相关主题