Definindo o tipo de mídia de grupo

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

[Não há suporte para essa API e pode ser alterada ou indisponível no futuro.]

Todos os grupos devem definir um tipo de mídia descompactado, áudio ou vídeo. O tipo de mídia descompactado é o formato que os visualizadores veem ou ouvem durante a reprodução. Normalmente, a saída final estará em um formato compactado. Para obter mais informações, consulte Renderizando um projeto.

Para definir o formato descompactado, crie uma estrutura AM_MEDIA_TYPE e preencha-a com o tipo principal, o subtipo e o cabeçalho de formato apropriados. Para vídeo, aloque uma estrutura VIDEOINFOHEADER para o bloco de formato e defina a largura, a altura e a profundidade do bit. Para áudio, aloque uma estrutura WAVEFORMATEX para o bloco de formato e defina a taxa de amostragem, a profundidade de bits e o número de canais. Se você definir apenas o tipo principal, o DES fornecerá padrões razoáveis para os outros valores. Na prática, você deve definir os valores explicitamente para controlar a saída.

Depois de inicializar a estrutura de tipo de mídia, chame o método IAMTimelineGroup::SetMediaType para definir o tipo de mídia para o grupo.

O exemplo a seguir especifica um vídeo RGB de 16 bits, 320 pixels de largura por 240 pixels de altura:

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);

O próximo exemplo especifica um grupo de áudio, definindo o tipo de mídia de grupo como estéreo de 16 bits, 44100 amostras por segundo:

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);

Você também pode usar a classe CMediaType nas Classes Base do DirectShow para gerenciar tipos de mídia. Ele contém alguns métodos auxiliares úteis e libera automaticamente o bloco de formato.

Sobre tipos de mídia

Construindo uma linha do tempo