| 
| 
 | Вопрос # 1 433/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Как бы в продолжения Вопроса # 1429. Захватил изображение,теперь мне небходимо передать его по сети,но перед этим,я так понимаю его надо подвергнуть компресии. Так как мне выделить видеопоток и как его компресировать(конечно с последующим его воспроизведением).Может для этого есть спецкомпоненты. 
|  |   Вопрос задал: GAZ (статус: Посетитель)Вопрос отправлен: 19 марта 2008, 20:08
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 10; последнее сообщение — 22 марта 2008, 16:35; участников в обсуждении: 2. 
|   | Вадим К (статус: Академик), 19 марта 2008, 21:51 [#1]:В такой постановке задачи это выливается в софтину стоимостью несколько килобаксов. (за экземпляр конечно  , сорцы будут дороже). Но так никто не делает. Програмное сжатие MPEG уже на одной камере будет давать значительную нагрузку. Для этого используют аппаратные методы.
 
 Хотелось бы узнать цели этой программы, не проще ли купить так называемую IP камеру? там передача по сети уже встроена.
 
 Хотя возможно задачу можно и проще решить - передавать jpeg картинки по несколько штук в секунду. На быстрых каналах лучше даже и не жать - само сжатие отымает больше время чем передача, хотя надо всегда искать золотую середину.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 20 марта 2008, 06:37 [#2]:Вадим К Т.е возможен такой вариант.Поставить таймер и через какое-то время снимать по кадру из потока переводить в jpeg и передавать.
 |  
|   | Вадим К (статус: Академик), 20 марта 2008, 22:48 [#3]:Конечно возможен. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 21 марта 2008, 06:23 [#4]:Вадим К Порылся в интернете и нашёл http://subscribe.ru/archive/comp.soft.prog.delphiinternet/200602/12023240.html
 статью  "Передача файлов посредством TClientSocket и TServerSocket на примере передачи скриншотов (Delphi)."с готовым исходником.
 Теперь осталось написать процедуру по таймеру у которой на входе avi поток на выходе кадр bmp(перевод в jpeg есть).
 В этом могли бы вы мне помочь?
 |  
|   | Вадим К (статус: Академик), 21 марта 2008, 21:23 [#5]:а что же там непонятно, помоему у вас есть все, что бы начать писать код. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 22 марта 2008, 14:43 [#6]:Как bmp загонять не в Timage,как реализовано в пакете DSPack,а в память,потом мой обработчик,очистка памяти и всё заново по таймеру. |  
|   | Вадим К (статус: Академик), 22 марта 2008, 15:16 [#7]:приведите пример того, как они добавляют, я покажу как переписать. У меня нет сейчас времени устанавливать компоненты, разбираться.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 22 марта 2008, 16:09 [#8]:SampleGrabber: TSampleGrabber;//это компонент из пакета ......
 procedure TVideoForm.SnapShotClick(Sender: TObject);
 begin
 SampleGrabber.GetBitmap(Image.Picture.Bitmap);
 end;
 |  
|   | GAZ (статус: Посетитель), 22 марта 2008, 16:10 [#9]:unit main; 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DSUtil, StdCtrls, DSPack, DirectShow9, Menus, ExtCtrls;
 
 type
 TVideoForm = class(TForm)
 FilterGraph: TFilterGraph;
 VideoWindow: TVideoWindow;
 MainMenu1: TMainMenu;
 Devices: TMenuItem;
 Filter: TFilter;
 Image: TImage;
 SampleGrabber: TSampleGrabber;
 SnapShot: TButton;
 CallBack: TCheckBox;
 procedure FormCreate(Sender: TObject);
 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 procedure SnapShotClick(Sender: TObject);
 procedure SampleGrabberBuffer(sender: TObject; SampleTime: Double;
 pBuffer: Pointer; BufferLen: Integer);
 private
 { Dйclarations privйes }
 public
 { Dйclarations publiques }
 procedure OnSelectDevice(sender: TObject);
 end;
 
 var
 VideoForm: TVideoForm;
 SysDev: TSysDevEnum;
 implementation
 
 {$R *.dfm}
 
 procedure TVideoForm.FormCreate(Sender: TObject);
 var
 i: integer;
 Device: TMenuItem;
 begin
 SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
 if SysDev.CountFilters > 0 then
 for i := 0 to SysDev.CountFilters - 1 do
 begin
 Device := TMenuItem.Create(Devices);
 Device.Caption := SysDev.Filters[i].FriendlyName;
 Device.Tag := i;
 Device.OnClick := OnSelectDevice;
 Devices.Add(Device);
 end;
 end;
 
 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;
 
 procedure TVideoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 begin
 CallBack.Checked := False;
 SysDev.Free;
 FilterGraph.ClearGraph;
 FilterGraph.Active := false;
 end;
 
 procedure TVideoForm.SnapShotClick(Sender: TObject);
 begin
 SampleGrabber.GetBitmap(Image.Picture.Bitmap);
 end;
 
 procedure TVideoForm.SampleGrabberBuffer(sender: TObject;
 SampleTime: Double; pBuffer: Pointer; BufferLen: Integer);
 begin
 if CallBack.Checked then
 begin
 Image.Canvas.Lock;
 try
 SampleGrabber.GetBitmap(Image.Picture.Bitmap, pBuffer, BufferLen);
 finally
 Image.Canvas.Unlock;
 end;
 end;
 end;
 
 end.
 
 а это вобщем-то сам пример из папки Demos этого пакета
 |  
|   | Вадим К (статус: Академик), 22 марта 2008, 16:35 [#10]:первым долгом надо определиться, как будет получаться изображение. Здесь есть два варианта - по таймеру генерируется картинка, потом отправляется клиенту. Либо клиент запрашивает и по запросу ему выдаётся картинка. Если клиентов будет много, то надо немного усовершенствовать метод - картинки на сервере будут генерироваться по таймеру, а клиентам отдаваться по запросу готовые, а то десяток клиентов уложит сервер.
 Итак, процедура запроса картинки от клиента может выглядеть где то так
 
 var bmp:TBitmap;
begin
 bmp:=TBitmap.create;
 try
   SampleGrabber.GetBitmap(bmp);
   //можно сжать, если что
   ....
   //теперь нужно передать клиенту
   ....
   //код передачи вставляйте самостоятельно, картинка в bmp.
 finally
   bmp.free;
  end;
end;Поищите среди вопросов, где то было сжатие в JPEG. Там немного, пару строк. Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |