我有一个自定义管道,在 gstreamer 简写中看起来大致如下:
gst-launch-1.0 rtspsrc location=rtsp://<url-for-stream> ! rtph264depay ! h264parse ! imxvpudec ! *any-sink*
Run Code Online (Sandbox Code Playgroud)
这种类型的管道在 gst-launch-1.0 中工作得很好,因为它不需要正确地自行清理,但我需要使用直接 GST API 在我的 C++ 应用程序中使用它。这意味着我使用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 …Run Code Online (Sandbox Code Playgroud)