사용자 지정 파일 형식 등록

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

이 문서에서는 파일 이름이 지정된 필터 Graph 관리자가 원본 필터를 찾는 방법을 설명합니다. 이 메커니즘을 사용하여 사용자 지정 파일 형식을 등록할 수 있습니다. 파일 형식이 등록되면 DirectShow는 애플리케이션이 IGraphBuilder::RenderFile 또는 IGraphBuilder::AddSourceFilter를 호출할 때마다 올바른 원본 필터를 자동으로 로드합니다.

개요

지정된 파일 이름에서 원본 필터를 찾으려면 Filter Graph Manager가 순서대로 다음을 수행하려고 시도합니다.

  1. 프로토콜(있는 경우)을 일치합니다.
  2. 파일 확장명 일치
  3. 검사 바이트라고 하는 파일 내의 바이트 패턴을 일치시킵니다.

프로토콜

"ftp" 또는 "http"와 같은 프로토콜 이름은 에 등록됩니다.

HKEY_CLASSES_ROOT

다음 구조를 사용하는 키:

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

파일 이름 또는 URL에 콜론(':')이 포함된 경우 Filter Graph Manager는 ':' 이전 부분을 프로토콜 이름으로 사용하려고 합니다. 예를 들어 이름이 "myprot://myfile.ext"인 경우 myprot라는 레지스트리 키를 검색합니다. 이 키가 존재하고 "Extensions"라는 하위 키가 포함된 경우 Filter Graph Manager는 해당 하위 키 내에서 파일 확장명과 일치하는 항목을 검색합니다. 키 값은 문자열 형식의 GUID여야 합니다. 예: "{00000000-0000-0000-0000-000000000000}". 필터 그래프 관리자가 확장 하위 키 내의 아무 것과도 일치할 수 없는 경우 원본 필터라는 하위 키를 찾습니다. 이 하위 키는 문자열 형식의 GUID여야 합니다.

필터 그래프 관리자가 일치하는 GUID를 찾으면 이를 원본 필터의 CLSID로 사용하고 필터를 로드하려고 시도합니다. 일치하는 항목을 찾지 못하면 파일 이름을 URL로 처리하는 URL(파일 원본) 필터를 사용합니다.

이 알고리즘에는 두 가지 예외가 있습니다.

  • 드라이버 문자를 제외하기 위해 단일 문자열은 프로토콜로 간주되지 않습니다.
  • 문자열이 "file:" 또는 "file://"인 경우 프로토콜로 처리되지 않습니다.

파일 확장명

파일 이름에 프로토콜이 없으면 Filter Graph Manager는 레지스트리에서 키가 HKEY_CLASSES_ROOT\Media Type\Extensions\항목을 찾습니다. ext\, 여기서 입니다. ext 는 파일 확장명입니다. 이 키가 있는 경우 원본 필터 값에는 원본 필터의 CLSID(문자열 형식)가 포함됩니다. 필요에 따라 키에는 주 형식 및 하위 형식 GUID를 제공하는 미디어 형식 및 하위 형식에 대한 값이 있을 수 있습니다.

바이트 확인

일부 파일 형식은 파일의 특정 바이트 오프셋에서 발생하는 특정 비트 패턴으로 식별할 수 있습니다. Filter Graph Manager는 레지스트리에서 다음 형식의 키를 찾습니다.

HKEY_CLASSES_ROOT\MediaType\{ 주 형식 }\{ 하위 형식 }

여기서 주 형식하위 형식 은 바이트 스트림의 미디어 형식을 정의하는 GUID입니다. 각 키에는 검사 바이트를 정의하는 하나 이상의 하위 키(일반적으로 1, 2 등)와 소스 필터의 CLSID를 문자열 형식으로 제공하는 원본 필터라는 하위 키가 포함됩니다. 검사 바이트 하위 키는 라는 하나 이상의 쿼드를 포함하는 문자열입니다.

offset, cb, mask, val

파일과 일치하기 위해 Filter Graph Manager는 바이트 수 오프셋부터 cb 바이트를 읽습니다. 그런 다음 마스크의 값에 대해 비트 AND를 수행합니다. 결과가 val과 같으면 파일이 해당 쿼드와 일치합니다. 값 마스크 및 val은 16진수로 제공됩니다. 마스크에 대한 빈 항목은 1s 길이의 cb 문자열로 처리됩니다. 오프셋에 대한 음수 값은 파일 끝에서 오프셋을 나타냅니다. 키와 일치하려면 파일이 하위 키의 모든 쿼드와 일치해야 합니다.

예를 들어 레지스트리에 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}"

첫 번째 키는 MEDIATYPE_Stream 주 형식에 해당합니다. 하위 형식 MEDIATYPE_Midi 해당하는 아래 하위 키입니다. 원본 필터 하위 키의 값은 파일 원본(비동기) 필터의 CLSID인 CLSID_AsyncReader.

각 항목에는 여러 쿼드러플이 있을 수 있습니다. 모두 일치해야 합니다. 다음 예제에서는 파일의 처음 4바이트가 0xAB, 0xCD, 0x12, 0x34; 파일의 마지막 4바이트는 0xAB, 0xAB, 0x00, 0xAB.

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

또한 단일 미디어 유형 아래에 여러 항목이 나열될 수 있습니다. 그들 중 하나와 일치하는 것으로 충분합니다. 이 체계는 대체 마스크 집합을 허용합니다. instance 경우 RIFF 헤더가 있을 수도 있고 없을 수도 있는 .wav 파일입니다.

참고

이 체계는 GetClassFile 함수에서 사용하는 스키마와 비슷합니다.

 

원본 필터 로드

필터 그래프 관리자가 파일에 대한 일치하는 원본 필터를 찾은 경우 해당 필터를 그래프에 추가하고, IFileSourceFilter 인터페이스에 대한 필터를 쿼리하고, IFileSourceFilter::Load를 호출합니다. Load 메서드에 대한 인수는 레지스트리에서 결정된 대로 파일 이름 및 미디어 형식입니다.

필터 그래프 관리자가 레지스트리에서 아무것도 찾을 수 없는 경우 기본적으로 비동기 파일 원본 필터를 사용합니다. 이 경우 미디어 형식을 MEDIATYPE_Stream MEDIASUBTYPE_None 설정합니다.

Windows 미디어 플레이어 사용자 지정 파일 형식

Windows 미디어 플레이어 추가 레지스트리 항목 집합을 사용합니다. 자세한 내용은 Windows 미디어 플레이어 SDK의 파일 이름 확장명 레지스트리 설정을 참조하세요.

DirectShow 필터 작성