Partilhar via


Registrando um tipo de arquivo personalizado

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na 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 Captura de Áudio/Vídeo no 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.]

Este artigo descreve como o Gerenciador de Grafo de Filtro localiza um filtro de origem, dado um nome de arquivo. Você pode usar esse mecanismo para registrar seus próprios tipos de arquivo personalizados. Depois que o tipo de arquivo for registrado, o DirectShow carregará automaticamente o filtro de origem correto sempre que um aplicativo chamar IGraphBuilder::RenderFile ou IGraphBuilder::AddSourceFilter.

Visão geral

Para localizar um filtro de origem de um determinado nome de arquivo, o Gerenciador de Grafo de Filtro tenta fazer o seguinte, na ordem:

  1. Corresponder ao protocolo, se houver.
  2. Corresponda à extensão de arquivo.
  3. Corresponder padrões de bytes no arquivo, chamados marcar bytes.

Protocolos

Nomes de protocolo como "ftp" ou "http" são registrados no

HKEY_CLASSES_ROOT

chave, com a seguinte estrutura:

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

Se o nome do arquivo ou URL contiver dois-pontos (':'), o Gerenciador de Grafo de Filtro tentará usar a parte antes de ':' como um nome de protocolo. Por exemplo, se o nome for "myprot://myfile.ext", ele procurará uma chave do Registro chamada myprot. Se essa chave existir e contiver uma subchave chamada "Extensões", o Gerenciador de Grafo de Filtro pesquisa nessa subchave as entradas que correspondem à extensão de arquivo. O valor da chave deve ser um GUID no formato de cadeia de caracteres; por exemplo, "{00000000-0000-0000-0000-000000000000}". Se o Gerenciador de Grafo de Filtro não puder corresponder a nada na subchave Extensões , ele procurará uma subchave chamada Filtro de Origem, que também deve ser um GUID no formato de cadeia de caracteres.

Se o Gerenciador de Grafo de Filtro encontrar um GUID correspondente, ele usará isso como o CLSID do filtro de origem e tentará carregar o filtro. Se ele não encontrar uma correspondência, ele usará o filtro DE Origem do Arquivo (URL), que trata o nome do arquivo como uma URL.

Há duas exceções a esse algoritmo:

  • Para excluir letras de driver, cadeias de caracteres únicos não são consideradas protocolos.
  • Se a cadeia de caracteres for "file:" ou "file://", ela não será tratada como um protocolo.

Extensões de arquivo

Se não houver nenhum protocolo no nome do arquivo, o Gerenciador de Grafo de Filtro procurará no registro entradas com a chave HKEY_CLASSES_ROOT\Media Type\Extensions\. ext\, em que . ext é a extensão de arquivo. Se essa chave existir, o valor Filtro de Origem conterá o CLSID do filtro de origem, no formato de cadeia de caracteres. Opcionalmente, a chave pode ter valores para Tipo de Mídia e Subtipo, que fornecem o tipo principal e os GUIDs de subtipo.

Verificar Bytes

Alguns tipos de arquivo podem ser identificados por padrões específicos de bits que ocorrem em deslocamentos de bytes específicos no arquivo. O Gerenciador de Grafo de Filtro procura chaves no Registro com o seguinte formulário:

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

em que o tipo principal e o subtipo são GUIDs que definem o tipo de mídia para o fluxo de bytes. Cada chave contém uma ou mais subchaves, geralmente denominadas 1, 2 e assim por diante, que definem o marcar bytes; e uma subchave chamada Filtro de Origem que fornece o CLSID do filtro de origem, em formato de cadeia de caracteres. As subchaves marcar bytes são cadeias de caracteres que contêm um ou mais quads de números chamados:

offset, cb, mask, val

Para corresponder ao arquivo, o Gerenciador de Grafo de Filtro lê cb bytes, começando pelo deslocamento de número de bytes. Em seguida, ele executa um AND bit a bit em relação ao valor na máscara. Se o resultado for igual a val, o arquivo será uma correspondência para esse quad. Os valores mask e val são fornecidos em hex. Uma entrada em branco para máscara é tratada como uma cadeia de caracteres de 1s de comprimento cb. Um valor negativo para deslocamento indica um deslocamento do final do arquivo. Para corresponder à chave, o arquivo deve corresponder a todos os quadriculados em qualquer uma das subchaves.

Por exemplo, suponha que o registro contenha as seguintes chaves em HKCR\Tipo de Mídia:

{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}"

A primeira chave corresponde ao tipo principal MEDIATYPE_Stream. A subchave abaixo que corresponde ao subtipo MEDIATYPE_Midi. O valor da subchave filtro de origem é CLSID_AsyncReader, o CLSID do filtro De origem do arquivo (Async).

Cada entrada pode ter vários quádruplos; todos eles devem corresponder. No exemplo a seguir, os primeiros 4 bytes do arquivo devem ser 0xAB, 0xCD, 0x12 0x34; e os últimos 4 bytes do arquivo devem ser 0xAB, 0xAB, 0x00 0xAB:

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

Além disso, pode haver várias entradas listadas em um único tipo de mídia. Uma correspondência com qualquer um deles é suficiente. Esse esquema permite um conjunto de máscaras alternativas; por exemplo, arquivos .wav que podem ou não ter um cabeçalho RIFF.

Observação

Esse esquema é semelhante ao usado pela função GetClassFile .

 

Carregando o filtro de origem

Supondo que o Gerenciador do Grafo de Filtro encontre um filtro de origem correspondente para o arquivo, ele adiciona esse filtro ao grafo, consulta o filtro para a interface IFileSourceFilter e chama IFileSourceFilter::Load. Os argumentos para o método Load são o nome do arquivo e o tipo de mídia, conforme determinado pelo registro.

Se o Gerenciador de Grafo de Filtro não conseguir encontrar nada do Registro, ele usará o filtro Fonte de Arquivo Assíncrona. Nesse caso, ele define o tipo de mídia como MEDIATYPE_Stream, MEDIASUBTYPE_None.

Tipos de arquivo personalizados no Reprodutor Multimídia do Windows

Reprodutor Multimídia do Windows usa um conjunto adicional de entradas do Registro. Para obter mais informações, consulte Configurações do Registro de Extensão de Nome de Arquivo no SDK do Reprodutor Multimídia do Windows.

Escrevendo filtros do DirectShow