Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не получается сделать скриншот (DSPACK)

33K
12 мая 2008 года
seska
26 / / 10.04.2008
Возник вопрос. Есть такой набор компонентов как DSPACK, и есть в нем компонент TSampleGrabber. Ниже приведен код, для получения кадра из видеопотока.

 
Код:
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
  Graphics::TBitmap * Pic;
  Pic = new Graphics::TBitmap;
  SampleGrabber1->GetBitmap(Pic);
  Image1->Canvas->Draw(0,0,Pic);
  Pic->Free();
}



Эта штука замечательно работает, если захват изображения идет из видеофайла, а с вебкамеры нет. Кто нить может знает почему?

Посмотрел в DSPACKовских примерах. Под Дельфи есть программа, которая реализует то, что мне нужно. Но перевести код с дельфи на С++ Билдер не получаетсо.

Вот фрагмент кода, для Дельфи, где мне как кажется и кроется главная причина:

Код:
procedure TVideoForm.OnSelectDevice(sender: TObject);
begin
  FilterGraph.ClearGraph;
  FilterGraph.Active := false;
  Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
  FilterGraph.Active := true;
  with FilterGraph as ICaptureGraphBuilder2 do                                                                                // вот этой штуки у меня нет,
    RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter); //и поэтому не работает

  FilterGraph.Play;
end;


На билдере в обработчике того же самого события, у меня пока такой код, и хотелось бы сделать их равнозначными: ;)

Код:
void __fastcall TMainForm::DevicesClick(TObject *Sender)
{
  FilterGraph->ClearGraph();
  FilterGraph->Active = false;
  Filter->BaseFilter->Moniker = SysDev->GetMoniker(((TMenuItem *)Sender)->Tag);
  FilterGraph->Active = true;
  ICaptureGraphBuilder2 *Graph = NULL;
  IBaseFilter *SourceFilter = NULL;
  IBaseFilter *VideoFilter = NULL;
  CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph));
  CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter));
  CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter));
  Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);
  Graph->RenderStream(
  FilterGraph->Play();
  Graph->Release();
  VideoFilter->Release();
  SourceFilter->Release();
}
33K
25 мая 2008 года
seska
26 / / 10.04.2008
Желающих ответить масса ;) Вобщем есть вариант попробовать сделать так, добавить:
 
Код:
CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SampleGrabber1));


и изменить функцию RenderStream
 
Код:
Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleGrabber1, VideoFilter);


Ток все равно ничего не работает ;) Результат. Даже при захвате видео, теперь черный экарн ;)
8.4K
02 июня 2008 года
Zor
104 / / 23.04.2006
вместо того чтобы скулить надо было проект выкладывать. иначе о чем говорить?
// with FilterGraph as ICaptureGraphBuilder2 do - тут как обычное приведение типа
33K
03 июня 2008 года
seska
26 / / 10.04.2008
Zor, никто не скулит и скулить пока не собирается ;) Теперь по делу. При использовании того что закомментированно программа не работает, т.е. появляется черный экран в поле видеозахвата. Код не выкладывал потому что он практически такой же в тестовом примере для DSPACK: C:\DSPACK\Demos\BCB6\Playcap. Только добавлены компоненты Кнопко и Рисунок TImage.
Код:
//---------------------------------------------------------------------------

#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.FriendlyName;
      Device->Tag = i;
      Device->OnClick = DevicesClick;
      Devices->Add(Device);
    }
  };
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::DevicesClick(TObject *Sender)
{
  FilterGraph->ClearGraph();
  FilterGraph->Active = false;
  Filter->BaseFilter->Moniker = SysDev->GetMoniker(((TMenuItem *)Sender)->Tag);
  FilterGraph->Active = true;
  ICaptureGraphBuilder2 *Graph = NULL;
  IBaseFilter *SourceFilter = NULL;
  IBaseFilter *VideoFilter = NULL;
//  IBaseFilter *SampleGrabber;
  CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph));
  CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter));
  CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter));
//  CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SampleGrabber));

  Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);
//  Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleGrabber, VideoFilter);


  FilterGraph->Play();
//  SampleGrabber->Release();
  Graph->Release();

  VideoFilter->Release();
  SourceFilter->Release();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
  delete SysDev;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  FilterGraph->Active = false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
  Graphics::TBitmap *Pic = new Graphics::TBitmap;
  SampleGrabber->GetBitmap(Pic);
  Image1->Canvas->Draw(0, 0, Pic);
}
//---------------------------------------------------------------------------
9.3K
03 июня 2008 года
iridum
175 / / 26.08.2007
Цитата: Zor
вместо того чтобы скулить надо было проект выкладывать. иначе о чем говорить?
приведение типа



Сильно сказано, правда думается, что если кода будет много (проэкт) - врядли кто то читать это вообще будет. Кстати скулить - это относится к собакам, но не к людям.

8.4K
04 июня 2008 года
Zor
104 / / 23.04.2006
Ха. Иначе это гадание по фото. Или кто-то специально будет эти компоненты качать? Да нафиг надо. Если чел который спрашивает сам не хочет выкладывать - это его проблемы.
// могут, еще как
33K
06 июня 2008 года
seska
26 / / 10.04.2008
Уважаемый Зор, или как вас там. Предлагаю прекратить ОФФТОП!!! В первом сообщении было написано все что на мой взгляд нужно для ответа на мой вопрос(или, как модно говорить сейчас, на мой ответ). Если вам этих данных не хватило, можно было написать что то на подобие "код в студию". Предлагаю эти обсуждение закрыть, и далее отписываться тока по существу.
246
06 июня 2008 года
GIZMO
1.8K / / 30.07.2004
2 Zor - следим за базаром ...
кстати, это утверждение:
Цитата: Zor

// with FilterGraph as ICaptureGraphBuilder2 do - тут как обычное приведение типа


не верно

2 seska - не отвечаем (не-по-делу), а жмем кнопку - "Позвать модератора"

Дальше только по сути вопроса.
На первый раз обоим устное внушение.

8.4K
06 июня 2008 года
Zor
104 / / 23.04.2006
2all: ok // и тема плавно уезжает в архивы...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог