共用方式為


簡報描述項

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

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

下表顯示這些物件所公開的主要介面。

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

媒體來源

Media Foundation Platform API