Gstreamer RTSP客户端超时问题

时间:2016-05-26 13:22:26

标签: c client gstreamer rtsp

我在Gstreamer的RTSP客户端遇到了一些问题。所以我有一个客户端程序,每当RTSP客户端接收/发送消息或返回错误等时,我都希望它从看门狗功能给出适当的响应,并在出现错误时相应地退出代码。我所做的就是这个,

  1. 我只是在我的机器上使用VLC创建一个RTSP服务器,然后连接到该服务器。我可以成功地创建连接。
  2. 我只需关闭VLC即可停止服务器。所以现在看门狗功能应该收到正确的错误代码并将其打印到屏幕上。但它永远不会那样做。在Gstreamer的RTSP文档中有一个名为gst_rtsp_connection_connect的函数,它接受连接和超时值,并且在文档中声明如果超时为NULL,则此函数可以永久阻塞。所以我虽然因为我在超时字段中放置了NULL,但它永远不会超时并且认为它仍然连接到服务器,因此永远不会进入任何看门狗功能。然而,当我申请时,比如5秒超时,然后它在5-7秒后直接杀死连接并进入一些看门狗功能。即使有正确的连接并且服务器仍在运行,我也不希望我的代码立即发出错误,我只是希望它在服务器实际关闭时出现一些错误,并且已经过了一些超时时间。我该如何解决这个问题?
  3. 这是我的完整代码,包含和库位于代码的顶部:

    /*
     * 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;
    }
    

1 个答案:

答案 0 :(得分:1)

此代码按预期工作。我做错了类型的测试。

我停止的方式&#34; rtsp服务器只是按下&#34;停止&#34; VLC按钮。这不会破坏服务器,服务器仍然存在,只是没有使任何类型的流和客户端仍然连接到服务器没有问题,因为服务器仍然存在。当我关闭VLC而不是销毁服务器时,它会进入正确的看门狗功能。