Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.09.2015, 13:41
djmix djmix вне форума
Прохожий
 
Регистрация: 24.06.2014
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
Вопрос как открыть поток с видеокамеры на дельфи

есть ссылка http://cam.pddd.perm.ru:81/?c=385

как в дельфи можно открыть её в том же например компоненте Image1 и сохранять??

Спасибо заранее за ответ.
Ответить с цитированием
  #2  
Старый 28.09.2015, 13:57
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Content-Type: image/jpeg у Response. так что как обычный jpg отображаешь на Image
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
djmix (29.09.2015)
  #3  
Старый 28.09.2015, 14:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  MemoryStream: TMemoryStream;
  JPEGImage: TJPEGImage;
begin
  MemoryStream:=TMemoryStream.Create;
  JPEGImage:=TJPEGImage.Create;
  try
    IdHTTP1.Get('http://cam.pddd.perm.ru:81/?c=385', MemoryStream);
    MemoryStream.Position:=0;
    JPEGImage.LoadFromStream(MemoryStream);
    Image1.Picture.Assign(JPEGImage);
  finally
    JPEGImage.Free;
    MemoryStream.Free;
  end;
end;
у Image1 свойство AutoSize лучше включить
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
djmix (29.09.2015)
  #4  
Старый 01.10.2015, 15:49
djmix djmix вне форума
Прохожий
 
Регистрация: 24.06.2014
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
Вопрос

появился ещё вопрос, открыл 16 потоков, по 16 камер хочу глядеть меняя их, и конечно это всё тормозит жуть как , как сделать типа антифриз?

могу скинуть исходный код что у меня получилось, может подскажете?
Ответить с цитированием
  #5  
Старый 01.10.2015, 17:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

"Выкинуть" работу с отдельной камерой в отдельный поток, не?
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
djmix (01.10.2015)
  #6  
Старый 01.10.2015, 18:27
djmix djmix вне форума
Прохожий
 
Регистрация: 24.06.2014
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
"Выкинуть" работу с отдельной камерой в отдельный поток, не?

я могу исходник скинуть вроде так и сделал, всё равно тормозит(
Ответить с цитированием
  #7  
Старый 01.10.2015, 23:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Значит что-то не так сделал.
Ща из браузера посмотрел. Там сайт притормаживает, само отображение практически мгновенное, что и в программе должно быть.

Надо твой код смотреть. Ты случаем на каждый запрос потоки не пересоздаешь ли?
Ответить с цитированием
  #8  
Старый 02.10.2015, 07:27
djmix djmix вне форума
Прохожий
 
Регистрация: 24.06.2014
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

скинул будет возможность посмотреть?
Ответить с цитированием
  #9  
Старый 04.10.2015, 17:41
djmix djmix вне форума
Прохожий
 
Регистрация: 24.06.2014
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Значит что-то не так сделал.
Ща из браузера посмотрел. Там сайт притормаживает, само отображение практически мгновенное, что и в программе должно быть.

Надо твой код смотреть. Ты случаем на каждый запрос потоки не пересоздаешь ли?


по правильному. переходя к другой камере что необходимо сделать?
не пересоздавать поток и открывать другую ссыль можно и правильно??
я и хотел чтобы посмотрел, где ошибка(
Ответить с цитированием
  #10  
Старый 04.10.2015, 19:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну смотри. Ты хочешь мониторить 16 камер. Т.о. тебе надо 16 потоков.
Каждый поток считывает картинку с одной камеры, отображает ее (не забываем синхронизацию), потом ждет, допустим, 1 секунду (sleep) и опять читает камеру. И так по кругу.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
djmix (04.10.2015)
  #11  
Старый 04.10.2015, 21:23
djmix djmix вне форума
Прохожий
 
Регистрация: 24.06.2014
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
Вопрос

Цитата:
Сообщение от lmikle
Ну смотри. Ты хочешь мониторить 16 камер. Т.о. тебе надо 16 потоков.
Каждый поток считывает картинку с одной камеры, отображает ее (не забываем синхронизацию), потом ждет, допустим, 1 секунду (sleep) и опять читает камеру. И так по кругу.

всё чётко, оно работает, я пытаюсь сказать следующее.

я засунул следующий код по каждой камере в таймер

Код:
label1.Caption:=inttostr(strint1);
MemoryStream:=TMemoryStream.Create;
  JPEGImage1:=TJPEGImage.Create;
  try
    IdHTTP1.Get('http://cam.pddd.perm.ru:81/?c='+inttostr(strint1)+'', MemoryStream);
    //label5.Caption:=IdHTTP1.Get;
    MemoryStream.Position:=0;
     JPEGImage1.LoadFromStream(MemoryStream);
   // JPEGImage.LoadFromStream(MemoryStream);
    Image1.Picture.Assign(JPEGImage1);

  finally
  // idHttp1.Free;
    JPEGImage1.Free;
    MemoryStream.Free;
  end;

следующий момент , сделал что все эти камеры буду меняться по нажатию кнопки

Код:
strint1:=strint1+strtoint(edit1.text);
strint2:=strint2+strtoint(edit2.text);
strint3:=strint3+strtoint(edit3.text);
strint4:=strint4+strtoint(edit4.text);
strint5:=strint5+strtoint(edit5.text);
strint6:=strint6+strtoint(edit6.text);
strint7:=strint7+strtoint(edit7.text);
strint8:=strint8+strtoint(edit8.text);
strint9:=strint9+strtoint(edit9.text);
strint10:=strint10+strtoint(edit10.text);
strint11:=strint11+strtoint(edit11.text);
strint12:=strint12+strtoint(edit12.text);
strint13:=strint13+strtoint(edit13.text);
strint14:=strint14+strtoint(edit14.text);
strint15:=strint15+strtoint(edit15.text);
strint16:=strint16+strtoint(edit16.text);
короч к каждой камере прибавляю 16, будь то 500мс или 5 сек у таймера, всё работает отлично. но когда листаю так камеры, раз пять пролистав, тупо начинает виснуть программа. как понять что происходит.

ну а если ничего не делать (не листать никуда с самого начала) то я получаю изображения, всё гуд, но там камер куча и хочу поглядеть все будучи далеко от моего города. в чём подвох может быть?
Ответить с цитированием
  #12  
Старый 05.10.2015, 22:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Видимо, они начинают мешать друг другу. Не считая того, что ВСЕ запросы выполняются в одном потоке - главном потоке приложения. Предположу, что если оставить программу поработать подольше, то она тоже начнет тормозить.
Можно попробовать запустить ее под каким-нить профайлером... или поставить отладочную печать... Все-равно, есть подозрение, что по мере срабатывания таймеров очередь сообщений все растет и растет. Просто твои переключения быстрее забиавют очередь, вот и проявляется быстрее. Выноси в потоки, что бы в основном потоке была работа только с отображением.
Ответить с цитированием
  #13  
Старый 06.10.2015, 07:20
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну не знаю, что у тебя там тормозит...
Сделал такую программку (на 9 камер правда, а не на 16). Спокойно все показывает, листает. Там только некоторых камер, походу, нет или они не работают (какое-то стандартное изображение с гербом выводится). Одна только проблема - TImage мыргает при перерисовке. Надо у формы DoubleBuffered выставлять.

Поток:
Код:
unit CamThrd;

interface

uses
  SysUtils, Classes, Graphics, ExtCtrls, IdHTTP, Jpeg;

const
  CamUrl = 'http://cam.pddd.perm.ru:81/?c=%d';

type
  TCamThread = class(TThread)
  private
    { Private declarations }
    FCamNo : Integer;
    FImage : TImage;

    FHTTP : TIdHTTP;
    FMemStream : TMemoryStream;
    FJpeg : TJpegImage;

    procedure UpdateImage;
  protected
    procedure Execute; override;
  public
    constructor Create(ACamNo : Integer; AImage : TImage); virtual;
    destructor Destroy; override;

    procedure SetCamNo(ACamNo : Integer);
  end;

implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TCamThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TCamThread }

constructor TCamThread.Create(ACamNo: Integer; AImage: TImage);
begin
  FCamNo := ACamNo;
  FImage := AImage;

  FHTTP := TIdHTTP.Create(Nil);
  FMemStream := TMemoryStream.Create;
  FJpeg := TJpegImage.Create;

  inherited Create(False);
end;

destructor TCamThread.Destroy;
begin
  FHTTP.Free;
  FMemStream.Free;
  FJpeg.Free;

  inherited;
end;

procedure TCamThread.Execute;
begin
  While Not Terminated Do
    Begin
      FMemStream.Clear;
      Try
        FHTTP.Get(Format(CamUrl,[FCamNo]),FMemStream);
        FMemStream.Seek(0,soFromBeginning);
        If FMemStream.Size > 0
          Then FJpeg.LoadFromStream(FMemStream);
        Synchronize(UpdateImage);
      Except
        FJpeg.Width := 1;
        FJpeg.Height := 1;
      End;
      If Not Terminated Then Sleep(2000);
    End;
end;

procedure TCamThread.SetCamNo(ACamNo: Integer);
begin
  FCamNo := ACamNo;
end;

procedure TCamThread.UpdateImage;
begin
  If FImage <> Nil Then
    FImage.Picture.Assign(FJpeg);
end;

end.

Главная формa:
Код:
unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Jpeg, ExtCtrls, CamThrd, StdCtrls;

type
  TMainForm = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    btPrev: TButton;
    btNext: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btPrevClick(Sender: TObject);
    procedure btNextClick(Sender: TObject);
  private
    { Private declarations }
    FThreads : Array [1..9] Of TCamThread;
    FCamBias : Integer;

    procedure UpdateCams;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
var
  I : Integer;
  AImage : TImage;
  ALabel : TLabel;
begin
  Self.DoubleBuffered := True;
  FCamBias := 0;
  For I := 1 To 9 Do
    Begin
      AImage := Self.FindComponent('Image' + IntToStr(I)) As TImage;
      FThreads[i] := TCamThread.Create(FCamBias*9 + I,AImage);
      ALabel := Self.FindComponent('Label' + IntToStr(I)) As TLabel;
      ALabel.Caption := IntToStr(FCamBias*9 + I);
    End;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
var
  I : Integer;
begin
  For I := 1 To 9 Do
    Begin
      FThreads[i].Terminate;
      FThreads[i].WaitFor;
      FThreads[i].Free;
    End;
end;

procedure TMainForm.btPrevClick(Sender: TObject);
begin
  If FCamBias <= 0
    Then FCamBias := 0
    Else FCamBias := FCamBias - 1;
  UpdateCams;
end;

procedure TMainForm.UpdateCams;
var
  I : Integer;
  ALabel : TLabel;
begin
  For I := 1 To 9 Do
    Begin
      FThreads[i].Suspend;
      FThreads[i].SetCamNo(FCamBias*9 + I);
      FThreads[i].Resume;

      ALabel := Self.FindComponent('Label' + IntToStr(I)) As TLabel;
      ALabel.Caption := IntToStr(FCamBias*9 + I);
    End;
end;

procedure TMainForm.btNextClick(Sender: TObject);
begin
  FCamBias := FCamBias + 1;
  UpdateCams;
end;

end.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
djmix (06.10.2015)
  #14  
Старый 06.10.2015, 12:49
djmix djmix вне форума
Прохожий
 
Регистрация: 24.06.2014
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ну не знаю, что у тебя там тормозит...
Сделал такую программку (на 9 камер правда, а не на 16). Спокойно все показывает, листает. Там только некоторых камер, походу, нет или они не работают (какое-то стандартное изображение с гербом выводится). Одна только проблема - TImage мыргает при перерисовке. Надо у формы DoubleBuffered выставлять.
.........................
[/code]

спасиб огромное , доберусь до дома буду проверять исправляться.
Ответить с цитированием
  #15  
Старый 06.10.2015, 17:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Будешь что?
Мне интересно - как этот процесс выглядит - "проверять исправляться"...

ЗЫ. А ты не знаешь, еще для каких городов есть подобные камеры, доступные on-line?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025