簡報描述項

簡報是一組共用一般簡報時間的相關媒體串流。 例如,簡報可能包含電影中的音訊和視訊串流。 簡報描述元是物件,其中包含特定簡報的描述。 簡報描述項是用來設定媒體來源和某些媒體接收。

每個簡報描述元都包含一或多個 資料流程描述元的清單。 這些描述簡報中的資料流程。 資料流程可以選取或取消選取。 只有選取的資料流程會產生資料。 取消選取的資料流程不是使用中,而且不會產生任何資料。 每個資料流程描述項都有 媒體類型處理常式,可用來變更資料流程的媒體類型或取得資料流程目前的媒體類型。 (如需媒體類型的詳細資訊,請參閱 媒體類型.)

下表顯示每個物件公開的主要介面。

Object 介面
簡報描述元 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);

媒體來源

媒體基礎平臺 API