Autor Téma: Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)  (Přečteno 6324 krát)

Offline SaLIk

  • Mladík
  • **
  • Příspěvků: 71
  • Karma: 1
    • Verze Delphi: 2010, 10 (Seattle)
    • salikovi.cz
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #15 kdy: 01-07-2012, 07:29:47 »
přesně toto jsem řešil před rokem,
nakonec jsem zrobil novou komponentu ktera spusti svoje prijmaci vlakno v synapsi  a obrazek se meni sam. (pres critical section)

Te nove komponente nastavis pak jenom IP kamery a auz to jede...

pokud bys ten kod chtel, muzu ti ho poslat ale napred se musim zeptat zakaznika,

Frankee

měl bych dotaz: uměla ta tvoje komponenta zobrazit video z RTSP streamu?

Offline frankee

  • Příspěvků: 16
  • Karma: 3
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #16 kdy: 03-07-2012, 07:59:16 »
ahoj,
k tomu abych odpověděl musím přidat komentář, ale ano zobrazoval jsem to TImage komponentou a s rychlostí nebyl problém....
Tuto část programu jsem nedělal, pouze upravoval (strčil jsem celou konstrukci do samostatné komponenty)

v průběhu návrhu jsem řešil tyto problémy, které byly tě mohly zajímat.
-přestože TCP spojení by mělo přinášet data v pořádku, data přichází s chybami
-kamery se dynamicky odpojují a na pozadí resetují...,takže pak nereagují na GET request...
-synchronizace video rámců

Nakonec jsem komponentu navrhl jako pyramidu následujících vláken startujících po předešlém
- start pingacího vlákna (jakmile se najde cíl a je vrácen ping true, pokračuje se) ale pingá se pořád v 5 sekundových intervalech
- start vlákna pro obsluhu softwarového telefonu linphone (s linphone jsem komunikoval přes pipes, které bylo nutno zpracovávat)
- start video vlákna pro získávání obrazu z kamery

V případě jakýchkoli problémů se pyramida zboří (vlákna ukončí) a začíná se od počáteční konstrukce pingacím vláknem...



následující kód ukazuje, jak jsem přiřazoval data obrázku...
-------------------------
procedure TMJPEG.Redraw;
begin
  if not KonecMJPEG then
  begin
    PVideoImage.Picture.Assign(JPEGImage);
    // zobrazime obrazek v komponente Image
    // refresh zpusoboval zpomalovani
    // PVideoImage.Refresh;
    // zde odstranena zavislost na hlavnim formu.
    // Form1.Image1.Picture.Assign(JPEGImage); //zobrazime obrazek v komponente Image
    // Form1.Image1.Refresh;
  end;
end;
.
.
.
kus procedury pro nacitani dat
.....
 JPEGStream.Seek(0, soFromBeginning);
  // posuneme se na zacatek datoveho proudu
 JPEGImage.LoadFromStream(JPEGStream);
 // nacteme obrazek z datoveho proudu
 Synchronize(Redraw);

Potom je nutné nastavit správně parametry obrázku jako autostretch a podobně... Při nevhodných kombinacích to mrká...
//CameraImage.Align := alClient; // zpusobuje mrkani



Každopádně souhlasím s tvrzením, že překreslovat TImage 25x za sekundu je sedlácké řešení. Já ho ale převzal funkční. Pokud bych to dělal od začátku pohlédl bych se po něčem s DirectX nebo openGL základem, nebo zkusit firemonkey TImage, tam by to mohlo být v základu lepší.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 291
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #17 kdy: 05-07-2012, 16:22:26 »
Díky všem za rady, nakonec jsem přeci jenom ustoupil od IdHTTP a přešel k Synapsi. Udělal jsem to přesně jak mi psal pepak - upravil jsem si HTTPSend.ReadUnknown().

frankee : pořád jsem nepochopil, co je na použití TImage "sedláckého"? Přichází mi prům. kolem 28 snímků za sekundu v rozlišení 640x480 a zobrazování je bez problému, dokonce mě překvapilo, že to i bez DoubleBuffered nebliká...
nil

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 291
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #18 kdy: 09-07-2012, 12:17:42 »
Měl bych jeden dotaz : ve W7 mi komunikace s kamerou přes HTTPSend funguje perfektně, ale pod XP (mám bohužel jen virtualizované) mi zatuhává volání .Method('GET',sURL); při zadání neexistující IP adresy. Vystopoval jsem to až k SockCheck(synsock.Connect(FSocket,Sin)); ale dál nemůžu, protože k synsock.dcu už zdrojáky nemám. Zdá se, že je tam 20 sekund timeout, bez ohledu na to, co nastavím do property TimeOut objektu HTTPSend. Dá se říci, že se nedá nastavit timeout pod 20s :( Nemáte někdo tucha, co s tím? Nejlépe Lukáš Gebauer, pokud se tu vyskytuje  ;)
nil

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2666
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #19 kdy: 09-07-2012, 12:21:43 »
synsock.pas je ve zdrojacich synapse - http://synapse.ararat.cz/doku.php/download
Embarcadero MVP - Czech republic

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 291
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #20 kdy: 09-07-2012, 12:26:25 »
Díky, dobrý člověče, hned na to letím.

Edit : tak bohužel nic, to bohužel není zdrojový kód té unity :(
Edit2 : jsem blbej, je to v těch includech...
Edit3 : no sláva, tak jsem alespoň schopen to svižně ukončit pomocí HTTPSend.FSock.AbortSocket;, takže už mi to alespoň neblokuje zavření formuláře.
« Poslední změna: 09-07-2012, 12:49:25 od Morrison »
nil