共用方式為


設定群組媒體類型

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

[不支援此 API,未來可能會改變或無法使用。]

所有群組都必須定義未壓縮的媒體類型,無論是音訊或視訊。 未壓縮的媒體類型是檢視者在播放期間看到或聽到的格式。 一般而言,最終輸出會採用壓縮格式。 如需詳細資訊,請參閱 轉譯專案

若要設定未壓縮的格式,請建立 AM_MEDIA_TYPE 結構,並填入適當的主要類型、子類型和格式標頭。 針對視訊,請為格式區塊配置 VIDEOINFOHEADER 結構,並設定寬度、高度和位深度。 針對音訊,請為格式區塊配置 一個其一個「其」的「其」層級, 並設定取樣速率、位深度和通道數目。 如果您只設定主要類型,DES 會針對其他值提供合理的預設值。 在實務上,您應該明確設定值來控制輸出。

初始化媒體類型結構之後,請呼叫 IAMTimelineGroup::SetMediaType 方法來設定群組的媒體類型。

下列範例指定 16 位 RGB 視訊,寬度為 320 圖元,高 240 圖元:

AM_MEDIA_TYPE mtGroup;  
mtGroup.majortype = MEDIATYPE_Video;
mtGroup.subtype = MEDIASUBTYPE_RGB555;

// Set format headers.
mtGroup.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));
if (mtGroup.pbFormat == NULL)
{
    return E_OUTOFMEMORY;
}

VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mtGroup.pbFormat;
ZeroMemory(pVideoHeader, sizeof(VIDEOINFOHEADER));
pVideoHeader->bmiHeader.biBitCount = 16;
pVideoHeader->bmiHeader.biWidth = 320;
pVideoHeader->bmiHeader.biHeight = 240;
pVideoHeader->bmiHeader.biPlanes = 1;
pVideoHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pVideoHeader->bmiHeader.biSizeImage = DIBSIZE(pVideoHeader->bmiHeader);

// Set the format type and size.
mtGroup.formattype = FORMAT_VideoInfo;
mtGroup.cbFormat = sizeof(VIDEOINFOHEADER);

// Set the sample size.
mtGroup.bFixedSizeSamples = TRUE;
mtGroup.lSampleSize = DIBSIZE(pVideoHeader->bmiHeader);

// Now use this media type for the group.
pGroup->SetMediaType(&mtGroup);

// Clean up.
CoTaskMemFree(mtGroup.pbFormat);

下一個範例會指定音訊群組,方法是將群組媒體類型設定為每秒 16 位立體,每秒 44100 個樣本:

AM_MEDIA_TYPE mt;  
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));

mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.formattype = FORMAT_WaveFormatEx;

// Set format block.
mt.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(WAVEFORMATEX));
if (mt.pbFormat == NULL)
{
    return E_OUTOFMEMORY;
}
mt.cbFormat = sizeof(WAVEFORMATEX);

// Fill in the WAVEFORMATEX structure.
WAVEFORMATEX *wave = (WAVEFORMATEX*) mt.pbFormat;
wave->wFormatTag = WAVE_FORMAT_PCM;
wave->nChannels = 2;  // Stereo
wave->nSamplesPerSec = 44100;
wave->wBitsPerSample = 16;
wave->nBlockAlign = wave->nChannels * wave->wBitsPerSample/8;
wave->nAvgBytesPerSec = wave->nSamplesPerSec * wave->nBlockAlign; 
wave->cbSize = 0;

hr = pGroup->SetMediaType(&mt);
CoTaskMemFree(mt.pbFormat);

您也可以使用DirectShow 基類中的CMediaType類別來管理媒體類型。 它包含一些實用的協助程式方法,並自動釋放格式區塊。

關於媒體類型

建構時程表