建立 ASF 設定檔
本主題描述如何在 Microsoft Media Foundation 中建立 ASF 配置檔。
建立新的個人資料
若要建立空的 ASF 配置檔,請呼叫 MFCreateASFProfile 函式。 此函式會傳回 IMFASFProfile 介面的指標。 應用程式可以使用這個介面將數據流新增至配置檔,以及設定每個數據流。 如需詳細資訊,請參閱 建立和設定 ASF 資料流。
或者,應用程式可以將互斥物件新增至兩個或多個數據流。 請參閱使用 ASF 資料流的相互排除 。
從 ASF ContentInfo 物件取得個人檔案
應用程式可以從 ASF ContentInfo 物件取得現有 ASF 檔案的 ASF 配置檔。 配置檔已設定,並包含檔案中所有數據流的設定。
解析檔案的 ASF 標頭物件來初始化 ContentInfo 物件。 這是透過 IMFASFContentInfo::ParseHeader 方法來完成。 讀取所有標頭物件並填入 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 來釋放介面指標。
相關主題