用于取消/中止GStreamer TcpClient超时的方法
我正在开发一个应用程序,它使用GStreamer通过tcpclientsink元素发送运动JPEG视频流。该应用程序工作正常,除非我通过将连接从有线切换到无线或从无线切换到有线来中断网络。当这种情况发生时,tcpclientink元素似乎会等待15分钟才响应消息。如果在此期间尝试关闭应用程序,则会出现问题。以下是我观察到的情况:用于取消/中止GStreamer TcpClient超时的方法,gstreamer,Gstreamer,我正在开发一个应用程序,它使用GStreamer通过tcpclientsink元素发送运动JPEG视频流。该应用程序工作正常,除非我通过将连接从有线切换到无线或从无线切换到有线来中断网络。当这种情况发生时,tcpclientink元素似乎会等待15分钟才响应消息。如果在此期间尝试关闭应用程序,则会出现问题。以下是我观察到的情况: 使用GStreamer启动运动JPEG媒体流,使用TcpClientsk作为接收器。推送视频的代码在自己的线程中运行 在媒体流运行时,通过切换网络连接类型中断连接 开始
gst\u总线\u post(总线、gst\u消息\u新建\u eos(空))
。这似乎被忽视了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}
错误。为了解决这个问题,我必须修补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