사용자 지정 파일 형식 등록
[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, 그리고 Media Foundation 의 오디오/비디오 캡처에 의해 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngine 및 Audio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 문서에서는 파일 이름이 지정된 경우 Filter Graph Manager가 소스 필터를 찾는 방법을 설명합니다. 이 메커니즘을 사용하여 사용자 지정 파일 형식을 등록할 수 있습니다. 파일 형식이 등록되면 애플리케이션이 IGraphBuilder::RenderFile또는 IGraphBuilder::AddSourceFilter호출할 때마다 DirectShow에서 올바른 원본 필터를 자동으로 로드합니다.
개요
지정된 파일 이름에서 원본 필터를 찾기 위해 Filter Graph Manager는 다음을 순서대로 수행하려고 시도합니다.
- 프로토콜(있는 경우)을 일치합니다.
- 파일 확장자를 일치시키세요.
- 파일 내의 검사 바이트라고 하는 바이트 패턴을일치시킵니다.
프로토콜
"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"라는 하위 키가 포함된 경우 필터 그래프 관리자는 해당 하위 키 내에서 파일 확장명과 일치하는 항목을 검색합니다. 키 값은 문자열 형식의 GUID여야 합니다. 예를 들어 "{00000000-0000-0000-0000-000000000000}"입니다. 필터 그래프 관리자가 확장 하위 키 내의 모든 항목과 일치할 수 없는 경우 원본 필터이름이 지정된 하위 키를 찾습니다. 이 하위 키는 문자열 형식의 GUID여야 합니다.
필터 그래프 관리자가 일치하는 GUID를 찾으면 이를 원본 필터의 CLSID로 사용하고 필터를 로드하려고 시도합니다. 일치하는 항목을 찾지 못하면 파일 이름을 URL로 처리하는 URL(파일 원본) 필터를 사용합니다.
이 알고리즘에는 두 가지 예외가 있습니다.
- 드라이버 문자를 제외하기 위해 단일 문자 문자열은 프로토콜로 간주되지 않습니다.
- 문자열이 "file:" 또는 "file://"인 경우 프로토콜로 처리되지 않습니다.
파일 확장자
파일 이름에 프로토콜이 없으면 Filter Graph Manager는 레지스트리에서 키 HKEY_CLASSES_ROOT\Media Type\Extensions\있는 항목을 찾습니다.내선\, 여기서 .내선 파일 확장명입니다. 이 키가 있는 경우 원본 필터 값에는 소스 필터의 CLSID가 문자열 형식으로 포함됩니다. 필요에 따라 키에는 미디어 형식 및 하위 형식값이 있을 수 있습니다. 이 값은 주 형식 및 하위 형식 GUID를 제공합니다.
바이트 확인
일부 파일 형식은 파일의 특정 바이트 오프셋에서 발생하는 비트의 특정 패턴으로 식별할 수 있습니다. 필터 그래프 관리자는 레지스트리에서 다음 형식의 키를 찾습니다.
HKEY_CLASSES_ROOT\MediaType\{ 주 형식 }\{ 하위 형식 }
여기서 주 형식 및 하위 형식 바이트 스트림에 대한 미디어 형식을 정의하는 GUID입니다. 각 키에는 검사 바이트를 정의하는 하나 이상의 하위 키(일반적으로 1, 2 등)가 포함됩니다. 및 소스 필터의 CLSID를 문자열 형식으로 제공하는 소스 필터 명명된 하위 키입니다. 체크 바이트 하위 키는 하나 이상의 숫자 쿼드를 포함하는 문자열입니다.
오프셋, cb, 마스크, val
파일과 일치하기 위해 Filter Graph Manager는 바이트 번호 오프셋부터 cb 바이트를 읽습니다. 그런 다음 마스크 값과 비트 단위 AND 연산을 수행합니다. 결과가 val과 같으면 파일은 해당 쿼드와 일치합니다. 값 마스크와 val은 16진수로 제공됩니다. 마스크에 대한 빈 항목은 길이 cb의 1s 문자열로 처리됩니다. 오프셋 값이 음수일 경우, 파일의 끝에서부터 오프셋이 계산됩니다. 키와 일치하려면 파일이 하위 키의 모든 쿼드와 일치해야 합니다.
예를 들어 레지스트리에 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_AsyncReader, 파일 원본(비동기) 필터의 CLSID입니다.
각 항목에는 여러 쿼드러플이 있을 수 있습니다. 모두 동일해야 합니다. 다음 예제에서 파일의 처음 4바이트는 0xAB, 0xCD, 0x12, 0x34여야 하고, 파일의 마지막 4바이트는 0xAB, 0xAB, 0x00, 0xAB여야 합니다.
0, 4, , ABCD1234, -4, 4, , ABAB00AB
또한 단일 미디어 유형 아래에 여러 항목이 나열될 수 있습니다. 그들 중 하나와의 일치만으로도 충분합니다. 이 체계는 대체 마스크 집합을 허용합니다. 예를 들어, RIFF 헤더가 있거나 없을 수도 있는 .wav 파일이 포함됩니다.
메모
이 체계는 GetClassFile 함수에서 사용하는 체계와 비슷합니다.
원본 필터 로드
필터 그래프 관리자가 파일에 대해 일치하는 원본 필터를 찾은 경우 해당 필터를 그래프에 추가하고, IFileSourceFilter 인터페이스에 대한 필터를 쿼리하고, IFileSourceFilter::Load호출합니다. Load 메서드에 대한 인수는 레지스트리에서 결정된 대로 파일 이름 및 미디어 형식입니다.
필터 그래프 관리자가 레지스트리에서 아무것도 찾을 수 없는 경우 기본적으로 비동기 파일 원본 필터를 사용합니다. 이 경우 미디어 형식을 MEDIATYPE_StreamMEDIASUBTYPE_None설정합니다.
Windows Media Player의 사용자 지정 파일 형식
Windows Media Player는 추가 레지스트리 항목 집합을 사용합니다. 자세한 내용은 Windows Media Player SDK의 파일 이름 확장명 레지스트리 설정 참조하세요.
관련 항목