2016-10-15 1 views
2

Ich bin derzeit mit einem Problem mit Live555 konfrontiert.Live555 - Korrekter Client Shutdown mit watchVariable

Ich schrieb eine Windows-DLL für mein Projekt, diese DLL offenbaren eine sehr einfache API, um einen RTSP-Client mit Leichtigkeit zu starten. Ein Unity-Programm lädt die DLL und verwendet dann die API, um die Frames zu empfangen.

die beiden Hauptfunktionen ausgesetzt sind:

bool startRTSP(bool isTCP); 
bool stopRTSP(); 

Aufgrund der Natur der Bibliothek LIVE555 zu, ich kann das RTSP in der Einheit Thread nicht gestartet werden. Also habe ich einen neuen Thread erstellt, wenn startRTSP aufgerufen wird, und bei einigen Callbacks werden die Frames an die Einheit gesendet.

Um jedoch den RTSP von einem externen Thread (der Einheits-Thread stopRTSP aufrufen) zu stoppen, verwende ich die EventLoopWatchVariable. Zum Beispiel ist dies, wie die RTSP Ereignisschleife gestartet wird:

env->taskScheduler().doEventLoop(&eventLoopWatchVariable); 

Wenn die Stopp-Funktion aufgerufen wird, wird die eventLoopWatchVariable auf 1 gesetzt, aus der Einheit Faden. Event-Schleife beenden.

Gleich nach diesem Ausgang Ereignisschleife der Bereinigungsfunktionen werden genannt:

delete scheduler; 
env->reclaim(); 

I thoose Funktion erwarten das RTSP-Client zu gehen und schließt sie ab. (Senden der TEARDOWN-Befehl an den Server zum Beispiel)

Aber sie tun dies eindeutig nicht, und die Clients werden nie zerstört!

Ich vermute, dass es zu einem Reconexion-Problem im selben Stream führt. (Der SETUP-, DESCRIBE- und PLAY-Befehl wird gesendet und die Antworten werden empfangen, aber keine Daten kommen.) Unter Verwendung von VLC oder mplayer kann ich sehen, dass der Server immer noch streamt, so dass dies kein Serverproblem ist.

Wie kann ich live555 fragen, den RTSPClient und ihre Subsessions zu schließen, wenn die eventLoopWatchVariable auf 1 gesetzt ist?

Ich kann den Befehl TEARDOWN nicht an den Server senden, wenn der EventLoop nicht mehr ausgeführt wird. So bin ich jetzt ein wenig verloren über den besten Weg, es zu tun.

Wenn jemand eine Idee dazu hat, würde ich es gerne hören!

Vielen Dank im Voraus.

Antwort

0

Ich kann den Befehl TEARDOWN nicht an den Server senden, wenn der EventLoop nicht mehr ausgeführt wird.

Dies ist ungenau, die Hauptschleife wird benötigt, um Nachrichten zu empfangen, die keine Nachrichten senden.

Um richtig den RTSP-Client-Verbindung nach dem mainloop zu schließen und vor der Umwelt Freigabe, könnten Sie wie folgt vorgehen:

// wait for stop event 
env->taskScheduler().doEventLoop(&eventLoopWatchVariable); 

// send tear TEARDOWN 
client->sendTeardownCommand(session, NULL); 

// close subsession & session 
Medium::close(session); 

// close RTSP client 
Medium::close(client); 

// free environment & scheduler 
env->reclaim(); 
delete scheduler; 

Sie auch für TEARDOWN Antwort warten, einen Rückruf zu sendTeardownCommand und Laufen geben wieder doEventLoop.