Registrazione di un tipo di file personalizzato

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questo articolo descrive come Filter Graph Manager individua un filtro di origine, in base a un nome file. È possibile usare questo meccanismo per registrare i propri tipi di file personalizzati. Dopo la registrazione del tipo di file, DirectShow caricherà automaticamente il filtro di origine corretto ogni volta che un'applicazione chiama IGraphBuilder::RenderFile o IGraphBuilder::AddSourceFilter.

Panoramica

Per individuare un filtro di origine da un determinato nome di file, Filter Graph Manager tenta di eseguire le operazioni seguenti, in ordine:

  1. Trova la corrispondenza con il protocollo, se presente.
  2. Trova la corrispondenza con l'estensione del file.
  3. Trova la corrispondenza dei modelli di byte all'interno del file, denominati byte di controllo.

Protocolli

I nomi dei protocolli, ad esempio "ftp" o "http" vengono registrati in

HKEY_CLASSES_ROOT

key, con la struttura seguente:

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

Se il nome del file o l'URL contiene due punti (':'), Filter Graph Manager tenta di usare la parte prima di ':' come nome del protocollo. Ad esempio, se il nome è "myprot://myfile.ext", cerca una chiave del Registro di sistema denominata myprot. Se questa chiave esiste e contiene una sottochiave denominata "Extensions", Filter Graph Manager cerca all'interno della sottochiave le voci corrispondenti all'estensione di file. Il valore della chiave deve essere un GUID in formato stringa; ad esempio "{00000000-0000-0000-0000-000000000000}". Se Filter Graph Manager non può corrispondere a nulla all'interno della sottochiave Extensions , cerca una sottochiave denominata Filtro origine, che deve anche essere un GUID in formato stringa.

Se Filter Graph Manager trova un GUID corrispondente, lo usa come CLSID del filtro di origine e tenta di caricare il filtro. Se non trova una corrispondenza, usa il filtro Origine file (URL), che considera il nome file come URL.

Esistono due eccezioni a questo algoritmo:

  • Per escludere le lettere di driver, le stringhe a caratteri singolo non sono considerate protocolli.
  • Se la stringa è "file:" o "file://", non viene considerata come protocollo.

Estensioni di file

Se non è presente alcun protocollo nel nome del file, Filter Graph Manager cerca nel Registro di sistema le voci con la chiave HKEY_CLASSES_ROOT\Media Type\Extensions\. ext\, dove . ext è l'estensione di file. Se questa chiave esiste, il valore Filtro origine contiene il CLSID del filtro di origine, in formato stringa. Facoltativamente, la chiave può avere valori per Tipo di supporto e Sottotipo, che assegnano i GUID di tipo principale e sottotipo.

Controlla byte

Alcuni tipi di file possono essere identificati da modelli specifici di bit che si verificano in offset di byte specifici nel file. Filter Graph Manager cerca nel Registro di sistema le chiavi con il formato seguente:

HKEY_CLASSES_ROOT\MediaType\{ tipo principale }\{ sottotipo }

dove tipo principale e sottotipo sono GUID che definiscono il tipo di supporto per il flusso di byte. Ogni chiave contiene una o più sottochiavi, in genere denominate 1, 2 e così via, che definiscono i byte di controllo; e una sottochiave denominata Filtro origine che fornisce il CLSID del filtro di origine, in formato stringa. Le sottochiavi check-byte sono stringhe che contengono uno o più quad di numeri chiamati:

offset, cb, mask, val

Per trovare la corrispondenza con il file, Filter Graph Manager legge i byte cb, a partire dall'offset del numero di byte. Esegue quindi un AND bit per bit rispetto al valore in mask. Se il risultato è uguale a val, il file corrisponde a tale quad. I valori mask e val vengono specificati in esadecimale. Una voce vuota per mask viene considerata come una stringa di 1s di lunghezza cb. Un valore negativo per offset indica un offset dalla fine del file. Per trovare la corrispondenza con la chiave, il file deve corrispondere a tutti i quad in una delle sottochiavi.

Si supponga, ad esempio, che il Registro di sistema contenga le chiavi seguenti in 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 prima chiave corrisponde al tipo principale MEDIATYPE_Stream. Sottochiave che corrisponde al sottotipo MEDIATYPE_Midi. Il valore per la sottochiave Filtro di origine è CLSID_AsyncReader, il CLSID del filtro Origine file (Async).

Ogni voce può avere più code; tutti devono corrispondere. Nell'esempio seguente i primi 4 byte del file devono essere 0xAB, 0xCD, 0x12 0x34; e gli ultimi 4 byte del file devono essere 0xAB, 0xAB, 0x00, 0xAB:

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

Inoltre, possono essere elencate più voci in un singolo tipo di supporto. Una corrispondenza con uno qualsiasi di loro è sufficiente. Questo schema consente una serie di maschere alternative; Ad esempio, i file wav che potrebbero o non hanno un'intestazione RIFF.

Nota

Questo schema è simile a quello usato dalla funzione GetClassFile .

 

Caricamento del filtro di origine

Supponendo che Filter Graph Manager trovi un filtro di origine corrispondente per il file, aggiunge tale filtro al grafico, esegue una query sul filtro per l'interfaccia IFileSourceFilter e chiama IFileSourceFilter::Load. Gli argomenti del metodo Load sono il nome file e il tipo di supporto, come determinato dal Registro di sistema.

Se Filter Graph Manager non riesce a trovare nulla dal Registro di sistema, per impostazione predefinita viene usato il filtro Origine file asincrona. In tal caso, imposta il tipo di supporto su MEDIATYPE_Stream, MEDIASUBTYPE_None.

Tipi di file personalizzati in Lettore multimediale Windows

Lettore multimediale Windows usa un set aggiuntivo di voci del Registro di sistema. Per altre informazioni, vedere Impostazioni del Registro di sistema dell'estensione del nome file in Lettore multimediale Windows SDK.

Scrittura di filtri DirectShow