建立 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 物件已初始化以供讀取。 For more information, see "Initializing the ContentInfo Object from an Existing ASF File" in Reading the ASF Header Object of an Existing File. 不過,如果您已經有初始化的 ContentInfo 物件,您可以直接從該物件取得設定檔。 This is described in "Getting the Profile from the ContentInfo Object " later in this topic.
下列範例示範如何從簡報描述項建立設定檔。 函式會建立檔案的媒體來源、從媒體來源取得簡報描述元,以及建立設定檔。 此範例假設 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 釋放介面指標。
相關主題