Webcam Bilder per Tcp senden
Übersicht BlitzBasic Blitz3D
mactepBetreff: Webcam Bilder per Tcp senden |
Mi, Jun 23, 2010 0:31 Antworten mit Zitat |
|
---|---|---|
Hallo,
ich hab hier ein Code (Von Panno) um mit Blitz3D eine Webcam anzusprechen. Meine frage nun : Ist es ein gr. Aufwand die Übertragung der Webcam per Tcpserver zu senden ? oder gibts evtl. schon n guten Code dafür ? Freune mich auf Antworten Code: [AUSKLAPPEN] Graphics3D 800,600,32,3
Global timer,fpscount,fpstemp,fps,x,y Global driverimagew Global driverimageh Global driverdepth inbank= CreateBank(200) ; <- a little more byts as you need ! For the future (sound /avi...) outbank= CreateBank (10) CallDLL("METHYL","INIT") ; dialog driver capwindowx = 1; 1 use capwindowy = 1; 1 this capwindoww = 1; 1 to capwindowh =1 ; 1 make a small previewwindow at 1,1 with 1*1 pixels (invisible ;) ) previewrate = 90 ; play here to get better fps from driver PokeInt inbank,0, capwindowx PokeInt inbank,4, capwindowy PokeInt inbank,8, capwindoww PokeInt inbank,12, capwindowh PokeInt inbank,16, previewrate PokeInt inbank ,24,FakeBank+4 CallDLL("METHYL","SETDATA",inbank,outbank) ; CallDLL ("METHYL","START") CallDLL("METHYL","SETFORMAT") ; call videoformat CallDLL ("METHYL","SETSOURCE") ;call videosource CallDLL ("METHYL","SETPREVIEWON") CallDLL ("METHYL","SETPREVIEWOFF") img=CreateImage(1,1) ;<- fakeimage To get the driversettings buffer1 =CreateBank((ImageWidth (img)*ImageHeight (img)*4)) ok = CallDLL ("METHYL","GETCLIP",inbank,buffer1) driverimagew = PeekInt ( inbank,0) driverimageh = PeekInt (inbank,4 ) driverdepth = PeekInt (inbank,8) FreeImage img FreeBank buffer1 img=CreateImage(driverimagew,driverimageh) Global buffer =CreateBank((ImageWidth (img)*ImageHeight (img)*4)) Global showbuffer =CreateBank(driverimagew*driverimageh*4) ok = CallDLL ("METHYL","GETCLIP",inbank,buffer) timer=MilliSecs() ok = CallDLL ("METHYL","CONTFRAME") ;<- start capturing While Not KeyHit(1) m= MilliSecs() SetBuffer ImageBuffer(img) LockBuffer ImageBuffer(img) pointer =0 ok = CallDLL ("METHYL","STOPPFRAME") ; <- stopp preview ! For y = 0 To ImageHeight (img)-1 For x = 0 To ImageWidth (img)-1 rgb = PeekInt (buffer,pointer) WritePixelFast(x,y,rgb) pointer =pointer + 4 Next Next mi = MilliSecs()-m UnlockBuffer ImageBuffer(img) ok = CallDLL ("METHYL","CONTFRAME") ; continue capturing SetBuffer BackBuffer() MaskImage img,255,255,255 ; <- use your own color DrawImage img,1,1 Text 10,10, mi ; the time for readfrombank to image fpscount=fpscount+1 If MilliSecs()<timer+1000 Else fps=fpscount-fpstemp fpstemp=fpscount timer=MilliSecs() EndIf Text 80,10,"FPS "+fps Flip(0) Cls If MouseHit(1) Then CallDLL ("METHYL","SETPREVIEWON") ; If MouseHit(2) Then CallDLL ("METHYL","SETPREVIEWOFF") ; use this to get full blitzperformance without capture Wend ok = CallDLL("METHYL","ENDCAP") ; <- Stop capture unload dll End |
||
ToeB |
Mi, Jun 23, 2010 9:42 Antworten mit Zitat |
|
---|---|---|
Alsowebcam bilder mit TCP zu übertragen dauert zu lange, da haste nix von. Machs mit UDP.
Dort packst du die Bilddaten (Pixel) in Blöcke (z.B. von Pixel 1 - 134, 135 - 200, je nach dem ) und versendest die über UDP. Das ist schneller, und wenn ein block mal nicht ankommt ist es ja nicht schlimm, dann sind dort halt mal Pixelfehler aber die werden im nächsten framedurchlauf wieder korrigiert. mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
BadDeath |
Mi, Jun 23, 2010 15:52 Antworten mit Zitat |
|
---|---|---|
Das wird aber auch so ziemlich langsam sein, da du so die Bilder ja quasi als BMP sendest, also unkomprimiert. Ich würde das Bild ein einer Bank mit einer Lib (gabs/gibts hier irgendwo) klein machen, per UDP verschicken, und beim Client wieder so umwandeln, dass es Blitz zeichnen kann, vllts gehts auch direkt, musste mal probieren. | ||
-~= real coders just code in binary =~- |
ToeB |
Mi, Jun 23, 2010 17:21 Antworten mit Zitat |
|
---|---|---|
Naja, deshalb sag ich ja in Blöcke packen, das ist am schnellsten.
Nicht die bitmap byte für byte senden, das ist in der tat sehr langsam, sondern viele bytes in einen Block packen und in einer nachricht abschicken , so in etwa : Code: [AUSKLAPPEN] WriteByte( pixel_color[1] )
... writebyte (pixel_color[100] ) sendUDPMsg writebyte( pixel_color[101] ) ... writebyte( pixel_color[200] ) sendUDPMsg Sollte relativ schnell gehen. Da ich sowas ähnliches grade in meiner SimpleUDP verwende kann ich die sagen das es sehr schnell ist. Und das obwohl bei mir immer auf eine Antwort gewartet wird vom empfänger, dadurch wird es bei mir langsamer, aber bei der methode hier sollte es doppelt so schnell sein wie bei mir. Was langsam ist, die Pixel des Bildes / der Webcam auszulesen. mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Eingeproggt |
Mi, Jun 23, 2010 17:26 Antworten mit Zitat |
|
---|---|---|
Mal angenommen, die Webcam hätte 300*240 Pixel.
Das macht 72000 Pixel - je 3 Byte (Alpha lassen wir mal weg) ergibt 216kb. Diese Datenmenge zu versenden geht (über eine derzeit durchschnittliche oder gar gute) Internetverbindung auf jeden Fall langsamer als ein 320*240 Pixel großes Bild auszulesen. Naürlich hilft das "Packen" in Nachrichtenblöcke etwas, aber 216kb Rohdaten bleiben dir trotzdem die mindestens gesendet werden müssen (UDP-Header nicht gerechnet). Komprimieren wird ziemlich unumgänglich sein wenn es auch nur annähernd Echtzeit werden soll. mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
ToeB |
Mi, Jun 23, 2010 17:38 Antworten mit Zitat |
|
---|---|---|
Da muss ich dir wieder sprechen : In meiner SimpleUDP habe ich eine 500 kb große Datei versendet, die außerdem noch sicher gesendet wurde, habe diese in > 8000 Byte Packete gefasst und es hat ca. 100 ms gedauert.
Bei einem 400*300 bild (120000 Pixel) währen das (wie du gesagt hast) 360000 Bytes. Die in 8000er packete, das währen 45 sende-vorgänge. Angenommen man nimmt Flip 0 ohne Timer, dann muss man von einer Schleifenzeit von ~ 5ms ausgehen (ist ein wenig mehr als ich hab), das währen dann 45*5 = 225ms. Trotzdem Geb ich dir recht, für echtzeit nicht mehr zu gebrauchen. Man müsste einen Algorhytmus haben, der die Bilddaten komprimiert und somit nicht wie in einer Bitmap width*height*3 Bytes gesendet werden müssen sonder z.B. nur width*height / 3. Gibts bestimmt, villeicht guckt man mal im Englischen Forum. mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Eingeproggt |
Mi, Jun 23, 2010 17:58 Antworten mit Zitat |
|
---|---|---|
Dass du das geschafft hast glaub ich dir nur bedingt... 500kb in 100ms entspricht einer Verbindungsgeschwindigketi von 5MB/s - in der Notation der Internetanbieter: 40Mbit/s
Das erreicht man im LAN, aber im Internet nicht - außer du lebst in Japan oder ich weiß ja nicht... Ich hab hier 3.6Mbit laut Anbieter, 1MBit real... also ich spiel da auf nem anderen level und ich würde sagen man soll eher den wenn nicht noch einen niedrigeren Level annehmen wenn man Daten übers Internet schickt. Ich habe übrigens auf Wikipedia nachgelesen, den IP- und UDP-Header kann man da eher vernachlässigen (insgesamt 20Byte pro Paket, bei 8kb Paketgröße irrelevant). mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
RoLo |
Do, Apr 21, 2011 14:38 Antworten mit Zitat |
|
---|---|---|
Ich weiss das dieses Thema schon einbisschen älter ist, aber ich frag jetzt trotzdem nochmal. (Bitte nicht böse sein)
Ich suche schon seit einigen Tagen hier im Forum nach antworten. Ich will mit der Webcam ein Bild machen und dieses dann über das Netzwerk senden. Aber ich habe keine Ahnung wie ich das genau machen soll... Hat jemand grad einen Beispiel-Code zur Hand? Und wo gibt es die DLLs? Ich habe die DLL "pbca3d2.dll" schon irgendwo im Internet gefunden, aber ich kann damit nichts anfangen. Die DLL "METHYL.dll"(oder wie die heisst), da kommt am Anfang aber immer so eine Meldung. Das will ich nicht. Ich will, dass es die Webcam automatisch auswählt. Ich weiss auch zu dieser Frage gibt es ein Thema. Aber es gibt im Forum x-tausend-Beiträge zu dem Thema Webcam. Und ich habe jetzt (fast) alles durchgeschaut und immer nur so halbe Antworten gefunden, darum wäre ich froh wenn ich eine gute Antwort bekomme. Das habe ich schon alles ausprobiert(also ich bin nicht so ein fauler Sack wo wegen jedem kleinen Problem einen Beitrag verfasst)... Vielen Dank im voraus... |
||
Übersicht BlitzBasic Blitz3D
Powered by phpBB © 2001 - 2006, phpBB Group