创建 ASF 配置文件

本主题介绍如何在 Microsoft Media Foundation 中创建 ASF 配置文件。

创建新配置文件

若要创建空 ASF 配置文件,请调用 MFCreateASFProfile 函数。 此函数返回指向 IMFASFProfile 接口的指针。 应用程序可以使用此接口将流添加到配置文件,并配置每个流。 有关详细信息,请参阅 创建和配置 ASF 流

(可选)应用程序可以将互斥对象添加到两个或多个流。 请参阅 对 ASF 流使用相互排除

从 ASF ContentInfo 对象获取配置文件

应用程序可以从 ASF ContentInfo 对象获取现有 ASF 文件的 ASF 配置文件。 配置文件已配置,并包含文件中所有流的设置。

通过分析文件的 ASF 标头对象来初始化 ContentInfo 对象。 这是通过 IMFASFContentInfo::P arseHeader 方法完成的。 读取所有标头对象并填充 ASF 库后,将生成此文件的配置文件。 应用程序可以通过调用 IMFASFContentInfo::GetProfile 获取指向此初始化配置文件的指针。

从演示文稿描述符获取配置文件

可以从文件的 演示文稿描述符ASF ContentInfo 对象获取现有 ASF 文件的配置文件对象。 在这种情况下,配置文件已配置,并包含文件中所有流的设置。 如果要修改现有的 ASF 配置文件,这非常有用。 例如,你可能希望以较低的比特率重新编码 Windows Media Video 文件。

若要从演示文稿描述符获取配置文件,请调用 MFCreateASFProfileFromPresentationDescriptor。 此函数分析演示文稿描述符,并使用有关媒体文件的信息填充 ASF 配置文件。 函数返回指向 IMFASFProfile 接口的指针。 然后,可以使用此接口修改配置文件。

若要获取演示文稿描述符,请调用以下方法之一:

以下示例演示如何从演示文稿描述符创建配置文件。 函数为文件创建媒体源,从媒体源获取演示文稿描述符,并创建配置文件。 此示例假定 pszFileName 指定 ASF 文件的 URL。

HRESULT GetASFProfile(PCWSTR pszFileName, IMFASFProfile** ppProfile)
{
    *ppProfile = NULL;

    IMFSourceResolver* pResolver = NULL;
    IUnknown* pSourceUnk = NULL;
    IMFMediaSource* pSource = NULL;
    IMFPresentationDescriptor* pPD = NULL;

    // Create the source resolver.
    HRESULT hr = MFCreateSourceResolver(&pResolver);

    // Use the source resolver to create the media source.
    if (SUCCEEDED(hr))
    {
        MF_OBJECT_TYPE ObjectType;

        hr = pResolver->CreateObjectFromURL(
                pszFileName,
                MF_RESOLUTION_MEDIASOURCE, 
                NULL,                      
                &ObjectType,               
                &pSourceUnk   
            );
    }

    // Get the IMFMediaSource interface from the media source.
    if (SUCCEEDED(hr))
    {
        hr = pSourceUnk->QueryInterface(IID_PPV_ARGS(&pSource));
    }

    // Get the presentation desccriptor.
    if (SUCCEEDED(hr))
    {
        hr = pSource->CreatePresentationDescriptor(&pPD);
    }

    // Get the profile from the presentation descriptor.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateASFProfileFromPresentationDescriptor(pPD, ppProfile);
    }

    SafeRelease(&pResolver);
    SafeRelease(&pSourceUnk);
    SafeRelease(&pSource);
    SafeRelease(&pPD);
    return hr;
}

此示例使用 SafeRelease 释放接口指针。

ASF 配置文件