Compartir a través de


Establecer el tipo de medio de grupo

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

[Esta API no se admite y puede modificarse o no estar disponible en el futuro].

Todos los grupos deben definir un tipo de medio sin comprimir, ya sea audio o vídeo. El tipo de medio sin comprimir es el formato que los espectadores ven o escuchan durante la reproducción. Normalmente, la salida final estará en un formato comprimido. Para obtener más información, vea Representación de un proyecto.

Para establecer el formato sin comprimir, cree una estructura de AM_MEDIA_TYPE y llene con el tipo principal, subtipo y encabezado de formato adecuados. En el caso del vídeo, asigne una estructura VIDEOINFOHEADER para el bloque de formato y establezca el ancho, alto y profundidad de bits. Para audio, asigne una estructura WAVEFORMATEX para el bloque de formato y establezca la velocidad de muestreo, la profundidad de bits y el número de canales. Si establece solo el tipo principal, DES proporciona valores predeterminados razonables para los demás valores. En la práctica, debe establecer los valores explícitamente para controlar la salida.

Después de inicializar la estructura de tipos de medios, llame al método IAMTimelineGroup::SetMediaType para establecer el tipo de medio para el grupo.

En el ejemplo siguiente se especifica vídeo RGB de 16 bits, 320 píxeles de ancho en 240 píxeles de alto:

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

En el ejemplo siguiente se especifica un grupo de audio, estableciendo el tipo de medio de grupo en estéreo de 16 bits, 44100 muestras 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);

También puede usar la clase CMediaType en las clases base directShow para administrar los tipos de medios. Contiene algunos métodos auxiliares útiles y libera automáticamente el bloque de formato.

Acerca de los tipos de medios

Construcción de una escala de tiempo