gstreamer добавляет элемент в трубопровод, созданный с помощью gst_parse_launch - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь создать конвейер, а затем добавить видеосигнал после того, как я его создал. Мне нужно сделать это, чтобы я мог установить идентификатор окна оверлея видео для видеосинки, прежде чем отправить его в конвейер.

поэтому у меня есть этот код

pipeline = gst_parse_launch( "filesrc location=file.svg ! rsvgdec ! imagefreeze", &err );

sink = gst_element_factory_make( "glimagesink" );

gst_video_overlay_set_window_handle( GST_VIDEO_OVERLAY( sink ), this->winId() );

gst_bin_add_many( GST_BIN( pipeline ), sink, nullptr );

if ( !gst_element_link_many( pipeline, sink, nullptr ) )
{
    qCritical() << "Unable to link elements";
}

Когда я запускаю его, он не может связать элементы.

Любая идея, почему это происходит. Я предполагаю, что это потому, что я пытаюсь связать элемент с «корзиной», а не с другим элементом. Однако я не вижу примеров того, как кто-то добавляет элемент в конвейер, который был создан с помощью gst_parse_launch.

1 Ответ

0 голосов
/ 05 сентября 2018

Вы не можете подключить его к корзине. Вам нужно указать пэд - или элемент, из которого он пытается выбрать пэд. Поэтому вам нужно пройтись по корзине и выбрать элемент imagefreeze из списка.

Альтернативный подход - добавить слив и получить его из конвейера:

pipeline = gst_parse_launch( "filesrc location=file.svg ! rsvgdec ! imagefreeze ! glimagesink name=mysink", &err );

GstElement *sink = gst_bin_get_by_name( GST_BIN( pipeline ), "mysink" );

gst_video_overlay_set_window_handle( GST_VIDEO_OVERLAY( sink ), this->winId() );

gst_object_unref( sink );

У вас могут быть и серьезные проблемы, так как вам может потребоваться videoconvert для удовлетворения требований формата приемника.

filesrc location=file.svg ! rsvgdec ! imagefreeze ! videoconvert ! glimagesink

или, может быть

filesrc location=file.svg ! rsvgdec ! imagefreeze ! glupload ! glcolorconvert ! glimagesink
...