000
15.02.2012, 15:20 Uhr
~Flipp
Gast
|
Halli Hallo,
ich versuche gerade ein Programm zu schreiben mit welchem ich über RTSP den Stream steuern kann. Das ganze soll in etwa so funktionieren:
1. Die Applikation nimmt über RTSP die Kommunikation mit der Kamera auf ( also OPTIONS, DESCRIBE, SETUP und dann PLAY ).
2. Die Kamera fängt nach dem PLAY Kommando an aus einem internen Speicher die Daten über UDP ( um genau zu sein RTP ) zu Streamen ( für Testzwecke mal auf 2 Megabyte beschränkt )
3. Die Daten sollen von meiner Applikation NICHT gegen gelesen werden . Die Aufzeichnung der Daten obliegt einer externen Hardware welche auf dem Netzwerk einfach alles mitloggt ( das bitte nun einfach als gegeben hinnehmen ). Während der Übertragung hält meine Applikation den TCP Socket ( von der RTSP Übertragung ) offen ,da die Kamera sonst den Stream abbricht.
4. Nachdem die Kamera die Übertragung abgeschlossen hat wird der TCP Socket geschlossen und alle sind zufrieden.
So ganz einfach ist das leider dann doch nicht. Das Problem liegt darin zu wissen wann die Übertragung beendet ist. RTSP hat zwar das TEARDOWN Kommando, doch dieses wird vom Client ( also mir ) geschickt und nicht vom Server. Da ich, wie bereits erwähnt, die Daten auf dem UDP nicht lesen und parsen kann/will, weiß meine Applikation leider auch nicht wann sie den Socket schließen kann.
Eine Möglichkeit bietet dabei RTCP ( auch auf UDP basierend ), welches zyklisch parallel zu dem eigentlich Streaming Status Nachrichten sendet. Diese Nachrichten werden auf einem anderen Port als der eigentlich Stream gesendet, so dass es mir möglich ist zumindest diese Daten aufzuzeichen und auszuwerten. RTCP geht sogar soweit, dass ich am Ende der Übertragung ein Sender Report mit der Nachricht "Goodbye" erhalte und somit weiß dass alles abgeschlossen ist.
Nun will ich es aber ganz astrein haben und möchte einen eventuellen UDP Packet Loss berücksichtigen. Im schlimmsten Fall könnte mir also die "Goodbye" Nachricht flöten gehen und der TCP Socket wäre ewig offen. Die einzige Möglichkeit die ich da sehe ist jetzt einfach einen Timeout zu implementieren, welcher schaut ob nach ner gewissen Zeit keine Statusnachrichten über RTCP mehr kamen...aber so wirklich sauber finde ich das nicht.
Hat jemand vielleicht eine Idee wie ich hier eine korrekte Kommunikation aufbauen könnte die sich auch korrekt und zuverlässig wieder beendet?
Viele Grüße
Tobi |