Gstreamer appsink 播放列表失败:文件太多

Gstreamer appsink playlist failed : Too many files

我是 Gstreamer 的新手,我正在尝试在指定的 GLES window 上使用 Gstreamer 创建播放列表功能,这些是我的管道元素:

gstPipeline     = gst_pipeline_new ("_pipeline");
data.source     = gst_element_factory_make ("filesrc"   , "_source");
data.decoder    = gst_element_factory_make ("decodebin" , "_decoder");
data.qvconv     = gst_element_factory_make ("qvconv"    , "_qvconv");
data.capsfilter = gst_element_factory_make ("capsfilter", "_capsfilter");
data.queue      = gst_element_factory_make ("queue"     ,"_queue");
data.sink       = gst_element_factory_make ("appsink"   , "_appsink");

我通过 gst_app_sink_set_callbacks(GST_APP_SINK(data.sink), &appsinkCallback, this, nullptr);

设置回调

在每个 EOS 回调中我都这样做(我不确定这是正确的方法):

gst_element_set_state(gstPipeline, GST_STATE_NULL);
g_object_set (data.source, "location", "/home/root/short.mp4", NULL);
gst_element_set_state(gstPipeline, GST_STATE_PLAYING);

它有效,但只有 27 次,在 EOS 的第 27 次,这些错误出现并使我的程序崩溃。

GBM_ERR::msmgbm_bo_create(645)::ION_IOC_MAP failed on Metadata BO Err:
Too many open files

或有时

GBM_ERR::ion_open(118)::open /dev/ion failed!
Too many open files
GBM_ERR::msmgbm_device_create(1608)::Failed to open ION device
gbm_create_device(147): Device creation failed

如果我将 appsink 更改为 waylandsink、autovideosink 等,并使用 msg = gst_bus_timed_pop_filtered(bus,GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS)); 控制回调,则不会出现此错误,但它会在播放新视频时创建一个新的 window,这这不是我想要的。

1.What 是导致打开文件过多错误的原因,如何解决?

2.Is有没有更好的制作播放列表功能的方法?

非常感谢!

我自己找到了解决办法。 在我的 appsink 中,信息转换如下: GstSample -> GstBuffer -> GstIonBufFdMeta -> EGLImageKHR

EGLImageKHR 在使用后并没有被删除,所以meta.fd(文件描述符)在不断增加。

我在EOS中使用eglDestroyImageKHR来管理ImageKHR,解决了我的问题。

还有另一种方法可以完成播放列表功能, “concat”元素可以在另一个视频结束后连接视频。