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

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 291
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Zdravím vespolek!
Potřebuji ve své aplikaci přijímat video z IP kamery. O video si požádám zaslaním GET požadavku kameře, ale problém je v tom, že to "video" je vlastně nekonečný sled JPeGů. A já nevím, jak se vypořádat s tou "nekonečností"... Když použiju IdHTTP z Indy, tak neustále roste velikost přijaté odpovědi - a s tím samozřejmě i spotřeba paměti celé mé aplikace. Opravdu netuším, jak by to dopadlo třeba po několika  dnech nepřetržitého stahování z kamery, což je u mě reálná situace. Potřeboval bych spíš jen nějaký "průtokový" :) buffer s omezenou velikostí. Nebylo by řešením mého problému třeba napsat si vlastního potomka TStream a stahovat to do něj (protože IdHTTP má i verzi procedury Get() s parametrem TStream)?
« Poslední změna: 27-06-2012, 14:01:43 od Morrison »
nil

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ěď #1 kdy: 27-06-2012, 18:34:22 »
zkus použít VLC player a jeho activex rozhraní .. nevýhoda je, že je potřeba na počítač nainstalovat VLC player.

info zde: http://wiki.videolan.org/ActiveX/Delphi

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1498
  • Karma: 37
    • Pepak.net
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #2 kdy: 27-06-2012, 18:54:35 »
Zdravím vespolek!
Potřebuji ve své aplikaci přijímat video z IP kamery. O video si požádám zaslaním GET požadavku kameře, ale problém je v tom, že to "video" je vlastně nekonečný sled JPeGů. A já nevím, jak se vypořádat s tou "nekonečností"... Když použiju IdHTTP z Indy, tak neustále roste velikost přijaté odpovědi - a s tím samozřejmě i spotřeba paměti celé mé aplikace. Opravdu netuším, jak by to dopadlo třeba po několika  dnech nepřetržitého stahování z kamery, což je u mě reálná situace. Potřeboval bych spíš jen nějaký "průtokový" :) buffer s omezenou velikostí. Nebylo by řešením mého problému třeba napsat si vlastního potomka TStream a stahovat to do něj (protože IdHTTP má i verzi procedury Get() s parametrem TStream)?
Bylo by to řešením, ale otázka je, jestli opravdu funkčním. Spíš bych řekl, že ne (že IdHTTP stejně bude někde interně předpokládat, že je request konečný, načte si to do nějaké své mezipaměti a pak to přesune do streamu).

Kdybych měl něco takového psát, tak vezmu Synapsi (konkrétně httpsend.THttpSend) a upravím httpsend.THTTPSend.ReadUnknown, httpsend.THTTPSend.ReadIdentity nebo httpsend.THTTPSend.ReadChunked (musíš ověřit, tipnul bych si, že v tvém případě to první) tak, aby to místo zápisu do streamu zavolalo nějakou tvoji událost s daty.

Offline mirus

  • Mladík
  • **
  • Příspěvků: 62
  • Karma: 12
    • Verze Delphi: Delphi 10.2
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #3 kdy: 27-06-2012, 20:58:58 »
Zdar,
pro inspiraci muzes juknout na http://code.blitzaffe.com/pages/delphi/files/mjpeg_decoder_58-41 je tam MJPEGDecoder. Tohle prijima MJPEG stream ve vlakne jako a zpracovava pomoci TMessage. Pri ctyrech IP kamerach aplikace skoro zamrzne diky tomuto reseni. Asi by to chtelo resit ten buffer trosku jinak.

Offline frankee

  • Příspěvků: 16
  • Karma: 3
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #4 kdy: 28-06-2012, 07:17:16 »
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

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1145
  • Karma: 43
    • Verze Delphi: 7, 2010
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #5 kdy: 28-06-2012, 08:24:10 »
Indy dokazi pracovat s jakymkoliv streamem,
delal jsem si vlastniho potomka streamu, ktery bere jen cast souboru pri posilani, a bez problemu

melo by to jit i pro stahovani - stahujes stahujes a pri dosazeni urcite velikosti treba vycistis MemoryStream ;)
(otazka 2 radku)

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ěď #6 kdy: 28-06-2012, 09:14:12 »
Moc všem děkuji za Vaše příspěvky, nečekal jsem, že toho přijde tolik.
Stáhl jsem pro úplnost i tu Synapsi a od rána se v tom hrabu a ohmatávám cestičku svého poznání ;)
Zkusím nejdřív asi Indy+custom Stream, to by pro mě mohlo být v tuhle chvíli asi nejjednodušší (Synapse je pro mě zcela nová). Dám pak vědět, jak jsem dopadl.

SaLiK : bohužel jak instalace přehrávače, tak i forma ActiveX komponenty mi moc nevyhovují, ale přesto díky!
frankee : díky za nabídku, ale je to pro mě tak trochu "výzva" to rozchodit, takže to zatím zkusím sám...možná ale, že budu nakonec ještě "prstíčkem hrabat" jestli bys mi to neposlal :D
<z> : tohle se mi zdá nejnadějnější, ale trochu se bojím toho, že IdHTTP má ve svojí .Response svůj interní .ContentStream ... No ale doufám, že když je zadán externí stream, tento vnitřní se nepoužije.
nil

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1145
  • Karma: 43
    • Verze Delphi: 7, 2010
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #7 kdy: 28-06-2012, 12:55:06 »
nepouzije, pro stahovani jsem si delal taky svuj stream,
kdyz jsem to potreboval upravit (kombinaci TMemoryStream a TFileStream) a bez problemu ;)

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ěď #8 kdy: 28-06-2012, 19:12:50 »
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

zajimalo by mě: čím si pak stream zobrazoval? jakou komponenout? .. jestli to můžeš povědět  ;) .. díky

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1145
  • Karma: 43
    • Verze Delphi: 7, 2010
Re:Čím přijmout video-stream z IP kamery? (nekonečný HTTP GET)
« Odpověď #9 kdy: 28-06-2012, 21:53:34 »
vetsinou se obrazek nacita do TImage ;)

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ěď #10 kdy: 28-06-2012, 22:10:06 »
to jo :) .. ale jak "udělat" video .. načítání jpegů do TImage 25x za sekundu asi nebude moc vhodné řešení

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ěď #11 kdy: 28-06-2012, 22:38:17 »
SaLiK : proč myslíš, že TImage obnovování 25x za sekundu nezvládne? Btw to se spíš obávám o "průtočnost na hlavní", pardon na síti - když počítám jeden obrázek 640x480 kolem 50kB, tak by 25fps docela slušně ukouslo z průchodnosti (100Mb síť je bohužel ještě leckde standard).
nil

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ěď #12 kdy: 28-06-2012, 23:02:56 »
TImage to určitě zvládne .. tak bych to např. udělal já .. ale připadá mi to jako "sedlácké" řešení a proto by mě zajímalo, jak se to má správně dělat  ;)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2657
  • Karma: 103
    • 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ěď #13 kdy: 28-06-2012, 23:45:45 »
Tohle znáš? http://graphics32.org/wiki/Main/Graphics32

Hodně lidí to používá pro práci s grafikou:
* Flexible supersampling implementation for maximum sampling quality;
* Flicker-free image displaying components with optimized double buffering via advanced MicroTiles based repaint optimizer;
Embarcadero MVP - Czech republic

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ěď #14 kdy: 29-06-2012, 00:16:23 »
omrknu to .. díky za tip

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ů: 2657
  • Karma: 103
    • 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