Netzwerkkamera MJPEG stream in Programm einbinden
-
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
-
Ich habe hier im Board ein ähnliches Problem gefunden,
http://www.c-plusplus.net/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
-
Hi
Von AXIS gibts doch ein MediaControlSDK.
Wenn du das installierst, kannst du entweder die migelieferte ActiveX-Componente benutzen, oder DShow.
Für DShow wird auch ein Eingangsfilter zur verfügung gestellt.
Mfg Reinhold Fischer
-
Danke, für den guten Typ. Mit der SDK ist es wirklich relativ einfach.
Gruss Isch Gucke