我正在开发一个使用GStreamer通过tcpclientsink元素发送Motion JPEG视频流的应用程序。该应用程序工作正常,除非我通过切换从有线到无线或无线到有线的连接来中断网络。当发生这种情况时,看起来tcpclientsink元素在响应消息之前等待15分钟。如果我在此期间尝试关闭应用程序,那将成为一个问题。这是我观察到的:
gst_bus_post(bus, gst_message_new_eos(NULL))
。这似乎被忽略了。当我查看GST_DEBUG消息时,我可以看到GStreamer tcpclientsink在写入时遇到错误。它在重试时显然等了15分钟。
有没有办法可以中止或取消与tcpclientsink相关的超时?我可以发送不同的消息以使接收器立即终止吗?
我知道如果GStreamer没有尽可能快地响应,我可以使用pthread_timedjoin_np
和pthread_cancel
来杀死视频线程,但我希望让GStreamer尽可能干净地退出。< / p>
更新
我应该提到我正在使用GStreamer 0.10.36。不幸的是,这可能只是该版本的错误。我看到处理在1.2.x中发生了很大的变化。我仍然希望我正在使用的版本有一个解决方法。
我能够使用gst-launch-0.10重新创建此问题。这可能更多 比必要复杂,但它对我有用:
启动三个脚本:
以下内容传递消费者和生产者之间的数据:
而[1] 做 gst-launch-0.10 tcpserversrc host = 0 port = $ {PORT_IN}! jpegdec! jpegenc! tcpserversink port = $ {PORT_OUT} 完成
以下是消费者的脚本
gst-launch-0.10 tcpclientsrc host = $ {IP_ADDR} port = $ {PORT_OUT}! jpegdec! ffmpegcolorspace! ximagesink
以下是制作人
的脚本gst-launch-0.10 ximagesrc!视频! video / x-raw-rgb,framerate = 1/1,width = 640,height = 320! ffmpegcolorspace! jpegenc ! tcpclientsink host = $ {IP_ADDR} port = $ {PORT_IN}
我在一台机器上运行前两个脚本,在第二台机器上运行第三个脚本 机。当我在第二台机器上切换网络连接时 有线连接到无线,tcpclientsink报告了15分钟 错误。