PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Netzwerkkamera MJPEG stream in Programm einbinden C++



Isch Gucke
15.08.2006, 10:39
Hallo zusammen

Ich habe ein Problem, mit dem ich nun schon seit mehreren Tagen am kämpfen bin. Ich habe eine IPKamera von Axis, diese liefert mir einen MJPEG (Motion JPEG) stream. Meine Frage ist nun wie kann ich diesen Stream nun in mein Programm einbinden?

Ich habe viel gefunden über vfw und die Funktion capCreateCaptureWindow. Aber so wie ich das sehe ist die für lokal installierte Kameras. Zumindes alle Beispiele die ich gefunden habe waren für USBCams.

Habe mir auch mal im schnell durchlauf die Winsockets reingezogen, ich denke die Benötige ich sicher. Hoffe ihr könnt mir helfen ich bin am Verzweifeln ;-)


Gruss Isch Gucke

Isch Gucke
29.08.2006, 11:17
Ich habe in einem anderen Board ein ähnliches Problem gefunden,

http://www.c-plusplus.de/forum/viewtopic-var-t-is-151565-and-highlight-is-mjpeg.html

mit dem Beispielcode zum empfangen des Streams, habe ich nun mal das gleiche Windows tauglich nachprogrammiert. Ich bekomme nun einen Bilderstream, aber wie kann ich den ausgeben? Es kommen ja keine Kompletten Bilder, mit Header. Sonder nur ein Stream. Kann mir jemand auf die Sprünge helfen? Hier noch der Code, zum empfangen des Streams.


#include <stdlib.h>
#include <windows.h>
#include <winsock.h>
#include <stdio.h>

#define IPADDR "192.168.1.45"
#define PORTNUMBER 80
#define URLPATH "/mjpg/video.mjpg"
#define USERPASS "user:passwort"

#define REQUEST_AUTH "GET %s HTTP/1.0\r\nAuthorization: Basic %s\r\n\r\n"
#define REQUEST "GET %s HTTP/1.0\r\n\r\n"

void base64_encode(const char *s, char *store, int length) {
static char tbl[64] = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '+', '/'
};

int i;
unsigned char *p = (unsigned char *) store;

for(i=0;i<length;i += 3) {
*p++ = tbl[s[0]>>2];
*p++ = tbl[((s[0] & 3) << 4) + (s[1] >>4)];
*p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
*p++ = tbl[s[2] & 0x3f];
s += 3;
}
if(i == length +1)
{ *(p-1) = '=';}
else
{ *(p-1) = *(p-2) = '='; }
*p = '\0';
}

int main()
{
SOCKET sSocket;
SOCKADDR_IN sAddr;
int i;
int result;
char *dummy;
char buffer[65536];
char *request;

if(strlen(USERPASS)){
char *userpass = (char *)malloc(strlen(USERPASS) + 4);
char *userp = (char *)malloc(strlen(USERPASS)+4);
memset(userpass,0,strlen(USERPASS)+4);
memset(userp,0,strlen(USERPASS)+4);
strcpy(userpass,USERPASS);
strcpy(userp,USERPASS);
base64_encode(userpass,userp,strlen(USERPASS));
request = (char *)malloc(strlen(REQUEST_AUTH) + strlen(URLPATH) + strlen(userp) +1);
sprintf(request, REQUEST_AUTH, URLPATH, userp);
free(userpass);
free(userp);
printf("%s",request);
}
else {
request = (char *) malloc(strlen(REQUEST) + strlen(URLPATH) + 1);
sprintf(request, REQUEST);
}

/*Netzwerk initialisieren*/
WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA wdData;

WSAStartup(wVersionRequested, &wdData);

sSocket = socket(AF_INET, SOCK_STREAM, 0);
if(sSocket == INVALID_SOCKET)
{
MessageBox(0,"Konicht initialisieren", "Fehler", MB_ICONEXCLAMATION == IDOK);
return 256;
}

/*Socket eigenschaften festlegen */
sAddr.sin_family = PF_INET;
sAddr.sin_addr.s_addr = inet_addr( IPADDR );
sAddr.sin_port = htons( PORTNUMBER );

if(connect(sSocket, (SOCKADDR*) &sAddr, sizeof(sAddr)) == SOCKET_ERROR) {

MessageBox(0,"Konnte nicht verbinden", "Fehler", MB_ICONEXCLAMATION == IDOK);
return 255;
}
send(sSocket, request, strlen(request),0);
free(request);

while(true){
dummy = buffer;
int n = recv(sSocket,(char *) &buffer, sizeof(buffer),0);
if (n == -1){
MessageBox(0,"Stream nicht empfangen", "Fehler", MB_ICONEXCLAMATION == IDOK);
return 255;
}
if(n == 0)
{
MessageBox(0,"Hö??", "Fehler", MB_ICONEXCLAMATION == IDOK);
break;}
MessageBox(0,(const char*)&buffer, "Fehler", MB_ICONEXCLAMATION == IDOK);
free(&buffer);
i += n;

}




return 1;
}


den Bilderstream gebe ich zur Zeit als Text aus, so konnte ich immerhin sehen, dass ich was empfangen habe. Ich hoffe jemand kann helfen.
Gruss Isch Gucke

NumberFive
24.10.2006, 07:35
Libavcodec dll gibt es als dll oder so file und solte dir das decodieren ab nehmen. Aber du hast es sicher schon gelöst oder ?

Isch Gucke
24.10.2006, 09:25
Ohh ja Sorry, habe ganz vergessen hier die Lösung preis zu geben...
Danke auch nochmals für deinen Tipp, wenn ich wieder mal Zeit habe probier ich das auch noch so aus.

Nun zur Lösung die ich gewählt habe, in einem andern Forum gab mir einer den Tipp, dass Axis eine SDK für ihre Kameras hat. Mit dieser ist es wirklich wirklich sehr sehr einfach ;-) kann ich nur empfehlen. (man ist dann halt windos abhängig...)

NumberFive
28.02.2007, 08:16
Habe jetzt ein lösung für Alle Cams die ein DirektX treiber mit bringen so wird auf ein Normeln Cam eine IP bzw. wan hat die Bilder im netz die an eine PC auf genommen werden.

Gruß

Isch Gucke
28.02.2007, 09:01
Hallo und wie funktioniert deine Lösung? kannst du das noch offenbaren? würd mich doch noch wundernehmen...

NumberFive
28.02.2007, 09:09
Es gibt einen Server der Stellt ein TCP port bereit an dem man sich die daten holen kann. Du schickst ein O und bekommst ein jpg zurück. es Gibt auf schon 2 Clients für den server einen DirecktX filter der wieder ein Stream draus macht. Und eine Client.exe die die Bilder anzeigt.

Die Bilder werden auf dem Vorschau Stream des DirektX Treiber's gezogen. Bei mir schaffe ich so bei 100 Mibt ca 20 FPS und bei Wlan ca 12 FPS.

Eine genauere Beschreibung muß ich eh noch machen kam aber noch nicht dazu Doku ist nicht so mein Stärke.

NumberFive
01.03.2007, 08:48
https://www.roboternetz.de/phpBB2/viewtopic.php?p=259542#259542

Dort kannst du lesen wie es wieter geht