设置组媒体类型
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
[此 API 不受支持,将来可能会更改或不可用。]
所有组都必须定义未压缩的媒体类型(音频或视频)。 未压缩的媒体类型是观看者在播放期间看到或听到的格式。 通常,最终输出采用压缩格式。 有关详细信息,请参阅 呈现项目。
若要设置未压缩的格式,请创建 AM_MEDIA_TYPE 结构,并使用相应的主类型、子类型和格式标头填充该结构。 对于视频,为格式块分配 VIDEOINFOHEADER 结构,并设置宽度、高度和位深度。 对于音频,为格式块分配 WAVEFORMATEX 结构,并设置采样率、位深度和通道数。 如果仅设置主要类型,则 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 类来管理媒体类型。 它包含一些有用的帮助程序方法,并自动释放格式块。
相关主题