|
검색을위한 키워드 : DSpack / 웹켐 / 카메라 / 켑춰 / snap shout / capture / 동영상 / directshow / playcap
이런 이런 ~
어제 그리 고생했는데 오늘아침에 와서 맑은 정신으로 하니 한방에 해결했네요. ㅋ
문젠는 SampleGrabber 의 필터 성정이었습니다.
아래 붉은 색으로 된 부분입니다.
수정한 코드를 올립니다. 저도 다른 분들의 도움을 많이 받았으니 저같은 고생은 다시 하지 않으시길 ~ ㅠ.ㅠ
아래는 DSPACK234/Demos/BCB6/Playcap 에 있는 Demo 프로그램에 켑춰를 할 수 있게 수정한 코드입니다.
컴포넌트화면 구성도 이미지로 올렸습니다.
좋은하루되세요~ ^^
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DSPack"
#pragma resource "*.dfm"
TMainForm *MainForm;
TSysDevEnum *SysDev;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
SysDev = new TSysDevEnum(CLSID_VideoInputDeviceCategory);
if (SysDev->CountFilters > 0) {
int i;
TMenuItem *Device;
for(i = 0; i < SysDev->CountFilters; i++) {
Device = new TMenuItem(Devices);
Device->Caption = SysDev->Filters[i].FriendlyName;
Device->Tag = i;
Device->OnClick = DevicesClick;
Devices->Add(Device);
}
};
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
delete SysDev;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
FilterGraph->Active = false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::DevicesClick(TObject *Sender)
{
ICaptureGraphBuilder2 *Graph = NULL;
IBaseFilter *SourceFilter = NULL;
IBaseFilter *VideoFilter = NULL;
IBaseFilter *GrabberFilter = NULL; // SampleGrabber 를 위한 필터
FilterGraph->ClearGraph();
FilterGraph->Active = false;
Filter->BaseFilter->Moniker = SysDev->GetMoniker(((TMenuItem *)Sender)->Tag);
FilterGraph->Active = true;
CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph));
CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter));
CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter));
CheckDSError(SampleGrabber1->QueryInterface(IID_IBaseFilter, &GrabberFilter));
Graph->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, SourceFilter, GrabberFilter, VideoFilter);
FilterGraph->Play();
Graph->Release();
VideoFilter->Release();
SourceFilter->Release();
GrabberFilter->Release();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
// 이미지를 읽어온다.
SampleGrabber1->GetBitmap(Image1->Picture->Bitmap);
Image1->Picture->Bitmap->SaveToFile("c:\\test.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::SampleGrabber1Buffer(TObject *sender,
double SampleTime, Pointer pBuffer, int BufferLen)
{
Image1->Canvas->Lock();
SampleGrabber1->GetBitmap(Image1->Picture->Bitmap, pBuffer, BufferLen);
Image1->Canvas->Unlock();
}
//---------------------------------------------------------------------------
우리 님이 쓰신 글 :
: 우선 답변 정말 감사합니다.
:
: 그런데 예제는 거의 동영상을 플래이하면서 중간에 켑춰하는건데요.
:
: 그 방법으로 웹켐에 적용하면 잘 안되요..ㅠ.ㅠ 켑춰하면 아무것도 안생겨요.
:
: 웹켐일경우는 뭔가 다른것 같은데..
:
: 제가 사용하는 웹켐은 Lebeca 입니다... 많이들 사용하시는 걸거에요..
:
: 혹시 동영상 플래이때와 뭐가 차이가 있는 걸까요..
:
:
:
: 열씸! 님이 쓰신 글 :
: : SampleGrabber Filter 예제가 있을텐데요.
: :
: : FilterGraph 내부에 삽입되어 지나가는 샘플을 캡춰할 수 있게 해 줍니다.
: : 즉,
: : 카메라->디코더(혹은 카메라에서 디코드할 필요없게 RGB로 보내주는 경우엔 필요없게되죠)->
: : 샘플그래버->렌더러 이렇게 연결되는 식이죠.
: : 샘플그래버에서는, 현재 샘플의 타임스탬프와, 이미지나 사운드 데이타(샘플) 의 주소를 얻게 됩니다.
: : 여튼 예제에도 있을테니 찾아보세요.
: :
: : 우리 님이 쓰신 글 :
: : : 안녕하세요.. 정말 찾다 찾다 못찾아서 이렇게 질문을 올립니다.
: : :
: : : 현재 DSpack 사용해서 Form 상에 웹켐을 뛰웠습니다.
: : :
: : : Preview는 잘 됩니다.
: : :
: : : 그런데 이넘을 Capture 해서 사진으로 저장하고싶은데 어떻게 해야할지 정말 모르겠군요.
: : :
: : : 혹시 이런부분에 대하여 고심해본 분이 있다면 조언을 부탁드립니다.
: : :
: : : 감사합니다~
|