用于取消/中止GStreamer TcpClient超时的方法

用于取消/中止GStreamer TcpClient超时的方法,gstreamer,Gstreamer,我正在开发一个应用程序,它使用GStreamer通过tcpclientsink元素发送运动JPEG视频流。该应用程序工作正常,除非我通过将连接从有线切换到无线或从无线切换到有线来中断网络。当这种情况发生时,tcpclientink元素似乎会等待15分钟才响应消息。如果在此期间尝试关闭应用程序,则会出现问题。以下是我观察到的情况: 使用GStreamer启动运动JPEG媒体流,使用TcpClientsk作为接收器。推送视频的代码在自己的线程中运行 在媒体流运行时,通过切换网络连接类型中断连接 开始

我正在开发一个应用程序,它使用GStreamer通过tcpclientsink元素发送运动JPEG视频流。该应用程序工作正常,除非我通过将连接从有线切换到无线或从无线切换到有线来中断网络。当这种情况发生时,tcpclientink元素似乎会等待15分钟才响应消息。如果在此期间尝试关闭应用程序,则会出现问题。以下是我观察到的情况:

  • 使用GStreamer启动运动JPEG媒体流,使用TcpClientsk作为接收器。推送视频的代码在自己的线程中运行
  • 在媒体流运行时,通过切换网络连接类型中断连接
  • 开始关闭应用程序。调用
    gst\u总线\u post(总线、gst\u消息\u新建\u eos(空))
    。这似乎被忽视了
  • 调用pthread_join以等待视频线程退出。它在15分钟内没有响应
  • 当我查看GST_调试消息时,我可以看到GStreamer tcpclientsink在写入时出错。它显然在重试时等待了15分钟

    有没有办法中止或取消与TCPClientink关联的超时?我是否可以发送其他消息来立即终止接收器

    我知道如果GStreamer没有像我希望的那样快速响应,我可以使用
    pthread\u timedjoin\u np
    pthread\u cancel
    杀死视频线程,但我更希望GStreamer尽可能干净地退出

    更新

    我应该提到我使用的是GStreamer 0.10.36。不幸的是,这可能只是该版本的一个bug。我看到1.2.x中的处理方式有了很大的改变。我仍然希望我正在使用的版本有一个解决方法

    我可以使用gst-launch-0.10重新创建此问题。这可能更重要 比必要的复杂,但对我来说很有效:

    启动三个脚本:

    • 以下内容在消费者和生产者之间传递数据:

      而[1] 做 gst-launch-0.10 tcpserversrc主机=0端口=${port_IN}!jpegdec!JPEG! tcpserversink端口=${port_OUT} 完成

    • 以下是消费者的脚本

      gst-launch-0.10 tcpclientsrc主机=${IP\u ADDR}端口=${port\u OUT}!jpegdec! ffmpegcolorspace!ximagesink

    • 以下是制作人的脚本

      gst-launch-0.10 ximagesrc!电子秤! 视频/x-raw-rgb,帧速率=1/1,宽度=640,高度=320!ffmpegcolorspace!JPEG ! TCPClientink主机=${IP_ADDR}端口=${port_IN}

    我在一台机器上运行前两个脚本,在第二台机器上运行第三个脚本 机器。当我将第二台机器上的网络连接从 通过有线和无线连接,TCPClientink需要15分钟以上的时间才能报告故障
    错误。

    为了解决这个问题,我必须修补GStreamer。我在gsttcpclientsink.c的
    gst\u tcp\u client\u sink\u start()函数中添加了指定发送超时的代码

    struct timeval timeout;
    timeout.tv_sec = 60;
    timeout.tv_usec = 0;
    ...
    setsockopt (this->sock_fd.fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
    
    现在,应用程序能够在一分钟内关闭(我的情况可以接受),即使网络在流视频时中断

    注意:1.2.1版看起来不会有问题,但我需要继续使用0.10.36