Hilfe bei Videoübertragung via winsock



  • Hallo!

    Ich habe eine bereits nach http://www.c-worker.ch/tuts.php einen Client und einen Server programmiert. Nun möchte ich von einer Webcam, die am Server angeschlossen ist das Video so bereitstellen dass der Client es sich anschauen kann. Ich habe nur leider keine Ahnung wie ich das bewerkstelligen kann.

    Wie kann ich überhaupt auf das Video meiner Cam zugreifen?

    Ich bin leider noch ein ziemlicher Anfänger in Programmierung, aber ich brauche das für ein Projekt auf meiner Fachhochschule.
    Entwicklungsumgebung ist Visual Studio C++ 2010 Express.

    hier mein server (die capture funktion bzw die driverconnect funktion is noch fehlerhaft 😞 )

    [cpp]
    #include <WinSock2.h>
    #include <Windows.h>
    #include <vfw.h>
    #include <winuser.h>
    #include <stdio.h>
    #include <conio.h>
    #include <iostream>
    using namespace std;
    
    #pragma comment(lib, "ws2_32.lib")
    #pragma comment(lib, "vfw32.lib")
    #pragma comment(lib, "user32.lib")
    #pragma comment(lib, "winmm.lib")
    
    //Prototypen
    
    int startWinsock(void);
    
    int main()
    {
    	long rc;
    	SOCKET acceptSocket;
    	SOCKET connectedSocket;
    	SOCKADDR_IN addr;
    
    	rc=startWinsock(); //Winsock starten
    	if(rc!=0)
    	{
    		cout << "Fehler: startWinsock\n",rc;
    		_getch();
    		return 1;
    	}
    	else
    	{
    		cout << "Winsock gestartet\n";
    		_getch();
    	}
    
    	acceptSocket=socket(AF_INET,SOCK_STREAM,0); //Socket erstellen
    	if(acceptSocket==INVALID_SOCKET)
    	{
    		cout << "Fehler: Socket konnte nicht erstellt werden\n",WSAGetLastError();
    		_getch();
    		return 1;
    	}
    	else
    	{
    		cout << "Socket erstellt\n";
    		_getch();
    	}
    
    	memset(&addr,0,sizeof(SOCKADDR_IN));
    	addr.sin_family=AF_INET;
    	addr.sin_port=htons(12345);
    	addr.sin_addr.s_addr=ADDR_ANY;
    
    	rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); //Portnummer zuweisen
    
    	if(rc==SOCKET_ERROR)
    	{
    		cout << "Fehler: bind\n",WSAGetLastError();
    		_getch();
    		return 1;
    	}
    	else
    	{
    		cout << "Socket an Port 12345 gebunden\n";
    		_getch();
    	}
    
    	rc=listen(acceptSocket,10);
    	if(rc==SOCKET_ERROR)
    	{
    		cout << "Fehler: listen\n";
    		_getch();
    		return 1;
    	}
    	else
    	{
    		cout << "acceptSocket ist im listenmodus......\n";
    		_getch();
    	}
    
    	connectedSocket=accept(acceptSocket,NULL,NULL); //Verbinden
    	if(connectedSocket==INVALID_SOCKET)
    	{
    		cout << "Fehler: accept\n";
    		_getch();
    		return 1;
    	}
    	else
    	{
    		cout << "Neue Verbindung wurde akzeptiert\n";
    	}
    
    	// Camera
    	HWND hwndParent=NULL;
    	//set a capture window
    	HWND hwndcap = capCreateCaptureWindow ("Capture Window", WS_CHILD | WS_VISIBLE,
    		  100, 100, 320, 240, hwndParent, 11011);
    
    	if(hwndcap)
    		capDriverConnect(hwndcap, 0); // 0 -> default driver
    	else
    	{
    		cout << "Error Camera is not connected\n";
    		_getch();
    		exit(1);
    	}
    
    	capPreviewRate(hwndcap, 66); //rate in milliseconds
    	capPreview(hwndcap, TRUE);
    	_getch();//starts preview
    
    	//preview
    	capPreview(hwndcap, FALSE);
    
    	return 0;
    	closesocket(acceptSocket);
    	WSACleanup();
    }
    
    int startWinsock(void)
    {
    	WSADATA wsa;
    	return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    [/cpp]
    


  • Das ist ne Menge Arbeit...

    Server holt das Bild von der Cam (Bsp. OpenCV Library), besorge mir den Image Speicher komprimiere und verschlüssle ihn. Danach Sende ich die Daten dem Client, der wiederum entschlüsselt - dekomprimiert und das Bild auf den Monitor Zaubert.
    Wobei ich natürlich nur den Bildspeicher übertrage der sich geändert hat.

    Wenn Du mal soweit bist kannst Du Dich mal über verlustbehaftete Kompressions - Algorithmen schlau machen.



  • Ich habe noch nie etwas mit OpenCV gemacht 😞

    ich habe jetz OpenCV2.1 geladen und laut http://opencv.willowgarage.com/wiki/VisualC%2B%2B_VS2010 die libs und alles eingestellt.

    ich habe nun versucht ein einfaches CaptureProgramm zu machen und bekomme jetz den fehler die highgui.dll nicht existiert 😞 sie befindet sich aber in dem \bin Ordner von OpenCV.



  • Dann hast Du in Deiner IDE doch nicht alles korekt konfiguriert.
    Aber kannst ja zum testen mal die dll in dein Project Ordner schieben...



  • Shya schrieb:

    Ich habe nun versucht ein einfaches CaptureProgramm zu machen und bekomme jetz den fehler
    die highgui.dll nicht existiert 😞 sie befindet sich aber in dem \bin Ordner von OpenCV.

    Die DLLs müssen im Verzeichnis der exe, im Projektordner oder wenn man sich keine Sogen machen
    möchte unter system32 liegen - je nachdem wie man das ganze startet.

    Eventuell wäre es aber besser eine statische lib zu erzeugen und diese fest in das Projekt zu linken.
    Die exe wird dadurch zwar grösser, aber dafür liegen die DLLs nicht mehr separat rum.

    Eine statische highgui.lib habe ich vor kurzem noch erzeugt.

    Die Microsoft-Lösung für Video Capture "Direct-Show" wäre noch eine Alternative
    zu OpenCV.



  • Habe jetzt die dlls in den Projektordner geschoben. Nun erhalte ich folgende Fehlermeldung:

    "Die Anwendung konnte nicht korrekt gestartet werden (0xc0150002)."

    OpenCV gefällt mir eigentlich ganz gut so vom lesen her. Möchte jetzt gerne dabei bleiben, denn ich seh hierbei viele viele (relativ) einfache Möglichkeiten das Video noch zu bearbeiten.



  • Die OpenCV libs sind wohl nicht für VS2010 kompiliert. Nachdem ich alles mit VS2010 neu
    kompiliert hatte gabs keine Probleme mehr.

    Deshalb auch mein Vorschlag das Zeug statisch zu linken ...

    siehe auch:
    http://www.c-plusplus.net/forum/288634-full


Anmelden zum Antworten