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

问题描述

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

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);

在EOS第27次运行时,它起作用了,但是只有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));控制回调,则不会出现此错误,但是在播放新视频时会创建一个新窗口,这不是我想要的。

1。什么原因导致太多打开的文件错误以及如何解决?

2。是否有更好的播放列表功能?

非常感谢!

解决方法

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

EGLImageKHR使用后不会被删除,因此meta.fd(文件描述符)在不断增加。

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...