Сбой списка воспроизведения Gstreamer appsink: слишком много файлов

#c #opengl-es #gstreamer

#c #opengl-es #gstreamer

Вопрос:

Я новичок в Gstreamer и пытаюсь создать функцию плейлиста с помощью Gstreamer в указанном окне GLES, это мои элементы конвейера:

 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), amp;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 раз, в 27-й раз EOS, появляется эта ошибка и приводит к сбою моей программы.

 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.Is есть лучший способ создать функцию плейлиста?

Большое спасибо!

Ответ №1:

Я сам нашел решение. в моем appsink информация преобразуется следующим образом: GstSample -> GstBuffer -> GstIonBufFdMeta -> EGLImageKHR

EGLImageKHR не удаляется после использования, поэтому meta.fd (дескриптор файла) постоянно увеличивается.

Я использую eglDestroyImageKHR в EOS для управления ImageKHR и решил свою проблему.

Существует также другой способ завершить функцию плейлиста, элемент «concat» может объединять видео после завершения другого.