- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: Netzwerkkamera MJPEG stream in Programm einbinden C++

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.08.2006
    Beiträge
    5

    Netzwerkkamera MJPEG stream in Programm einbinden C++

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    15.08.2006
    Beiträge
    5
    Ich habe in einem anderen Board ein ähnliches Problem gefunden,

    http://www.c-plusplus.de/forum/viewt...-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.

    Code:
    #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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    50
    Beiträge
    1.562
    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 ?
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    15.08.2006
    Beiträge
    5
    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...)

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    50
    Beiträge
    1.562
    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ß
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    15.08.2006
    Beiträge
    5
    Hallo und wie funktioniert deine Lösung? kannst du das noch offenbaren? würd mich doch noch wundernehmen...

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    50
    Beiträge
    1.562
    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.
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    50
    Beiträge
    1.562
    https://www.roboternetz.de/phpBB2/vi...=259542#259542

    Dort kannst du lesen wie es wieter geht
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test