从 ASF 标头对象获取信息

ASF 标头信息存储在媒体文件的 ASF 标头对象中。 Media Foundation 提供 ASF ContentInfo 对象 来处理标头对象。 填充的 ContentInfo 对象是必需的,以便应用程序读取现有文件的标头信息。 这是通过调用 IMFASFContentInfo::P arseHeader 来实现的。 如果分析成功完成,则由 Media Foundation 在内部维护的文件的 ASF 库会填充来自各种标头对象的标头信息。 其中一些属性向应用程序公开,该应用程序可以通过演示文稿描述符、流描述符、配置文件和元数据属性的属性进行检索。

有关属性的完整列表,请参阅 ASF 标头对象的 Media Foundation 属性

从演示文稿描述符检索标头信息

演示文稿描述符对象包含特定媒体源的说明,在本例中为 ASF 媒体源。 如果 ParseHeader 调用成功完成,则标头对象中的文件级信息存储为演示文稿描述符上的属性。 若要创建演示文稿描述符,请调用 IMFASFContentInfo::GeneratePresentationDescriptor。 此方法返回指向填充的演示文稿描述符对象的指针,该描述符对象包含与 ContentInfo 对象关联的 ASF 文件的这些属性。 若要获取特定属性的值,请在演示文稿描述符上调用 IMFAttributes::Getxxx 方法并指定 MF_PD_ASF_xxx 属性。

以下示例代码检索由 ContentInfo 对象指定的 ASF 文件的播放持续时间。

HRESULT GetPlayDuration(
    IMFASFContentInfo *pContentInfo,  // An initialized ContentInfo object. 
    UINT64 *pcbPlayDuration           // Receives the play duration.
    )
{
    IMFPresentationDescriptor* pPD = NULL;

    HRESULT hr = pContentInfo->GeneratePresentationDescriptor(&pPD);
    if (SUCCEEDED(hr))
    {
        hr = pPD->GetUINT64(MF_PD_ASF_FILEPROPERTIES_PLAY_DURATION, pcbPlayDuration);
        pPD->Release();
    }
    return hr;
}

有关演示文稿描述符的详细信息,请参阅 演示文稿描述符

有关完整的演示文稿描述符属性集,请参阅 演示文稿描述符属性

从流描述符检索标头信息

流描述符对象公开 IMFStreamDescriptor 接口,并描述文件中流的特征。 ASF 内容的演示文稿描述符包含一个或多个表示标头对象中列出的流的流描述符。 调用 IMFASFContentInfo::GeneratePresentationDescriptor 成功完成后,基础流描述符将填充来自各种标头对象的流级信息。 若要获取 ASF 流的流描述符,请对从 ContentInfo 对象生成的演示文稿描述符调用 IMFPresentationDescriptorDescriptorByIndex::GetStreamDescriptorByIndex

某些流属性在流描述符上设置为属性。 在流描述符上调用 IMFAttributes::Getxxx 方法,并指定 MF_SD_ASF_xxx 属性。

有关流描述符属性的完整集,请参阅 Stream 描述符属性中列出的“ASF 特定流描述符”属性。

从配置文件对象检索标头信息

除了流描述符,ASF 配置文件对象还描述流属性。 若要获取现有 ASF 文件的配置文件,请调用 IMFASFContentInfo::GetProfile。 此方法返回的 ASF 配置文件对象不包含任何 MF_PD_ASF_xxx 属性。 仅在应用程序调用 MFCreateASFProfileFromPresentationDescriptor 以从演示文稿描述符生成配置文件对象之后,这些属性才可供应用程序使用。 可以使用配置文件获取指向相互排除和流优先顺序对象的指针。

有关配置文件对象的信息,请参阅 ASF 配置文件

从标头对象检索元数据

ASF 文件可以包含文件编码过程中设置的多个元数据属性。 应用程序可以使用 ContentInfo 对象枚举这些属性。 其中一些属性(如可变比特率 (VBR) 信息)可通过媒体文件的演示文稿描述符、流描述符和媒体类型的属性提供给应用程序。 通过 ParseHeader 调用初始化期间,这些属性在 ContentInfo 对象上设置。

ASF ContentInfo 对象