Установка типа носителя для группы

[Функция, связанная с этой страницей, 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 для управления типами носителей. Он включает полезные вспомогательные методы и автоматически освобождает блок форматирования.

О типах медиа

создание временной шкалы