Share via


Registro de un tipo de archivo personalizado

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

En este artículo se describe cómo el Administrador de gráficos de filtros busca un filtro de origen, dado un nombre de archivo. Puede usar este mecanismo para registrar sus propios tipos de archivo personalizados. Una vez registrado el tipo de archivo, DirectShow cargará automáticamente el filtro de origen correcto cada vez que una aplicación llama a IGraphBuilder::RenderFile o IGraphBuilder::AddSourceFilter.

Información general

Para buscar un filtro de origen de un nombre de archivo determinado, el Administrador de gráficos de filtros intenta hacer lo siguiente, en orden:

  1. Coincide con el protocolo, si existe.
  2. Coincide con la extensión de archivo.
  3. Coincidencia de patrones de bytes en el archivo, denominados bytes check.

Protocolos

Los nombres de protocolo como "ftp" o "http" se registran en el

HKEY_CLASSES_ROOT

key, con la estructura siguiente:

HKEY_CLASSES_ROOT
    <protocol>
        Source Filter = <Source filter CLSID>
        Extensions
            <.ext1> = <Source filter CLSID>
            <.ext2> = <Source filter CLSID>

Si el nombre de archivo o la dirección URL contiene dos puntos (':'), el Administrador de gráficos de filtros intenta usar la parte antes de ":" como nombre de protocolo. Por ejemplo, si el nombre es "myprot://myfile.ext", busca una clave del Registro denominada myprot. Si esta clave existe y contiene una subclave denominada "Extensions", el Administrador de gráficos de filtros busca entradas que coincidan con la extensión de archivo. El valor de la clave debe ser un GUID en forma de cadena; por ejemplo, "{00000000-0000-0000-0000-000000000000}". Si el Administrador de gráficos de filtros no puede coincidir con nada dentro de la subclave Extensions , busca una subclave denominada Filtro de origen, que también debe ser un GUID en forma de cadena.

Si el Administrador de gráficos de filtros encuentra un GUID coincidente, lo usa como CLSID del filtro de origen e intenta cargar el filtro. Si no encuentra ninguna coincidencia, usa el filtro Origen de archivo (URL), que trata el nombre de archivo como una dirección URL.

Hay dos excepciones a este algoritmo:

  • Para excluir letras de controlador, las cadenas de un solo carácter no se consideran protocolos.
  • Si la cadena es "file:" o "file://", no se trata como un protocolo.

Extensiones de archivo

Si no hay ningún protocolo en el nombre de archivo, el Administrador de gráficos de filtros busca entradas con la clave HKEY_CLASSES_ROOT\Media Type\Extensions\. ext\, donde . ext es la extensión de archivo. Si esta clave existe, el valor Filtro de origen contiene el CLSID del filtro de origen, en forma de cadena. Opcionalmente, la clave puede tener valores para Tipo de medio y Subtipo, que proporcionan los GUID de tipo y subtipo principal.

Comprobar bytes

Algunos tipos de archivo se pueden identificar mediante patrones específicos de bits que se producen en desplazamientos de bytes específicos en el archivo. Filter Graph Manager busca claves en el Registro con el siguiente formato:

HKEY_CLASSES_ROOT\MediaType\{ tipo principal }\{ subtipo }

donde el tipo principal y el subtipo son GUID que definen el tipo de medio para la secuencia de bytes. Cada clave contiene una o varias subclaves, normalmente denominadas 1, 2, etc., que definen los bytes check; y una subclave denominada Filtro de origen que proporciona el CLSID del filtro de origen, en forma de cadena. Las subclaves check-byte son cadenas que contienen uno o varios cuadrantes de números denominados:

offset, cb, mask, val

Para que coincida con el archivo, el Administrador de gráficos de filtros lee bytes cb, empezando por el desplazamiento del número de bytes. A continuación, realiza una operación AND bit a bit con el valor en mask. Si el resultado es igual a val, el archivo es una coincidencia para ese cuadrángulo. Los valores mask y val se proporcionan en hexadecimal. Una entrada en blanco para mask se trata como una cadena de 1s de longitud cb. Un valor negativo para offset indica un desplazamiento desde el final del archivo. Para que coincida con la clave, el archivo debe coincidir con todos los quads de cualquiera de las subclaves.

Por ejemplo, supongamos que el Registro contiene las siguientes claves en HKCR\Media Type:

{e436eb83-524f-11ce-9f53-0020af0ba770}
    {7364696D-0000-0010-8000-00AA00389B71}
        0                    "0,4,,52494646,8,4,,524D4944"
        1                    "0,4,,4D546864"
        Source Filter        "{E436EBB5-524F-11CE-9F53-0020AF0BA770}"

La primera clave corresponde al tipo principal MEDIATYPE_Stream. Subclave siguiente que corresponde al subtipo MEDIATYPE_Midi. El valor de la subclave Filtro de origen es CLSID_AsyncReader, clSID del filtro De origen de archivos (Async).

Cada entrada puede tener varios cuádruples; todos ellos deben coincidir. En el ejemplo siguiente, los primeros 4 bytes del archivo deben ser 0xAB, 0xCD, 0x12, 0x34; y los últimos 4 bytes del archivo deben ser 0xAB, 0xAB, 0x00, 0xAB:

    0, 4, , ABCD1234,  -4, 4, , ABAB00AB 

Además, puede haber varias entradas enumeradas en un solo tipo de medio. Una coincidencia con cualquiera de ellas es suficiente. Este esquema permite un conjunto de máscaras alternativas; por ejemplo, los archivos .wav que podrían tener o no un encabezado RIFF.

Nota:

Este esquema es similar al que usa la función GetClassFile .

 

Carga del filtro de origen

Suponiendo que el Administrador de gráficos de filtros encuentra un filtro de origen coincidente para el archivo, agrega ese filtro al gráfico, consulta el filtro de la interfaz IFileSourceFilter y llama a IFileSourceFilter::Load. Los argumentos del método Load son el nombre de archivo y el tipo de medio, según se determina en el Registro.

Si el Administrador de gráficos de filtros no encuentra nada del registro, el valor predeterminado es usar el filtro Async File Source. En ese caso, establece el tipo de medio en MEDIATYPE_Stream, MEDIASUBTYPE_None.

Tipos de archivo personalizados en Reproductor multimedia de Windows

Reproductor multimedia de Windows usa un conjunto adicional de entradas del Registro. Para obtener más información, consulte Configuración del Registro de extensiones de nombre de archivo en el SDK de Reproductor multimedia de Windows.

Escribir filtros directShow