首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gstreamer客户端超时问题

Gstreamer客户端超时问题
EN

Stack Overflow用户
提问于 2016-05-26 13:22:26
回答 1查看 1.9K关注 0票数 0

我有一些问题,Gstreamer的RTSP客户端。因此,我有一个客户端程序,我希望它在RTSP客户端接收/发送消息或返回错误等情况下,从监视狗函数中给我适当的响应,并在出现错误时退出代码。所以我要做的是

  1. 我只需在我的机器上使用VLC创建一个RTSP服务器,并连接到此服务器。显然,我可以成功地创建连接。
  2. 我通过简单地关闭VLC来停止服务器。因此,现在的手表狗功能应该收到正确的错误代码,并打印到屏幕上。但它从来没有那样做过。在Gstreamer的RTSP文档中,有一个名为gst_rtsp_connection_connect的函数,它接受一个连接和一个超时值,并且在文档中指出,如果超时为NULL,则该函数可以永远阻塞。所以我想,由于我在超时值字段中放置NULL,所以它从不超时,并且相信它仍然连接到服务器,因此永远不会进入任何一个监视狗函数。然而,当我申请的时候,比如说5秒的超时,它会在5-7秒后直接关闭连接,然后进入一些监视狗的函数。我不希望我的代码立即出现错误,即使有一个正确的连接,而且服务器仍然在工作,我只是希望它在服务器实际关闭并且超时时间已经过去时给出一些错误。我怎么才能解决这个问题?

下面是我的完整代码,包含和库位于代码的顶部:

代码语言:javascript
复制
/*
 * 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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-27 19:53:25

此代码正在按预期工作。我做错了测试。

我“停止”rtsp服务器的方式只是按VLC的“停止”按钮。这不会破坏服务器,服务器仍然存在,只是没有产生任何类型的流,而且由于服务器仍然存在,客户端仍然没有问题地连接到服务器上。当我关闭VLC以破坏服务器时,它就进入了正确的监视狗功能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37462119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档