c++ - gstreamer 将元素添加到通过 gst_parse_launch 创建的管道中

标签 c++ gstreamer

我正在尝试创建一个管道,然后在创建它后添加一个视频接收器。我需要这样做,以便在将视频接收器提交到管道之前设置视频覆盖窗口 ID。

所以我有这个代码

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";
}

当我运行它时,它无法链接元素。

知道为什么会发生这种情况吗?我假设这是因为我试图将一个元素链接到“bin”而不是另一个元素。但是,我看不到任何有人向通过 gst_parse_launch 创建的管道添加元素的示例。

最佳答案

您无法将其连接到垃圾箱。您需要指定一个 pad - 或一个尝试从中选取 pad 的元素。因此,您需要遍历 bin 并从列表中选择 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

关于c++ - gstreamer 将元素添加到通过 gst_parse_launch 创建的管道中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52188272/

相关文章:

ffmpeg - 寻找最快的视频编码器,将网络摄像头流式传输到 ipad

python - 如何从视频中提取音频?

c++ - 无法设置本地 C++ 开发环境

c++ - 没有默认构造函数时初始化STL集合元素(不是指针)?

c++ - 线程安全 vector

encoding - gstreamer 无法将 UYVY 编码为 h264

h.264 - 使用 Gstreamer 从摄像头捕获 h.264 流

c++ - 在调试期间显示 cpu 缓存和寄存器内容

c++ - ReadDirectoryChangesW 不做任何事情 c++

gstreamer - 具有延迟的管道 Gstreamer 视频流