2016-05-26 12 views
0

Ich habe einige Probleme mit dem RTSP-Client von Gstreamer. Also habe ich ein Client-Programm und ich möchte, dass es mir von einer Überwachungsfunktion korrekte Antworten gibt, wenn der RTSP-Client eine Nachricht empfängt/sendet oder einen Fehler etc. zurückgibt und den Code bei einem Fehler entsprechend beendet. Also, was ich tue das ist,Gstreamer RTSP Client Timeout Probleme

  1. Ich einfach einen RTSP-Server mit VLC auf meinem Rechner erstellen und ich eine Verbindung zu diesem Server. Ich kann die Verbindung scheinbar erfolgreich erstellen.
  2. Ich stoppe den Server, indem ich einfach den VLC schließe. Nun sollte die Watchdog-Funktion einen korrekten Fehlercode erhalten und auf den Bildschirm drucken. Aber das macht es nie. In der RTSP-Dokumentation von Gstreamer gibt es eine Funktion namens gst_rtsp_connection_connect, die einen Verbindungs- und einen Zeitüberschreitungswert annimmt und in der Dokumentation heißt es, dass, wenn das Zeitlimit NULL ist, diese Funktion für immer blockieren kann. Also tue ich, da ich NULL in das Timeout-Feld gesetzt habe, nie eine Zeitüberschreitung und glaube, dass es immer noch mit dem Server verbunden ist und somit nie in irgendeine der Watch-Dog-Funktionen gelangt. Aber wenn ich mich beworben habe, sagen wir eine 5-Sekunden-Zeitüberschreitung, dann tötet es die Verbindung direkt nach 5-7 Sekunden und gelangt in einige der Überwachungsfunktionen. Ich möchte nicht, dass mein Code sofort einen Fehler gibt, obwohl eine ordnungsgemäße Verbindung besteht und der Server noch funktioniert. Ich möchte nur, dass einige Fehler auftreten, wenn der Server tatsächlich heruntergefahren ist und eine Zeitüberschreitung aufgetreten ist. Wie kann ich das beheben?

Hier ist meine komplette Code enthält und Bibliotheken sind am Anfang des Codes:

/* 
* INCLUDES 
* /usr/include/gstreamer-1.0 
* /usr/include/glib-2.0 
* /usr/lib/x86_64-linux-gnu/glib-2.0/include 
* /usr/include/gstreamer-1.0/gst/rtsp 
* 
* LIBRARIES 
* gstreamer-1.0 
* gstrtsp-1.0 
* gobject-2.0 
* glib-2.0 
* 
* MISC. 
* -std=c99 
* 
* 
* 
* */ 

#include <gst/gst.h> 
#include <gst/rtsp-server/rtsp-server.h> 
#include <gst/rtsp/gstrtspmessage.h> 
#include <gst/rtsp/gstrtspurl.h> 
#include <gst/rtsp/gstrtspdefs.h> 
#include <gst/rtsp/gstrtsptransport.h> 
#include <gst/rtsp/gstrtspconnection.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <glib.h> 

static GstRTSPStatusCode 
tunnel_start (GstRTSPWatch * watch, gpointer user_data) 
{ 
    g_print("tunnel_start\n"); 
    return GST_RTSP_STS_OK; 
} 

static GstRTSPResult 
tunnel_complete (GstRTSPWatch * watch, gpointer user_data) 
{ 
    g_print("tunnel_complete\n"); 
    return GST_RTSP_OK; 
} 

static GstRTSPResult 
tunnel_lost (GstRTSPWatch * watch, gpointer user_data) 
{ 
    g_print("tunnel_lost\n"); 
    return GST_RTSP_OK; 
} 

static GstRTSPResult 
closed (GstRTSPWatch * watch, gpointer user_data) 
{ 
    g_print("closed\n"); 
    return GST_RTSP_OK; 
} 

static GstRTSPResult 
message_sent (GstRTSPWatch * watch, guint id, gpointer user_data) 
{ 
    g_print("message_sent\n"); 
    return GST_RTSP_OK; 
} 

static GstRTSPResult 
message_received (GstRTSPWatch *watch, GstRTSPMessage *message, gpointer user_data) { 
    g_print("message_received\n"); 
    return GST_RTSP_OK; 
} 

static GstRTSPResult 
error (GstRTSPWatch *watch, GstRTSPResult result, gpointer user_data) { 
    g_print("error\n"); 
    return GST_RTSP_OK; 
} 

static GstRTSPResult 
error_full (GstRTSPWatch *watch, GstRTSPResult result, GstRTSPMessage *message, guint id, gpointer user_data) { 
    g_print("error_full\n"); 
    return GST_RTSP_OK; 
} 

static GstRTSPWatchFuncs watch_funcs = { 
    message_received, 
    message_sent, 
    closed, 
    error, 
    tunnel_start, 
    tunnel_complete, 
    error_full, 
    tunnel_lost 
}; 





/* main method */ 
int main (int argc, char *argv[]) { 
    GMainLoop *loop; 
    loop = g_main_loop_new (NULL, FALSE); 

    GstRTSPUrl *url = NULL; 
    GstRTSPConnection *conn = NULL; 
    GstRTSPResult res; 
    GstRTSPWatch *watch; 
    GTimeVal *timeout; 
    timeout->tv_sec = 5; 
    timeout->tv_usec = 5000000; 

    res = gst_rtsp_url_parse ("rtsp://localhost:5000/test", &url); 
    res = gst_rtsp_connection_create (url, &conn); 
    if (res == GST_RTSP_OK) { 
     g_print("Connection created.\n"); 
    } 


    res = gst_rtsp_connection_connect (conn, timeout); 
    if (res == GST_RTSP_OK) { 
     g_print("Connection connected.\n"); 
    } else { 
     g_printerr("Connection not connected. Exiting with code 500.\n"); 
     exit(500); 
    } 



    watch = gst_rtsp_watch_new (conn, &watch_funcs, loop, NULL); 
    if (watch == NULL) { 
     g_print("Failed to create watch.\n"); 
    } 


    gst_rtsp_watch_attach (watch, NULL); 
    gst_rtsp_url_free (url); 

    g_main_loop_run (loop); 

    return 0; 
} 

Antwort

1

Dieser Code wie vorgesehen funktioniert. Ich machte falsche Arten von Tests.

Die Art, wie ich den Rtsp-Server "gestoppt" habe, war nur die "Stop" -Taste von VLC zu drücken. Dies zerstört nicht den Server, der Server ist immer noch da, macht einfach keinen Stream und der Client ist immer noch ohne Probleme mit dem Server verbunden, weil der Server noch existiert. Wenn ich stattdessen den VLC schließe, um den Server zu zerstören, gelangt er in die richtige Watchdog-Funktion.