创建 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 接口的指针。 然后,可以使用此接口修改配置文件。
若要获取演示文稿描述符,请调用以下方法之一:
- 从 ASF 媒体源调用 IMFMediaSource::CreatePresentationDescriptor。
- 在 ASF ContentInfo 对象中 ,调用 IMFASFContentInfo::GeneratePresentationDescriptor。 在调用此方法之前,请确保已初始化 ContentInfo 对象以供读取。 有关详细信息,请参阅读取现有文件的 ASF 标头对象中的“从现有 ASF 文件初始化 ContentInfo 对象”。 但是,如果已有初始化的 ContentInfo 对象,可以直接从该对象获取配置文件。 本主题后面的“从 ContentInfo 对象获取配置文件”中对此进行介绍。
以下示例演示如何从演示文稿描述符创建配置文件。 函数为文件创建媒体源,从媒体源获取演示文稿描述符,并创建配置文件。 此示例假定 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 descriptor.
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 释放接口指针。
相关主题