이 문서에서는 Microsoft DirectShow에 대한 많은 질문과 대답을 제공합니다.
DirectShow는 어떤 운영 체제를 지원하나요?
DirectShow는 지원되는 모든 버전의 Windows 사용할 수 있습니다.
DirectShow를 사용하여 프로그래밍해야 하는 COM 지식은 얼마인가요?
애플리케이션 개발의 경우 COM 개체를 인스턴스화하고, 노출하는 인터페이스에 액세스하고, 해당 인터페이스에 대한 참조 수를 관리하는 방법 등 COM 개체 작업의 기본 사항을 이해해야 합니다. 필터 개발에는 더 많은 COM 지식이 필요합니다.
DirectShow는 어떤 형식을 지원하나요?
DirectShow에서 지원되는 형식을 참조하세요.
DirectShow HCL(하드웨어 호환성 목록)이 있나요?
아니요. DirectShow는 Microsoft DirectDraw 및 Microsoft DirectSound 하드웨어 기능을 사용할 수 있는 경우 사용합니다. 특별한 하드웨어를 사용할 수 없는 경우 DirectShow는 GDI를 사용하여 비디오를 그리고 waveOut * 멀티미디어 API를 사용하여 오디오를 재생합니다.
DirectShow 애플리케이션을 작성하는 데 사용할 수 있는 언어는 무엇인가요?
DirectShow는 주로 C++ 개발을 위해 설계되었습니다. DirectShow API의 작은 하위 집합은 Visual Basic 6.0을 통해 노출되지만 이 기능은 사용되지 않습니다.
DirectShow는 관리 코드를 통해 액세스할 수 있나요?
Microsoft에는 관리되는 DirectShow API를 구현할 현재 계획이 없습니다.
DirectShow 개발에 필요한 컴파일러는 무엇인가요?
컴파일러의 환경이 올바르게 구성되면 COM(구성 요소 개체 모델) 개체를 생성할 수 있는 모든 컴파일러가 작동해야 합니다.
DirectShow는 Microsoft DirectX와 어떤 관련이 있나요?
내부적으로 DirectShow는 하드웨어에서 지원하는 경우 DirectSound 및 DirectDraw를 사용합니다. Video Renderer 및 오버레이 Mixer 필터는 DirectDraw 3 및 DirectDraw 5 표면을 사용합니다. Video Mixing Renderer 7(Windows XP에만 해당)은 DirectDraw 7 표면을 사용합니다. 비디오 혼합 렌더러 9 및 향상된 비디오 렌더러는 최신 Microsoft Direct3D API를 사용합니다. DirectShow 애플리케이션을 결합할 수 있지만 다른 DirectX API를 사용하여 DirectShow 애플리케이션을 작성할 필요는 없습니다.
DirectShow는 Microsoft ActiveMovie와 어떤 관련이 있나요?
ActiveMovie는 DirectShow의 원래 이름입니다. ActiveMovie라는 용어는 더 이상 사용되지 않습니다.
GraphEdit 유틸리티의 소스 코드를 사용할 수 있나요? GraphEdit를 재배포할 수 있나요?
아니요, 원본을 사용할 수 없으며 Graphedt.exe 재배포할 수 없습니다.
DMO가 DirectShow 필터를 대체하나요?
DirectShow 애플리케이션에서 Microsoft DMO(DirectX Media Objects)를 사용할 수 있습니다. 인코더, 디코더 및 효과의 경우 DirectShow 필터 대신 DMO 작성하는 것이 좋습니다. (참고: 디코더에서 DirectX 비디오 가속을 사용하려면 필터로 구현해야 합니다.) 다른 용도로 DirectShow 필터가 더 적합할 수 있습니다. DMO에 대한 자세한 내용은 DirectX 미디어 개체를 참조하세요.
Windows 미디어 플레이어 AVI 형식 파일을 재생하고 있습니다. 나는 오디오를들을 수 있지만, 대신 어떤 비디오이없는 것 같다, 난 그냥 검은 색을 참조하십시오. 무엇이 문제인가요?
파일에 시스템에 없는 코덱으로 인코딩되었을 수 있습니다. AVI 파일 형식은 일반적이지만 다양한 압축 형식(코덱)을 사용하여 AVI 파일을 만들 수 있습니다. 지원되지 않는 코덱을 사용하는 AVI 파일을 재생하려고 하면 오디오 구성 요소가 들릴 수 있지만 비디오가 검은색 화면으로 표시되거나 화면 내용이 변경되지 않은 상태로 유지됩니다.
참고
Windows 미디어 플레이어 시스템에 코덱이 없는 경우 코덱을 다운로드하여 설치하려고 하는 경우가 많습니다.
내 애플리케이션을 빌드할 어떻게 할까요? 있나요? 필요한 라이브러리 및 헤더 파일은 무엇인가요?
GraphEdit는 문서화되지 않은 많은 필터를 표시합니다. 이러한 필터란?
GraphEdit는 시스템에 등록된 모든 필터를 필터 범주에 열거합니다. 여기에는 타사 애플리케이션에서 설치하거나 다른 Microsoft 기술(예: Windows Media 또는 NetMeeting)에 의해 설치된 필터가 포함될 수 있습니다. 또한 일부 DirectShow 필터는 코덱 또는 하드웨어 디바이스의 래퍼 역할을 하며 각 코덱 또는 디바이스는 고유한 필터로 표시됩니다. Microsoft H.263 Video Codec는 NetMeeting에서 사용되며 DirectShow에서 더 이상 지원되지 않습니다. 자세한 내용은 디바이스 및 필터 열거를 참조하세요.
프로그래밍 방식으로 사용자 지정 그래프를 빌드하는 데 문제가 있습니다.
먼저 GraphEdit를 사용하여 필터 그래프를 빌드해 봅니다. 이 도구를 사용하면 많은 가능성을 신속하게 시뮬레이션할 수 있습니다. GraphEdit는 소스 코드로 빌드하기 전에 그래프를 테스트하는 데 항상 좋은 장소입니다.
그래프 빌드에 대한 자세한 내용은 다음 문서를 참조하세요.
DirectShow가 지정된 컴퓨터에 설치되어 있는지 여부를 검색하려면 어떻게 해야 하나요?
CoCreateInstance를 호출하여 Filter Graph Manager의 인스턴스를 만듭니다. 이 호출이 성공하면 DirectShow가 컴퓨터에 설치됩니다. 다음 코드는 이 방법을 보여 줍니다.
IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);
속성 페이지를 표시하지 않고 필터 설정을 변경할 어떻게 할까요? 있나요?
대부분의 필터는 필터에서 속성을 설정하기 위한 하나 이상의 인터페이스를 노출합니다. 해당 필터에 대한 참조 페이지를 참조하세요. ( DirectShow 필터를 참조하세요.)
GraphEdit를 사용하여 필터를 테스트할 수 있나요?
필터를 개발하는 동안 GraphEdit는 필터 간의 연결을 시각화하는 데 도움이 될 수 있습니다. 필터 기능을 빠르게 테스트할 수도 있습니다. 그러나 강력한 테스트 플랫폼으로는 의미가 없습니다.
필터는 어떤 권한 링에서 실행됩니까?
일부 필터는 링 0에서 실행되는 스트리밍 디바이스를 제어하지만 필터는 링 3에서 실행됩니다. 자세한 내용은 하드웨어 디바이스가 필터 Graph 참여하는 방법을 참조하세요.
커널 디버거를 사용해야 하나요?
이는 특정 프로젝트에 따라 달라집니다. DirectX 디버그 런타임 라이브러리를 설치한다는 것은 디버그 드라이버 및 기타 커널 모드 구성 요소를 설치하는 것을 의미하며, 애플리케이션이 이러한 구성 요소 중 하나에서 디버그 어설션을 발생시키는 경우 커널 디버거가 프로세스에 연결되어 있지 않으면 머신이 자동으로 다시 부팅됩니다.
디버거에서 내 애플리케이션을 실행하면 크래시가 발생합니다.
일부 디코더가 애플리케이션이 디버거에 연결되어 있는 동안 작동하지 않도록 설계되었습니다. 디버거 외부에서 애플리케이션을 실행해 보세요.
DEFINE\_GUID 매크로는 어떻게 작동하나요?
DEFINE_GUID 매크로는 소스 코드에서 GUID 값에 대한 참조를 선언하는 extern
문제를 해결합니다. 예를 들어 프로젝트에 세 개의 원본 파일인 Src1.cpp, Src2.cpp 및 Src3.cpp가 있고 세 파일 모두 정의한 특정 GUID 값을 사용한다고 가정합니다. GUID 값은 프로젝트에서 정확히 한 번 정의해야 하며 다른 소스 파일은 해당 값에 대한 참조를 선언 extern
해야 합니다.
DEFINE_GUID 매크로를 사용하면 두 가지 용도로 동일한 헤더 파일을 사용할 수 있습니다. 헤더 파일에서 GUID를 다음과 같이 선언합니다.
DEFINE_GUID(CLSID_MyObject,
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
(이 예제에 0이 있는 경우 실제 GUID 값을 입력합니다.) Guidgen.exe 유틸리티를 사용하여 새 GUID를 만들고 헤더 파일에 DEFINE_GUID 형식으로 붙여넣을 수 있습니다. GUID를 참조하는 모든 원본 파일에 이 헤더 파일을 포함합니다. 원본 파일 중 하나에 헤더 파일 앞에 헤더 파일 Initguid.h를 포함합니다. 예를 들어:
// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"
// Src2.cpp
#include "MyGuids.h"
// Src3.cpp
#include "MyGuids.h"
Initguid.h 헤더 파일이 포함되지 않은 경우 DEFINE_GUID 매크로는 GUID 값에 extern
대한 참조를 만듭니다. Initguid.h 헤더 파일이 포함된 경우 DEFINE_GUID GUID의 정의 선언을 만들 수 있도록 DEFINE_GUID 매크로를 다시 정의합니다.
원본 파일에 Initguid.h를 포함하지 않으면 링크 오류 "해결되지 않은 외부 기호"가 표시됩니다. 동일한 GUID에 대해 Initguid.h를 두 번 포함하면 컴파일 오류 "재정의; 여러 초기화" 이러한 오류를 해결하려면 Initguid.h가 정확히 한 번 포함되어 있는지 확인합니다. 또한 미리 컴파일된 헤더 파일 내에 Initguid.h를 포함하지 마세요. 이는 실제로 미리 컴파일된 헤더가 모든 소스 파일에 포함되기 때문입니다.