簡報描述項
簡報 是一組共用一般簡報時間的相關媒體串流。 例如,簡報可能包含來自電影的音訊和視訊串流。 簡報描述元 是包含特定簡報描述的物件。 簡報描述元可用來設定媒體來源和某些媒體接收器。
每個簡報描述項目都包含一或多個 資料流描述元的清單,。 這些描述簡報中的數據流。 數據流可以選取或取消選取。 只有選取的數據流會產生數據。 已取消選取的數據流不是使用中,而且不會產生任何數據。 每個數據流描述項都有 媒體類型處理程式,用來變更數據流的媒體類型或取得數據流目前的媒體類型。 (如需媒體類型的詳細資訊,請參閱 媒體類型。)
下表顯示這些物件所公開的主要介面。
物件 | 介面 |
---|---|
簡報描述元 | IMFPresentationDescriptor |
數據流描述元 | IMFStreamDescriptor |
媒體類型處理程式 | IMFMediaTypeHandler |
媒體來源簡報
每個媒體來源都會提供描述來源預設組態的簡報描述項。 在預設組態中,至少會選取一個數據流,而且每個選取的數據流都有媒體類型。 若要取得簡報描述元,請呼叫 IMFMediaSource::CreatePresentationDescriptor。 方法會傳回 IMFPresentationDescriptor 指標。
您可以修改來源的簡報描述元,以選取一組不同的數據流。 除非媒體來源停止,否則請勿修改簡報描述元。 當您呼叫IMFMediaSource::Start 以啟動來源時,就會套用變更。
若要取得數據流數目,請呼叫 IMFPresentationDescriptor::GetStreamDescriptorCount。 若要取得數據流的數據流描述元,請呼叫 IMFPresentationDescriptor::GetStreamDescriptorByIndex 並傳入數據流的索引。 數據流會從零編製索引。 GetStreamDescriptorByIndex 方法會傳回 IMFStreamDescriptor 指標。 它也會傳回 Boolean 旗標,指出是否已選取數據流。 如果選取數據流,媒體來源會產生該數據流的數據。 否則,來源不會產生該數據流的任何數據。 若要選取數據流,請使用數據流的索引呼叫 IMFPresentationDescriptor::SelectStream。 若要取消選取數據流,請呼叫 IMFPresentationDescriptor::D eselectStream。
下列程式代碼示範如何從媒體來源取得簡報描述元,並列舉數據流。
HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL fSelected = FALSE;
IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;
hr = pSource->CreatePresentationDescriptor(&pPresentation);
if (SUCCEEDED(hr))
{
hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}
if (SUCCEEDED(hr))
{
for (DWORD iStream = 0; iStream < cStreams; iStream++)
{
hr = pPresentation->GetStreamDescriptorByIndex(
iStream, &fSelected, &pStreamDesc);
if (FAILED(hr))
{
break;
}
/* Use the stream descriptor. (Not shown.) */
SAFE_RELEASE(pStreamDesc);
}
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);
媒體類型處理程式
若要變更數據流的媒體類型或取得數據流目前的媒體類型,請使用數據流描述元的媒體類型處理程式。 呼叫 IMFStreamDescriptor::GetMediaTypeHandler 以取得媒體類型處理程式。 此方法會傳回 IMFMediaTypeHandler 指標。
如果您只想知道數據流中的數據種類,例如音訊或視訊,請呼叫 IMFMediaTypeHandler::GetMajorType。 這個方法會傳回主要媒體類型的 GUID。 例如,播放應用程式通常會將音訊串流連接到音訊轉譯器,並將視訊串流連接到視訊轉譯器。 如果您使用媒體會話或拓撲載入器來建置拓撲,主要類型 GUID 可能是您唯一需要的格式資訊。
如果您的應用程式需要目前格式的詳細資訊,請呼叫 IMFMediaTypeHandler::GetCurrentMediaType。 這個方法會傳回媒體類型之 IMFMediaType 介面的指標。 使用此介面來取得格式的詳細數據。
媒體類型處理程式也包含數據流支援的媒體類型清單。 若要取得清單的大小,請呼叫 IMFMediaTypeHandler::GetMediaTypeCount。 若要從清單中取得媒體類型,請使用媒體類型的索引呼叫 IMFMediaTypeHandler::GetMediaTypeByIndex。 媒體類型會以喜好設定的近似順序傳回。 例如,針對音訊格式,偏好較高的取樣率高於較低的取樣率。 不過,沒有規範排序的明確規則,因此您應該將其視為指導方針。
支援的型別清單可能不會包含數據流所支援的每個可能媒體類型。 若要測試是否支援特定媒體類型,請呼叫 IMFMediaTypeHandler::IsMediaTypeSupported。 若要設定媒體類型,請呼叫 IMFMediaTypeHandler::SetCurrentMediaType。 如果方法成功,數據流會包含符合指定格式的數據。 SetCurrentMediaType 方法不會變更慣用類型的清單。
下列程式代碼示範如何取得媒體類型處理程式、列舉慣用媒體類型,以及設定媒體類型。 此範例假設應用程式有一些演算法,但此處未顯示用於選取媒體類型。 細節將在很大程度上取決於您的應用程式。
HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL bTypeOK = FALSE;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;
hr = pStreamDesc->GetMediaTypeHandler(&pHandler);
if (SUCCEEDED(hr))
{
hr = pHandler->GetMediaTypeCount(&cTypes);
}
if (SUCCEEDED(hr))
{
for (DWORD iType = 0; iType < cTypes; iType++)
{
hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);
if (FAILED(hr))
{
break;
}
/* Examine the media type. (Not shown.) */
/* If this media type is acceptable, set the media type. */
if (bTypeOK)
{
hr = pHandler->SetCurrentMediaType(pMediaType);
break;
}
SAFE_RELEASE(pMediaType);
}
}
SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);
相關主題