Задание типа мультимедиа группы
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие 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);
Вы также можете использовать класс CMediaType в базовых классах DirectShow для управления типами мультимедиа. Он содержит некоторые полезные вспомогательные методы и автоматически освобождает блок форматирования.
Связанные темы