|
안녕하세요.heartsim(박경원)입니다.
위 질문에 대한 문제를 아직 해결을 못했군요. ^^;
음...일단 WM_GRAPHNOTIFY메세지 문제는 HandleGraphEvent();함수를 메세지 처리를 안 하고
직접 CaptureVideo()함수 안에 넣는 것으로 해보았습니다.(맨밑에 관련 소스가 있음)
그리고 FindCaptureDevice()함수 문제는 헤더에 #include "strmif.h" 파일을 첨가함으로서 해결을 한 것 같네요(정확히 맞는지는 모르겠음^^;)
그리고 나서 컴파일을 했더니 링커에러가 나더군요.다음과 같습니다.
Linker Error]Unresolved external _MEDIATYPE_Videoreferenced
from C:\PROGRAM FILES\BORLAND\CBUILDER5\TEST\DIRECTX8.1
\PLAYCAP\PLAYCAP.OBJ
[Linker Error]Unresolved external _PIN_CATEGORY_PREVIEW
referenced from C:\PROGRAM FILES\BORLAND\CBUILDER5
\TEST\DIRECTX8.1\PLAYCAP\PLAYCAP.OBJ
링커에러가 나길래 관련 라이브러리를 프로젝트에 추가를 해주었죠.
strmbase.lib(또는 strmbasd.lib), quartz.lib 등등
그런데, 역시 마찬가지고 링커에러가 나더군요.
이 일련의 디버깅 과정이 맞는지는 잘 모르겠으나,
만일 링커에러가 정확한 에러가 맞다면 관련 라이브러리를 추가해주면 되는데요..
그런데 모든 라이브러리를 추가해주었으나 역시 에러가 나는군요.@@;
한가지 유추를 하자면, 제 directx는 8.1입니다.
그리고 라이브러리 파일은 8.0입니다.(strmbase.lib or strmbasd.lib)
버전이 틀리면 라이브러리 파일을 같이 쓸수 없나요?
그리고 디렉트 엑스는 디버그 모드와 릴리스 모드가 있는데,
제 경우는 디버그 모드로 설치를 했습니다.
이 디버그 모드와 릴리스 모드 상태 차이 때문에 결과값이 다르게 나오는 걸가요?
해결이 되는 그 날까지~~~
HRESULT __fastcall TForm1::CaptureVideo(void)//비디오 캡쳐 그리고 프리뷰
{
IBaseFilter *pSrcFilter;
HRESULT hr;
//Get Directshow interface
hr=GetInterfaces();
if(FAILED(hr))
{
MessageBox(Form1->Handle,"Failed to get video interface"," Error Message",MB_OK);
return hr;
}
//Attach the filter graph to the capture graph
hr=g_pCapture->SetFiltergraph(g_pGraph);
if(FAILED(hr))
{
MessageBox(Handle,"Failed to set capture filter graph","Error Message",MB_OK);
return hr;
}
//Use the system device enumerator and class enumerator to find
//a video capture/ preview device, such as a desktop USB video camera.
hr=FindCaptureDevice(&pSrcFilter);
if(FAILED(hr))
{
//Dont display a message because FindCaptureDevice will handle it
return hr;
}
//Add Capture filter to our graph.
hr=g_pGraph->AddFilter(pSrcFilter,L"Video Capture");
if(FAILED(hr))
{
MessageBox(Handle,"Couldnt add capture filter to graph !","AddFilter check",MB_OK);
pSrcFilter->Release();
return hr;
}
//Render the preview pin on the video capture filter
//Use this instead of g_pGraph->RenderFile
hr=g_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pSrcFilter,NULL,NULL);
if(FAILED(hr))
{
MessageBox(Handle,"Couldnt render capture stream.","Render check",MB_OK);
pSrcFilter->Release();
return hr;
}
//Now that the filter has been added to the graph and we have
//rendered its stream, we can release this reference to the filter.
pSrcFilter->Release();
//Set video window style and position
hr=SetupVideoWindow();
if(FAILED(hr))
{
MessageBox(Handle,"Couldnt initialize video window","Setup vedio window check",MB_OK);
return hr;
}
//Add our graph to the running object table, which will allow
//the GraphEdit application to "spy" on our graph
#ifdef REGISTER_FILTERGRAPH
hr=AddGraphToRot(g_pGraph,&g_dwGraphRegister);
if(FAILED(hr))
{
MessageBox(Handle,"Failed to register filter graph with ROT !","ROT check",MB_OK);
g_dwGraphRegister=0;
}
#endif
//Start previewing video data
hr=g_pMC->Run();
if(FAILED(hr))
{
MessageBox(Handle,"Couldnt run the graph","RUN check",MB_OK);
return hr;
}
HandleGraphEvent();
//Remember current state
g_psCurrent=Running;
return S_OK;
}
heartsim 님이 쓰신 글 :
: 안녕하세요.heartsim(박경원)입니다.
: 오랜만에 글 올리네요.^^;
: Directshow의 playcap소스를 빌더(vcl)로 다시 작성해서 컴파일 했는데, 에러 두개가 뜨는군요.
: 하나는 WM_GRAPHNOTIFY가 undefined되었다고 하고,
: 나머지 하나는 FindCaptureDevice함수를 인식을 못하는군요.
:
: WM_GRAPHNOTIFY메세지 경우는 #define WM_GRAPHNOTIFY WM_APP+1로 정의해서 메세지 맵처리를 해줬습니다.
: 헌데 제가 잘못 했는지 undefined 되었다고 하오네요..@@;
: 혹 메세지 맵에서 메세지구조체를 잘못써줬나?^^;
:
: 그리고 FindCaptureDevice함수는 원문playcap소스의 FindCaptureDevice함수와 거의 비슷하게 코딩을 해줬는데,, 역시 에러가...나는군요.전혀 함수 인식을 못합니다.(다른 함수는 문제가 없는데)
:
: 혼자 해볼려고 했는데(5일째 고생중@@;) 도저히 안되서리...혹 이쪽분야로 아시는 분 있나해서
: 대략 글을 띄워봅니다.
: 혹 Directshow8.1하면서 유의해야 할 사항이나 더 추가해줘야 할 헤더 또는 라이브러리가 있지는 않은지.....고수님들의 답변 부탁드려요..
:
: 참고로 directx sdk8.1을 설치했고, 원문 vc++로 되어 있는것을 Vc++ Conversion Wizard를 이용해 bcb로 컨버전 해서 돌려봤습니다.
: 그런데 한가지 의문은 amcap은 컨버전으로 돌아가는데, playcap은 컨버전으로 컴파일 하면 에러가 나는군요.(그래서 bcb로 다시 작성했을때 에러가 나는건가???)
:
:
|