问题描述
我是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”元素可以将视频接连播放。