從 ASF 標頭物件取得資訊
ASF 標頭資訊會儲存在媒體檔案的 ASF 標頭物件中。 媒體基礎提供 ASF ContentInfo 物件 來處理 Header 物件。 需要填入的 ContentInfo 物件,應用程式才能讀取現有檔案的標頭資訊。 這是藉由呼叫 IMFASFContentInfo::P arseHeader來達成。 如果剖析順利完成,Media Foundation 會在內部維護的檔案 ASF 程式庫填入來自各種標頭物件的標頭資訊。 其中有些屬性會公開給應用程式,它可以透過簡報描述元、資料流程描述元、設定檔和中繼資料屬性上的屬性來擷取。
如需屬性的完整清單,請參閱 ASF 標頭物件的媒體基礎屬性。
從簡報描述元擷取標頭資訊
簡報描述項物件包含特定媒體來源的描述,在此案例中為 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 內容的簡報描述項包含一或多個資料流程描述元,代表 Header 物件中列出的資料流程。 在 成功呼叫 IMFASFContentInfo::GeneratePresentationDescriptor 之後,基礎資料流程描述元會填入來自各種標頭物件的資料流程層級資訊。 若要取得 ASF 資料流程的資料流程描述項,請在從 ContentInfo 物件產生的簡報描述元上呼叫 IMFPresentationDescriptor::GetStreamDescriptorByIndex 。
某些資料流程屬性會設定為數據流描述元上的屬性。 在資料流程描述項上呼叫 IMFAttributes::Getxxx 方法,並指定 MF_SD_ASF_xxx 屬性。
如需一組完整的資料流程描述元屬性,請參閱資料流程描述元屬性中列出的「ASF 特定 資料流程描述元」屬性。
從設定檔物件擷取標頭資訊
除了資料流程描述項之外,ASF 設定檔物件也會描述資料流程屬性。 若要取得現有 ASF 檔案的設定檔,請呼叫 IMFASFContentInfo::GetProfile。 這個方法所傳回的 ASF 設定檔物件不包含任何 MF_PD_ASF_xxx 屬性。 只有在應用程式呼叫 MFCreateASFProfileFromPresentationDescriptor 以從簡報描述項產生設定檔物件之後,才可供應用程式使用。 您可以使用設定檔來取得相互排除和資料流程優先順序物件的指標。
如需設定檔物件的相關資訊,請參閱 ASF 設定檔 。
從標頭物件擷取中繼資料
ASF 檔案可以包含數個在檔案編碼期間設定的中繼資料屬性。 應用程式可以使用 ContentInfo 物件列舉這些屬性。 其中一些屬性,例如變數位元速率 (VBR) 資訊,可透過簡報描述元、資料流程描述元和媒體類型的屬性提供給應用程式使用。 透過 ParseHeader 呼叫初始化期間,這些屬性會在 ContentInfo 物件上設定。
相關主題