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”元素可以在另一个视频结束后连接视频。
我是 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”元素可以在另一个视频结束后连接视频。