Hallo Leute!
Ich habe folgende Situation. Es soll ein Streaming Szenario implementiert werden. Als Server verwende ich den LIVE555MediaServer (www.live555.com), als Client ein selbstgeschriebenes Programm in C. Der Client fordert beim Server ein Video an, der Server streamt das Video zu dem Client. Bis jetzt habe ich das so gemacht, dass ich im Client-Programm, also im C-Code den VLC aufgerufen habe, der eine Stream-Anforderung an den Server geschickt, eine VLC Media Player Instanz aufgemacht hat und den empfangenen Stream (Audio/Video) dort abgespielt hat. Der Nachteil an dieser Lösung ist, dass das gestreamte Video nicht auf den Client-PC erhalten bleibt. Nach dem Ende des Streamings kann ich mir das Video nicht einfach so nochmal anschauen. Wenn der Nutzer also das Video noch mal sehen will, muss wieder das Client-Programm gestartet werden, in dem der VLC aufgerufen wird, Videoanfrage an den Server verschickt und der Stream empfangen und ausgegeben wird.
Als nächsten Schritt möchte ich in meinem Client-Programm eine Änderung vornehmen, die dafür sorgt, dass die empfangenen Videopakete in eine separate Datei gespeichert werden. Da dies mit dem VLC-Code im Programm scheinbar nicht geht, habe ich mir eine Art Gateway gebastelt, das zwischen dem Server und dem Clientprogram angesiedelt ist. Weder Server noch Client sollen von diesem Gateway etwas merken. Also tut das Gateway für den Client so, als wäre es der Server und aus der Sicht des Servers ist das Gateway ein Client. Ergebnis ist, dass der Client und der Server nur mit dem Gateway kommunizieren. Gateway empfängt alle Nachrichten des Client und leitet sie an den Server weiter. Der Server antwortet darauf und das Gateway empfängt wiederum die Antworten und leitet sie an den Client weiter, wo die Nachrichten des Servers vom VLC verarbeitet werden. Zusätzlich speichert das Gateway die empfangenen Videopakete vom Server an den Client in eine Datei, bevor diese Pakete tatsächlich an den Client geschickt werden.
Und jetzt kommt mein eigentliches Problem. Das Gateway speichert zwar alle ankommenden Pakete in eine Datei, aber wenn ich dann diese Datei abspielen will, sehe ich nur Bruchstücke (siehe Bild im Anhang). Gleichzeitig kommen die gleichen Pakete in guter Form beim VLC an und werden als gutes Bild ausgegeben. So wie man es sich eigentlich vorstellt.
Beim Schreiben der Pakete in eine Datei muss ich irgendwas falsch machen. Interessant ist, dass der obere Teil des Bildes ganz ok ist, aber der untere Teil dann um so schlechter. Es sieht fast so aus, als würde dann ein bestimmtes Paket einfach kopiert werden, bis das Bild voll ist.
Hier sind die relevanten Codeabschnitte, wo die ankommenden Daten in eine Datei gespeichert werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #define MAXSTRING 1500 /*--------in der main()-Funktion----------------*/ char recvBytes[MAXSTRING]; int recvBytes; FILE *vid; char *filename = "video.mpg"; //printf("RTP1 Paket vom Server\n"); if((recvBytes = recvfrom(RTP1Sock, recvBuffer, MAXSTRING, 0, (struct sockaddr *)&FromAddr, &fromAddrLen)) < 0) { DieWithError("Failed to receive an RTP1 Paket"); } recvBuffer[recvBytes] = '\0'; fwrite(&recvBuffer, sizeof(char), recvBytes, vid); |
Hat jemand eine Idee, woran das liegen könnte? Ich freue mich über alle Anregungen, Hinweise, gefundenen Fehler usw. Ich suche schon seit einigen Tagen nur nach dieser Lösung. Es wäre super, wenn mir jemand weiterhelfen könnte.
Liebe Grüße
Anna