Ошибка связывания capsfilter с shmsink/jpegdec в GStreamer не происходит с помощью gst_parse_launch()C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка связывания capsfilter с shmsink/jpegdec в GStreamer не происходит с помощью gst_parse_launch()

Сообщение Anonymous »

Я создаю приложение, которое может транслировать мою веб-камеру в общую память с помощью плагина shmsink, а также получать его в другом месте с помощью shmsrc и регистрировать в файле.
Следующее работает отлично:
Создание источника shm: gst-launch-1.0 v4l2src device="/dev/video0" ! изображение/jpeg, ширина = 1280, высота = 720, частота кадров = 30/1! очередь ! shmsinkocket-path=/dev/shm/shm_test1
Получение общей памяти и ее регистрация в файле:
gst-launch-1.0 -e shmsrcocket-path=/ dev/shm/shm_test1 ! «изображение/jpeg, ширина = 1280, высота = 720, частота кадров = 30/1» ! jpegdec ! видеоконвертировать! «видео/x-raw,format=I420» ! авимукс ! filesink location=./test.avi
Теперь я хотел превратить это в реальный код. Мне удалось создать класс для потоковой передачи общей памяти. Но я не могу сделать вторую часть, использовать ее и записать. Это код, который постоянно дает сбой:

Код: Выделить всё

bool Recorder::createPipeline() {
gboolean status;
shmSrc = gst_element_factory_make("shmsrc", "shm_source");
jpegDec = gst_element_factory_make("jpegdec", "jpeg_decoder");
videoConvert = gst_element_factory_make("videoconvert", "video_converter");
aviMux = gst_element_factory_make("avimux", "avi_muxer");
filesink = gst_element_factory_make("filesink", "file_sink");

if (!shmSrc || !jpegDec || !videoConvert || !aviMux || !filesink) {
g_printerr("Failed to create elements\n");
return false;
}

g_object_set(shmSrc, "socket-path", shm_name.c_str(), NULL);
g_object_set(filesink, "location", output_file.c_str(), NULL);

GstCaps *caps = gst_caps_from_string("image/jpeg,width=1280,height=720,framerate=30/1");

pipeline = gst_pipeline_new("recorder_pipeline");

gst_bin_add_many(GST_BIN(pipeline), shmSrc, jpegDec, videoConvert, aviMux, filesink, NULL);

if (!gst_element_link_many(shmSrc, jpegDec, videoConvert, aviMux, filesink, NULL)) {
g_printerr("Failed to link elements\n");
gst_object_unref(pipeline);
return false;
}

status = link_elements_with_filter(shmSrc, jpegDec);
if (!status) {
g_printerr("Existing from createPipeline\n");
gst_caps_unref(caps);
gst_object_unref(pipeline);
return false;
}
gst_caps_unref(caps);
return true;
}

gboolean Recorder::link_elements_with_filter(GstElement* element1, GstElement* element2) {
gboolean link_ok;
GstCaps* caps;
caps = gst_caps_from_string("image/jpeg,width=1280,height=720,framerate=30/1");
link_ok = gst_element_link_filtered(element1, element2, caps);
gst_caps_unref(caps);
if (!link_ok) {
g_printerr("Failed to link elements\n");
}
return link_ok;
}
В частности, элементы ссылки с фильтром постоянно терпят неудачу, и я не понимаю, почему. Любая помощь будет оценена!
EDIT1: исправлено форматирование кода.
EDIT2: мне удалось заставить его работать с помощью gst_parse_launch(), но я этого не делаю. Не понимаю, почему я не могу привязать капсфильтр…

Код: Выделить всё

bool Recorder::createPipeline() {
std::string pipeline_description = "shmsrc socket-path=" + shm_name +
" ! image/jpeg,width=1280,height=720,framerate=30/1 ! jpegdec ! videoconvert ! avimux ! filesink location=" + output_file;

GError *error = nullptr;
pipeline = gst_parse_launch(pipeline_description.c_str(), &error);
if (!pipeline) {
g_printerr("Failed to create pipeline: %s\n", error->message);
g_error_free(error);
return false;
}

bus = gst_element_get_bus(pipeline);

return true;
}

void Recorder::start() {
running = true;
gst_element_set_state(pipeline, GST_STATE_PLAYING);
bus_watch_thread = std::thread(&Recorder::bus_watch_thread_func, this);
}
Почему связывание capsfilter не происходит при использовании динамической конвейерной обработки, но не при использовании статического конвейера gst_parse_launch()?

Подробнее здесь: https://stackoverflow.com/questions/787 ... pen-with-g
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»