Bagikan melalui


Mendaftarkan Tipe File Kustom

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Artikel ini menjelaskan bagaimana Filter Graph Manager menemukan filter sumber, dengan nama file. Anda dapat menggunakan mekanisme ini untuk mendaftarkan jenis file kustom Anda sendiri. Setelah jenis file terdaftar, DirectShow akan secara otomatis memuat filter sumber yang benar setiap kali aplikasi memanggil IGraphBuilder::RenderFile atau IGraphBuilder::AddSourceFilter.

Gambaran Umum

Untuk menemukan filter sumber dari nama file tertentu, Filter Graph Manager mencoba melakukan hal berikut, secara berurutan:

  1. Cocokkan protokol, jika ada.
  2. Cocokkan ekstensi file.
  3. Cocokkan pola byte dalam file, yang disebut byte pemeriksaan.

Protokol

Nama protokol seperti "ftp" atau "http" terdaftar di bawah

HKEY_CLASSES_ROOT

kunci, dengan struktur berikut:

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

Jika nama file atau URL berisi titik dua (':'), Filter Graph Manager mencoba menggunakan bagian sebelum ':' sebagai nama protokol. Misalnya, jika namanya adalah "myprot://myfile.ext", nama tersebut akan mencari kunci registri bernama myprot. Jika kunci ini ada dan berisi subkuntang bernama "Extensions", Filter Graph Manager mencari di dalam subkey tersebut untuk entri yang cocok dengan ekstensi file. Nilai kunci harus berupa GUID dalam bentuk string; misalnya, "{00000000-0000-0000-0000-000000000000}". Jika Filter Graph Manager tidak dapat mencocokkan apa pun dalam subkunji Ekstensi , ia mencari subkunji bernama Filter Sumber, yang juga harus berupa GUID dalam bentuk string.

Jika Filter Graph Manager menemukan GUID yang cocok, ia menggunakan ini sebagai CLSID filter sumber, dan mencoba memuat filter. Jika tidak menemukan kecocokan, ia menggunakan filter Sumber File (URL), yang memperlakukan nama file sebagai URL.

Ada dua pengecualian untuk algoritma ini:

  • Untuk mengecualikan huruf driver, string karakter tunggal tidak dianggap sebagai protokol.
  • Jika string adalah "file:" atau "file://", string tidak diperlakukan sebagai protokol.

Ekstensi File

Jika tidak ada protokol dalam nama file, Filter Graph Manager akan melihat registri untuk entri dengan kunci HKEY_CLASSES_ROOT\Media Type\Extensions\. ext\, di mana . ext adalah ekstensi file. Jika kunci ini ada, nilai Filter Sumber berisi CLSID filter sumber, dalam bentuk string. Secara opsional, kunci dapat memiliki nilai untuk Jenis Media dan Subjenis, yang memberikan GUID jenis dan subjenis utama.

Periksa Byte

Beberapa jenis file dapat diidentifikasi oleh pola bit tertentu yang terjadi pada offset byte tertentu dalam file. Filter Graph Manager melihat di registri untuk kunci dengan formulir berikut:

HKEY_CLASSES_ROOT\MediaType\{ tipe utama }\{ subjenis }

di mana jenis utama dan subjenis adalah GUID yang menentukan jenis media untuk aliran byte. Setiap kunci berisi satu atau beberapa subkey, biasanya bernama 1, 2, dan seterusnya, yang menentukan byte pemeriksaan; dan subkey bernama Filter Sumber yang memberikan CLSID filter sumber, dalam bentuk string. Subkey check-byte adalah string yang berisi satu atau beberapa quad angka yang disebut:

offset, cb, masker, val

Agar sesuai dengan file, Filter Graph Manager membaca byte cb, mulai dari offset nomor byte. Kemudian melakukan bitwise-AND terhadap nilai dalam masker. Jika hasilnya sama dengan val, file cocok untuk quad tersebut. Nilai masker dan val diberikan dalam hex. Entri kosong untuk masker diperlakukan sebagai string dengan panjang 1dtk cb. Nilai negatif untuk offset menunjukkan offset dari akhir file. Untuk mencocokkan kunci, file harus cocok dengan semua quad di salah satu subkey.

Misalnya, asumsikan registri berisi kunci berikut di bawah HKCR\Jenis Media:

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

Kunci pertama sesuai dengan jenis utama MEDIATYPE_Stream. Sub-kunci di bawah ini yang sesuai dengan subjenis MEDIATYPE_Midi. Nilai untuk subkey Filter Sumber adalah CLSID_AsyncReader, CLSID filter Sumber File (Asinkron).

Setiap entri dapat memiliki beberapa quadruples; semuanya harus cocok. Dalam contoh berikut, 4 byte pertama file harus 0xAB, 0xCD, 0x12, 0x34; dan 4 byte terakhir dari file harus 0xAB, 0xAB, 0x00, 0xAB:

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

Selain itu, mungkin ada beberapa entri yang tercantum di bawah satu jenis media. Kecocokan dengan salah satu dari mereka sudah cukup. Skema ini memungkinkan satu set masker alternatif; misalnya, file .wav yang mungkin atau mungkin tidak memiliki header RIFF.

Catatan

Skema ini mirip dengan yang digunakan oleh fungsi GetClassFile .

 

Memuat Filter Sumber

Dengan asumsi bahwa Filter Graph Manager menemukan filter sumber yang cocok untuk file, filter tersebut menambahkan filter tersebut ke grafik, mengkueri filter untuk antarmuka IFileSourceFilter , dan memanggil IFileSourceFilter::Load. Argumen untuk metode Muat adalah nama file dan jenis media, seperti yang ditentukan dari registri.

Jika Filter Graph Manager tidak dapat menemukan apa pun dari registri, defaultnya adalah menggunakan filter Sumber File Asinkron. Dalam hal ini, ini mengatur jenis media ke MEDIATYPE_Stream, MEDIASUBTYPE_None.

Tipe File Kustom di Pemutar Media Windows

Pemutar Media Windows menggunakan sekumpulan entri registri tambahan. Untuk informasi selengkapnya, lihat Pengaturan Registri Ekstensi Nama File di SDK Pemutar Media Windows.

Menulis Filter DirectShow