Compartir a través de


Acerca de los tipos de medios (DirectShow)

[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.

Dado que DirectShow es modular, requiere una manera de describir el formato de los datos en cada punto del gráfico de filtros. Por ejemplo, considere la posibilidad de reproducir AVI. Los datos escriben el gráfico como un flujo de fragmentos RIFF. Estos se analizan en secuencias de vídeo y audio. La secuencia de vídeo consta de fotogramas de vídeo, que probablemente se comprimen. Después de la descodificación, la secuencia de vídeo es una serie de mapas de bits sin comprimir. La secuencia de audio pasa por un proceso similar.

Tipos de medios: cómo DirectShow representa formatos

El tipo de medio es una manera universal y extensible de describir formatos de medios digitales. Cuando se conectan dos filtros, están de acuerdo en un tipo de medio. El tipo de medio identifica qué tipo de datos proporcionará el filtro ascendente al filtro de nivel inferior y el diseño físico de los datos. Si dos filtros no pueden aceptar un tipo de medio, no se conectarán.

Para algunas aplicaciones, nunca tendrá que preocuparse por los tipos de medios. En la reproducción de archivos, por ejemplo, DirectShow controla todos los detalles. Es posible que otros tipos de aplicaciones necesiten trabajar directamente con tipos de medios.

Los tipos de medios se definen mediante la estructura AM_MEDIA_TYPE . Esta estructura contiene la siguiente información:

  • Tipo principal: el tipo principal es un GUID que define la categoría general de los datos. Entre los tipos principales se incluyen vídeo, audio, secuencia de bytes sin análisis, datos MIDI, etc.

  • Subtipo: el subtipo es otro GUID, que define aún más el formato. Por ejemplo, dentro del tipo principal de vídeo, hay subtipos para RGB-24, RGB-32, UYVY, etc. Dentro del audio, hay audio PCM, carga MPEG-1 y otros. El subtipo proporciona más información que el tipo principal, pero no define todo sobre el formato. Por ejemplo, los subtipos de vídeo no definen el tamaño de la imagen ni la velocidad de fotogramas. Estos se definen mediante el bloque de formato, que se describe a continuación.

  • Bloque de formato: el bloque de formato es un bloque de datos que describe el formato en detalle. El bloque de formato se asigna por separado de la estructura AM_MEDIA_TYPE . El miembro pbFormat de la estructura AM_MEDIA_TYPE apunta al bloque de formato.

    El miembro pbFormat se escribe void* porque el diseño del bloque de formato cambia en función del tipo de medio. Por ejemplo, el audio PCM usa una estructura WAVEFORMATEX . El vídeo usa varias estructuras, como VIDEOINFOHEADER y VIDEOINFOHEADER2. El miembro formattype de la estructura AM_MEDIA_TYPE es un GUID que especifica qué estructura está contenida en el bloque de formato. A cada estructura de formato se le asigna un GUID. El miembro cbFormat especifica el tamaño del bloque de formato. Compruebe siempre estos valores antes de desreferenciar el puntero pbFormat .

Si el bloque de formato se rellena, el tipo principal y el subtipo contienen información redundante. Sin embargo, el tipo principal y el subtipo proporcionan una manera cómoda de identificar formatos sin un bloque de formato completo. Por ejemplo, puede especificar un formato RGB genérico de 24 bits (MEDIASUBTYPE_RGB24), sin conocer toda la información requerida por la estructura VIDEOINFOHEADER , como el tamaño de imagen y la velocidad de fotogramas.

Por ejemplo, un filtro podría usar el código siguiente para comprobar un tipo de medio:

HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
    if (pmt == NULL) return E_POINTER;

    // Check the major type. We're looking for video.
    if (pmt->majortype != MEDIATYPE_Video)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the subtype. We're looking for 24-bit RGB.
    if (pmt->subtype != MEDIASUBTYPE_RGB24)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the format type and the size of the format block.
    if ((pmt->formattype == FORMAT_VideoInfo) &&
         (pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
         (pmt->pbFormat != NULL))
    {
        // Now it's safe to coerce the format block pointer to the
        // correct structure, as defined by the formattype GUID.
        VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    
        // Examine pVIH (not shown). If it looks OK, return S_OK.
        return S_OK;
    }

    return VFW_E_INVALIDMEDIATYPE;
}

La estructura AM_MEDIA_TYPE también contiene algunos campos opcionales. Se pueden usar para proporcionar información adicional, pero los filtros no son necesarios para usarlos:

  • lSampleSize. Si este campo no es cero, define el tamaño de cada muestra. Si es cero, indica que el tamaño de la muestra puede cambiar de ejemplo a ejemplo.
  • bFixedSizeSamples. Si esta marca booleana es TRUE, significa que el valor de lSampleSize es válido. De lo contrario, debe omitir lSampleSize.
  • bTemporalesCompression. Si esta marca booleana es FALSE, significa que todos los fotogramas son fotogramas clave.

Gráfico de filtros y sus componentes