|
Вопрос # 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. Там немного, пару строк.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|