Форум по 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
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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) и опять читает камеру. И так по кругу.

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

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 выставлять.

Поток:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
unit CamThrd;
 
interface
 
uses
  SysUtils, Classes, Graphics, ExtCtrls, IdHTTP, Jpeg;
 
const
 
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:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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, время: 08:32.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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