#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» может объединять видео после завершения другого.