我有一个自定义管道,在gstreamer缩写中大致如下:
gst-launch-1.0 rtspsrc location=rtsp://<url-for-stream> ! rtph264depay ! h264parse ! imxvpudec ! *any-sink*
- 任何音视频渲染器都可以,可以是fakesink、imxipusink或其他(我使用Freescale imx插件的imx6平台)。我可以输出到任何我想要的渲染器中,但问题却是相同的。
在gst-launch-1.0中,这种类型的管道可以正常工作,因为它不需要正确地清理自己,但我需要在我的C++应用程序中使用直接的GST API。这意味着我使用myPipeline = gst_pipeline_new("custom-pipeline")
,然后按名称分配每个插件、链接它们并运行管道。之后,我需要停止管道并调用gst_object_unref(myPipeline)
。在执行此操作时,我观察到有一些文件描述符被留下来。我之后需要再次启动管道,所以泄漏正在累加。这个操作需要经常进行,而泄漏的描述符会导致异常:
GLib-ERROR **: Creating pipes for GWakeup: Too many open files
我可以使用lsof
检测打开的文件...
lsof +E -aUc myGstApplication
lsof: netlink UNIX socket msg peer info error
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
myGstApplication 5943 root 3u unix 0xabfb6c00 0t0 11200335 type=STREAM
myGstApplication 5943 root 11u unix 0xd9d47180 0t0 11207020 type=STREAM
...根据运行时间的长短,可能会有更多...
myGstApplication 5943 root 50u unix 0xabe99080 0t0 11211987 type=STREAM
每当我使用unref()并重新构建pipeline时,似乎会得到两个新的“type=STREAM”文件描述符。
在lsof中看到描述符很好,但我不知道如何跟踪代码中这些文件的来源。例如,lsof输出是否能给我提供更好的调试信息? 我该如何追踪这些泄漏的真正来源并停止它们?一定有更好的方法...对吧?
我怀疑gstreamer pipeline元素中的rtspsrc与此有关,但rtspsrc本身是一个底层的gstreamer实现(udpsrcs、demuxers等等)。我不确定它是否是rtspsrc内部的错误,因为很多人似乎都在使用它而没有重现相同的问题。难道是我的应用程序代码中做了什么非常不明显的事情导致了这种行为吗?
非常感谢任何帮助!谢谢!
GST_DEBUG
选项吗?它可以为管道中的每个元素提供调试相关信息。 - gst0:00:57.383872340 6101 0x69b34fb0 警告 GST_PADS gstpad.c:3990:gst_pad_peer_query:<recv_rtp_sink_1:proxypad36> 无法发送粘性事件 0:00:57.389069340 6101 0x69b34830 警告 GST_PADS gstpad.c:3990:gst_pad_peer_query:<udpsrc14:src> 无法发送粘性事件
- adowdygst_bus_remove_watch
。 - Raber